added TwoSide to texface specials menu
added a menu for texface copy - Ctrl+C in Face Mode
This commit is contained in:
@@ -156,6 +156,7 @@
|
||||
#include "BSE_editipo_types.h"
|
||||
|
||||
#include "BDR_vpaint.h"
|
||||
#include "BDR_editface.h"
|
||||
#include "BDR_editmball.h"
|
||||
#include "BDR_editobject.h"
|
||||
#include "BDR_drawobject.h"
|
||||
@@ -187,7 +188,7 @@ void add_object_draw(int type) /* for toolbox or menus, only non-editmode stuff
|
||||
setcursor_space(SPACE_VIEW3D, CURSOR_STD);
|
||||
|
||||
if ELEM3(curarea->spacetype, SPACE_VIEW3D, SPACE_BUTS, SPACE_INFO) {
|
||||
if (G.obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); // freedata, and undo
|
||||
if (G.obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* freedata, and undo */
|
||||
ob= add_object(type);
|
||||
set_active_base(BASACT);
|
||||
base_init_from_view3d(BASACT, G.vd);
|
||||
@@ -401,7 +402,7 @@ static int return_editlattice_indexar(int *tot, int **indexar, float *cent)
|
||||
BPoint *bp;
|
||||
int *index, nr, totvert=0, a;
|
||||
|
||||
// count
|
||||
/* count */
|
||||
a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
|
||||
bp= editLatt->def;
|
||||
while(a--) {
|
||||
@@ -441,7 +442,7 @@ static void select_editlattice_hook(HookModifierData *hmd)
|
||||
BPoint *bp;
|
||||
int index=0, nr=0, a;
|
||||
|
||||
// count
|
||||
/* count */
|
||||
a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
|
||||
bp= editLatt->def;
|
||||
while(a--) {
|
||||
@@ -625,7 +626,7 @@ void add_hook(void)
|
||||
|
||||
/* preconditions */
|
||||
|
||||
if(mode==2) { // selected object
|
||||
if(mode==2) { /* selected object */
|
||||
Base *base= FIRSTBASE;
|
||||
while(base) {
|
||||
if TESTBASELIB(base) {
|
||||
@@ -645,7 +646,7 @@ void add_hook(void)
|
||||
int maxlen=0, a, nr;
|
||||
char *cp;
|
||||
|
||||
// make pupmenu with hooks
|
||||
/* make pupmenu with hooks */
|
||||
for(md=G.obedit->modifiers.first; md; md= md->next) {
|
||||
if (md->type==eModifierType_Hook)
|
||||
maxlen+=32;
|
||||
@@ -728,7 +729,7 @@ void add_hook(void)
|
||||
BLI_insertlinkbefore(&G.obedit->modifiers, md, hmd);
|
||||
sprintf(hmd->modifier.name, "Hook-%s", ob->id.name+2);
|
||||
}
|
||||
else if (hmd->indexar) MEM_freeN(hmd->indexar); // reassign, hook was set
|
||||
else if (hmd->indexar) MEM_freeN(hmd->indexar); /* reassign, hook was set */
|
||||
|
||||
hmd->object= ob;
|
||||
hmd->indexar= indexar;
|
||||
@@ -750,15 +751,15 @@ void add_hook(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(mode==3) { // remove
|
||||
else if(mode==3) { /* remove */
|
||||
BLI_remlink(&G.obedit->modifiers, md);
|
||||
modifier_free(md);
|
||||
}
|
||||
else if(mode==5) { // select
|
||||
else if(mode==5) { /* select */
|
||||
hook_select(hmd);
|
||||
}
|
||||
else if(mode==6) { // clear offset
|
||||
where_is_object(ob); // ob is hook->parent
|
||||
else if(mode==6) { /* clear offset */
|
||||
where_is_object(ob); /* ob is hook->parent */
|
||||
|
||||
Mat4Invert(ob->imat, ob->obmat);
|
||||
/* this call goes from right to left... */
|
||||
@@ -990,7 +991,7 @@ void clear_object(char mode)
|
||||
ob= base->object;
|
||||
|
||||
if(ob->flag & OB_POSEMODE) {
|
||||
// no test if we got armature; could be in future...
|
||||
/* no test if we got armature; could be in future... */
|
||||
clear_armature(ob, mode);
|
||||
}
|
||||
else if((G.f & G_WEIGHTPAINT)==0) {
|
||||
@@ -1228,7 +1229,7 @@ void make_vertex_parent(void)
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
|
||||
DAG_scene_sort(G.scene);
|
||||
// BIF_undo_push(str); not, conflicts with editmode undo...
|
||||
/* BIF_undo_push(str); not, conflicts with editmode undo... */
|
||||
}
|
||||
|
||||
int test_parent_loop(Object *par, Object *ob)
|
||||
@@ -1289,7 +1290,7 @@ void make_parent(void)
|
||||
mode= PAROBJECT;
|
||||
if((cu->flag & CU_PATH)==0) {
|
||||
cu->flag |= CU_PATH|CU_FOLLOW;
|
||||
makeDispListCurveTypes(par, 0); // force creation of path data
|
||||
makeDispListCurveTypes(par, 0); /* force creation of path data */
|
||||
}
|
||||
else cu->flag |= CU_FOLLOW;
|
||||
}
|
||||
@@ -1658,7 +1659,7 @@ void check_editmode(int type)
|
||||
|
||||
if (G.obedit==0 || G.obedit->type==type) return;
|
||||
|
||||
exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); // freedata, and undo
|
||||
exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* freedata, and undo */
|
||||
}
|
||||
|
||||
/* 0 == do centre, 1 == centre new, 2 == centre cursor */
|
||||
@@ -1670,8 +1671,8 @@ void docentre(int centremode)
|
||||
Object *ob;
|
||||
Mesh *me, *tme;
|
||||
Curve *cu;
|
||||
// BezTriple *bezt;
|
||||
// BPoint *bp;
|
||||
/* BezTriple *bezt;
|
||||
BPoint *bp; */
|
||||
Nurb *nu, *nu1;
|
||||
EditVert *eve;
|
||||
float cent[3], centn[3], min[3], max[3], omat[3][3];
|
||||
@@ -2000,8 +2001,8 @@ void split_font()
|
||||
adduplicate(1, U.dupflag);
|
||||
cu= OBACT->data;
|
||||
cu->sepchar = i+1;
|
||||
text_to_curve(OBACT, 0); // pass 1: only one letter, adapt position
|
||||
text_to_curve(OBACT, 0); // pass 2: remake
|
||||
text_to_curve(OBACT, 0); /* pass 1: only one letter, adapt position */
|
||||
text_to_curve(OBACT, 0); /* pass 2: remake */
|
||||
freedisplist(&OBACT->disp);
|
||||
makeDispListCurveTypes(OBACT, 0);
|
||||
|
||||
@@ -2035,7 +2036,7 @@ void special_editmenu(void)
|
||||
|
||||
if(me==0 || me->tface==0) return;
|
||||
|
||||
nr= pupmenu("Specials%t|Set Tex%x1| Shared%x2| Light%x3| Invisible%x4| Collision%x5|Clr Tex%x6| Shared%x7| Light%x8| Invisible%x9| Collision%x10");
|
||||
nr= pupmenu("Specials%t|Set Tex%x1| Shared%x2| Light%x3| Invisible%x4| Collision%x5| TwoSide%x6|Clr Tex%x7| Shared%x8| Light%x9| Invisible%x10| Collision%x11| TwoSide%x12");
|
||||
|
||||
for(a=me->totface, tface= me->tface; a>0; a--, tface++) {
|
||||
if(tface->flag & SELECT) {
|
||||
@@ -2051,17 +2052,21 @@ void special_editmenu(void)
|
||||
case 5:
|
||||
tface->mode |= TF_DYNAMIC; break;
|
||||
case 6:
|
||||
tface->mode |= TF_TWOSIDE; break;
|
||||
case 7:
|
||||
tface->mode &= ~TF_TEX;
|
||||
tface->tpage= 0;
|
||||
break;
|
||||
case 7:
|
||||
tface->mode &= ~TF_SHAREDCOL; break;
|
||||
case 8:
|
||||
tface->mode &= ~TF_LIGHT; break;
|
||||
tface->mode &= ~TF_SHAREDCOL; break;
|
||||
case 9:
|
||||
tface->mode &= ~TF_INVISIBLE; break;
|
||||
tface->mode &= ~TF_LIGHT; break;
|
||||
case 10:
|
||||
tface->mode &= ~TF_INVISIBLE; break;
|
||||
case 11:
|
||||
tface->mode &= ~TF_DYNAMIC; break;
|
||||
case 12:
|
||||
tface->mode &= ~TF_TWOSIDE; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2103,20 +2108,20 @@ void special_editmenu(void)
|
||||
else {
|
||||
Base *base, *base_select= NULL;
|
||||
|
||||
// Get the active object mesh.
|
||||
/* Get the active object mesh. */
|
||||
Mesh *me= get_mesh(ob);
|
||||
|
||||
// Booleans, if the active object is a mesh...
|
||||
/* Booleans, if the active object is a mesh... */
|
||||
if (me && ob->id.lib==NULL) {
|
||||
|
||||
// Bring up a little menu with the boolean operation choices on.
|
||||
/* Bring up a little menu with the boolean operation choices on. */
|
||||
nr= pupmenu("Boolean Tools%t|Intersect%x1|Union%x2|Difference%x3|Add Intersect Modifier%x4|Add Union Modifier%x5|Add Difference Modifier%x6");
|
||||
|
||||
if (nr > 0) {
|
||||
// user has made a choice of a menu element.
|
||||
// All of the boolean functions require 2 mesh objects
|
||||
// we search through the object list to find the other
|
||||
// selected item and make sure it is distinct and a mesh.
|
||||
/* user has made a choice of a menu element.
|
||||
All of the boolean functions require 2 mesh objects
|
||||
we search through the object list to find the other
|
||||
selected item and make sure it is distinct and a mesh. */
|
||||
|
||||
for(base= FIRSTBASE; base; base= base->next) {
|
||||
if TESTBASELIB(base) {
|
||||
@@ -2200,7 +2205,7 @@ void special_editmenu(void)
|
||||
break;
|
||||
|
||||
case 12: /* smooth */
|
||||
//if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
|
||||
/* if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return; */
|
||||
fac= 1.0f;
|
||||
if(fbutton(&fac, 0.0f, 5.0f, 10, 10, "Smooth:")==0) return;
|
||||
fac= 0.292f*fac;
|
||||
@@ -2449,7 +2454,7 @@ void convertmenu(void)
|
||||
|
||||
/* make new mesh data from the original copy */
|
||||
dm= mesh_get_derived_final(ob1, &needsfree);
|
||||
//dm= mesh_create_derived_no_deform(ob1, NULL); this was called original (instead of get_derived). man o man why! (ton)
|
||||
/* dm= mesh_create_derived_no_deform(ob1, NULL); this was called original (instead of get_derived). man o man why! (ton) */
|
||||
|
||||
DM_to_mesh(dm, ob1->data);
|
||||
|
||||
@@ -2510,14 +2515,14 @@ void convertmenu(void)
|
||||
cu= ob->data;
|
||||
|
||||
dl= cu->disp.first;
|
||||
if(dl==0) makeDispListCurveTypes(ob, 0); // force creation
|
||||
if(dl==0) makeDispListCurveTypes(ob, 0); /* force creation */
|
||||
|
||||
nurbs_to_mesh(ob); /* also does users */
|
||||
|
||||
/* texspace and normals */
|
||||
BASACT= base;
|
||||
enter_editmode(EM_WAITCURSOR);
|
||||
exit_editmode(EM_FREEDATA|EM_WAITCURSOR); // freedata, but no undo
|
||||
exit_editmode(EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */
|
||||
BASACT= basact;
|
||||
}
|
||||
}
|
||||
@@ -2561,7 +2566,7 @@ void convertmenu(void)
|
||||
/* So we can see the wireframe */
|
||||
BASACT= basen;
|
||||
enter_editmode(EM_WAITCURSOR);
|
||||
exit_editmode(EM_FREEDATA|EM_WAITCURSOR); // freedata, but no undo
|
||||
exit_editmode(EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */
|
||||
BASACT= basact;
|
||||
|
||||
/* If the original object is active then make this object active */
|
||||
@@ -2808,50 +2813,6 @@ static void copymenu_modifiers(Object *ob)
|
||||
BIF_undo_push("Copy modifiers");
|
||||
}
|
||||
|
||||
void copy_attr_menu()
|
||||
{
|
||||
Object *ob;
|
||||
short event;
|
||||
char str[512];
|
||||
|
||||
/* If you change this menu, don't forget to update the menu in header_view3d.c
|
||||
* view3d_edit_object_copyattrmenu() and in toolbox.c
|
||||
*/
|
||||
strcpy(str, "Copy Attributes %t|Location%x1|Rotation%x2|Size%x3|Drawtype%x4|Time Offset%x5|Dupli%x6|%l|Mass%x7|Damping%x8|Properties%x9|Logic Bricks%x10|%l");
|
||||
|
||||
if(!(ob=OBACT)) return;
|
||||
|
||||
strcat (str, "|Object Constraints%x22");
|
||||
strcat (str, "|NLA Strips%x26");
|
||||
|
||||
if ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL) {
|
||||
strcat(str, "|Texture Space%x17");
|
||||
}
|
||||
|
||||
if(ob->type == OB_FONT) strcat(str, "|Font Settings%x18|Bevel Settings%x19");
|
||||
if(ob->type == OB_CURVE) strcat(str, "|Bevel Settings%x19|UV Orco%x28");
|
||||
|
||||
if((ob->type == OB_FONT) || (ob->type == OB_CURVE)) {
|
||||
strcat(str, "|Curve Resolution%x25");
|
||||
}
|
||||
|
||||
if(ob->type==OB_MESH){
|
||||
strcat(str, "|Subdiv%x21|AutoSmooth%x27");
|
||||
}
|
||||
|
||||
if( give_parteff(ob) ) strcat(str, "|Particle Settings%x20");
|
||||
|
||||
if(ob->soft) strcat(str, "|Soft Body Settings%x23");
|
||||
|
||||
if(ob->type==OB_MESH || ob->type==OB_CURVE){
|
||||
strcat(str, "|Modifiers ...%x24");
|
||||
}
|
||||
|
||||
event= pupmenu(str);
|
||||
if(event<= 0) return;
|
||||
|
||||
copy_attr(event);
|
||||
}
|
||||
|
||||
void copy_attr(short event)
|
||||
{
|
||||
@@ -2984,7 +2945,7 @@ void copy_attr(short event)
|
||||
cu1->vfontbi= cu->vfontbi;
|
||||
id_us_plus((ID *)cu1->vfontbi);
|
||||
|
||||
text_to_curve(base->object, 0); // needed?
|
||||
text_to_curve(base->object, 0); /* needed? */
|
||||
|
||||
|
||||
strcpy(cu1->family, cu->family);
|
||||
@@ -3137,6 +3098,97 @@ void copy_attr(short event)
|
||||
BIF_undo_push("Copy Attributes");
|
||||
}
|
||||
|
||||
void copy_attr_tface(short event)
|
||||
{
|
||||
/* Face Select Mode */
|
||||
Object *ob= OBACT;
|
||||
Mesh *me= get_mesh(ob);
|
||||
TFace *tface;
|
||||
TFace *activetf= get_active_tface();
|
||||
int a;
|
||||
|
||||
if(activetf==NULL) return;
|
||||
|
||||
for(a=me->totface, tface= me->tface; a>0; a--, tface++) {
|
||||
if(tface->flag & SELECT) {
|
||||
switch(event) {
|
||||
case 1:
|
||||
tface->tpage = activetf->tpage;
|
||||
tface->tile= activetf->tile;
|
||||
tface->mode = activetf->mode & TF_TEX;
|
||||
break;
|
||||
case 2:
|
||||
memcpy(tface->uv, activetf->uv, sizeof(tface->uv)); break;
|
||||
case 3:
|
||||
memcpy(tface->col, activetf->col, sizeof(tface->col)); break;
|
||||
case 4:
|
||||
tface->mode = activetf->mode; break;
|
||||
case 5:
|
||||
tface->transp= activetf->transp; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
|
||||
allqueue(REDRAWVIEW3D, 0);
|
||||
allqueue(REDRAWBUTSEDIT, 0);
|
||||
BIF_undo_push("Copy texture face");
|
||||
}
|
||||
|
||||
void copy_attr_menu()
|
||||
{
|
||||
Object *ob;
|
||||
short event;
|
||||
|
||||
if(!(ob=OBACT)) return;
|
||||
|
||||
if(G.f & G_FACESELECT) {
|
||||
event= pupmenu("Copy Active Texface%t|Image%x1|UV Coords%x2|Color%x3|Mode%x4|Transp%x5");
|
||||
copy_attr_tface(event);
|
||||
|
||||
} else { /* Object Mode */
|
||||
|
||||
/* If you change this menu, don't forget to update the menu in header_view3d.c
|
||||
* view3d_edit_object_copyattrmenu() and in toolbox.c
|
||||
*/
|
||||
|
||||
char str[512];
|
||||
|
||||
strcpy(str, "Copy Attributes %t|Location%x1|Rotation%x2|Size%x3|Drawtype%x4|Time Offset%x5|Dupli%x6|%l|Mass%x7|Damping%x8|Properties%x9|Logic Bricks%x10|%l");
|
||||
|
||||
strcat (str, "|Object Constraints%x22");
|
||||
strcat (str, "|NLA Strips%x26");
|
||||
|
||||
if ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL) {
|
||||
strcat(str, "|Texture Space%x17");
|
||||
}
|
||||
|
||||
if(ob->type == OB_FONT) strcat(str, "|Font Settings%x18|Bevel Settings%x19");
|
||||
if(ob->type == OB_CURVE) strcat(str, "|Bevel Settings%x19|UV Orco%x28");
|
||||
|
||||
if((ob->type == OB_FONT) || (ob->type == OB_CURVE)) {
|
||||
strcat(str, "|Curve Resolution%x25");
|
||||
}
|
||||
|
||||
if(ob->type==OB_MESH){
|
||||
strcat(str, "|Subdiv%x21|AutoSmooth%x27");
|
||||
}
|
||||
|
||||
if( give_parteff(ob) ) strcat(str, "|Particle Settings%x20");
|
||||
|
||||
if(ob->soft) strcat(str, "|Soft Body Settings%x23");
|
||||
|
||||
if(ob->type==OB_MESH || ob->type==OB_CURVE){
|
||||
strcat(str, "|Modifiers ...%x24");
|
||||
}
|
||||
|
||||
event= pupmenu(str);
|
||||
if(event<= 0) return;
|
||||
|
||||
copy_attr(event);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void link_to_scene(unsigned short nr)
|
||||
{
|
||||
Scene *sce= (Scene*) BLI_findlink(&G.main->scene, G.curscreen->scenenr-1);
|
||||
@@ -3370,7 +3422,7 @@ void make_duplilist_real()
|
||||
{
|
||||
Base *base, *basen;
|
||||
Object *ob;
|
||||
// extern ListBase duplilist;
|
||||
/* extern ListBase duplilist; */
|
||||
|
||||
if(okee("Make dupli objects real")==0) return;
|
||||
|
||||
@@ -3486,8 +3538,8 @@ void apply_object()
|
||||
/* texspace and normals */
|
||||
BASACT= base;
|
||||
enter_editmode(EM_WAITCURSOR);
|
||||
BIF_undo_push("Applied object"); // editmode undo itself
|
||||
exit_editmode(EM_FREEDATA|EM_WAITCURSOR); // freedata, but no undo
|
||||
BIF_undo_push("Applied object"); /* editmode undo itself */
|
||||
exit_editmode(EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */
|
||||
BASACT= basact;
|
||||
|
||||
}
|
||||
@@ -3554,8 +3606,8 @@ void apply_object()
|
||||
/* texspace and normals */
|
||||
BASACT= base;
|
||||
enter_editmode(EM_WAITCURSOR);
|
||||
BIF_undo_push("Applied object"); // editmode undo itself
|
||||
exit_editmode(EM_FREEDATA|EM_WAITCURSOR); // freedata, but no undo
|
||||
BIF_undo_push("Applied object"); /* editmode undo itself */
|
||||
exit_editmode(EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */
|
||||
BASACT= basact;
|
||||
}
|
||||
}
|
||||
@@ -4236,7 +4288,7 @@ void make_local(int mode)
|
||||
if(G.scene->id.lib) return;
|
||||
|
||||
if(mode==3) {
|
||||
all_local(NULL); // NULL is all libs
|
||||
all_local(NULL); /* NULL is all libs */
|
||||
allqueue(REDRAWALL, 0);
|
||||
return;
|
||||
}
|
||||
@@ -4407,7 +4459,7 @@ void adduplicate(int mode, int dupflag)
|
||||
|
||||
ob= base->object;
|
||||
if(ob->flag & OB_POSEMODE) {
|
||||
; // nothing?
|
||||
; /* nothing? */
|
||||
}
|
||||
else {
|
||||
obn= copy_object(ob);
|
||||
|
||||
Reference in New Issue
Block a user