Mercurial > hg > forks > yadex
changeset 66:794b7bb40d7f
Initial work on cleaning up and improving the texture alignment functionality.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 26 Sep 2011 10:16:55 +0300 |
parents | 2537585c2b93 |
children | e74736fa160d |
files | src/editobj.cc src/l_align.cc src/yadex.h |
diffstat | 3 files changed, 151 insertions(+), 176 deletions(-) [+] |
line wrap: on
line diff
--- a/src/editobj.cc Mon Sep 26 09:47:41 2011 +0300 +++ b/src/editobj.cc Mon Sep 26 10:16:55 2011 +0300 @@ -655,12 +655,99 @@ } } +static void AlignTexturesMenu(int xc, int yc, int mode, SelPtr *list) +{ + int opt_sdef; + bool opt_offset = false, opt_check = false; + + switch (vDisplayMenu(xc, yc, + mode ? "Aligning textures (Y offset) :" : "Aligning textures (X offset) :", + + " Sidedef 1, Check for identical textures. ", YK_, 0, + " Sidedef 1, As above, but with initial offset.", YK_, 0, + " Sidedef 1, No texture checking. ", YK_, 0, + " Sidedef 1, As above, but with initial offset.", YK_, 0, + " Sidedef 2, Check for identical textures. ", YK_, 0, + " Sidedef 2, As above, but with initial offset.", YK_, 0, + " Sidedef 2, No texture checking. ", YK_, 0, + " Sidedef 2, As above, but with initial offset.", YK_, 0, + NULL)) + { + case 1: /* Sidedef 1 with checking for same textures */ + opt_sdef = 1; + opt_check = true; + opt_offset = false; + break; + + case 2: /* Sidedef 1 as above, but with inital offset */ + opt_sdef = 1; + opt_check = true; + opt_offset = true; + break; + + case 3: /* Sidedef 1 regardless of same textures */ + opt_sdef = 1; + opt_check = false; + opt_offset = false; + break; + + case 4: /* Sidedef 1 as above, but with inital offset */ + opt_sdef = 1; + opt_check = false; + opt_offset = true; + break; + + case 5: /* Sidedef 2 with checking for same textures */ + opt_sdef = 2; + opt_check = true; + opt_offset = false; + break; + + case 6: /* Sidedef 2 as above, but with initial offset */ + opt_sdef = 2; + opt_check = true; + opt_offset = true; + break; + + case 7: /* Sidedef 2 regardless of same textures */ + opt_sdef = 2; + opt_check = false; + opt_offset = false; + break; + + case 8: /* Sidedef 2 as above, but with initial offset */ + opt_sdef = 2; + opt_check = false; + opt_offset = true; + break; + + default: + return; + } + + /* Select all sidedefs */ + SelPtr sdlist = NULL, cur; + for (cur = *list; cur; cur = cur->next) + { + if (opt_sdef == 1 && LineDefs[cur->objnum].sidedef1 >= 0) + SelectObject(&sdlist, LineDefs[cur->objnum].sidedef1); + + if (opt_sdef == 2 && LineDefs[cur->objnum].sidedef2 >= 0) + SelectObject(&sdlist, LineDefs[cur->objnum].sidedef2); + } + + if (mode == 0) + /* Align the textures along the X axis (width) */ + AlignTexturesX(&sdlist, opt_sdef, opt_check, opt_offset, -1); + else + /* Align the textures along the Y axis (height) */ + AlignTexturesY(&sdlist, opt_sdef, opt_check); +} /* - menu of miscellaneous operations -*/ - + * Menu of miscellaneous operations + */ void MiscOperations(int objtype, SelPtr * list, int val) /* SWAP! */ { char msg[80]; @@ -873,19 +960,7 @@ // Linedef -> Align textures vertically if (objtype == OBJ_LINEDEFS) { - SelPtr sdlist, cur; - - /* select all sidedefs */ - sdlist = 0; - for (cur = *list; cur; cur = cur->next) - { - if (LineDefs[cur->objnum].sidedef1 >= 0) - SelectObject(&sdlist, LineDefs[cur->objnum].sidedef1); - if (LineDefs[cur->objnum].sidedef2 >= 0) - SelectObject(&sdlist, LineDefs[cur->objnum].sidedef2); - } - /* align the textures along the Y axis (height) */ - AlignTexturesY(&sdlist); + AlignTexturesMenu(250, 110, 1, list); } // Sector -> Brighten or darken else if (objtype == OBJ_SECTORS) @@ -898,19 +973,7 @@ // Linedef -> Align texture horizontally if (objtype == OBJ_LINEDEFS) { - SelPtr sdlist, cur; - - /* select all sidedefs */ - sdlist = 0; - for (cur = *list; cur; cur = cur->next) - { - if (LineDefs[cur->objnum].sidedef1 >= 0) - SelectObject(&sdlist, LineDefs[cur->objnum].sidedef1); - if (LineDefs[cur->objnum].sidedef2 >= 0) - SelectObject(&sdlist, LineDefs[cur->objnum].sidedef2); - } - /* align the textures along the X axis (width) */ - AlignTexturesX(&sdlist); + AlignTexturesMenu(250, 110, 0, list); } // Sector -> Unlink room else if (objtype == OBJ_SECTORS)
--- a/src/l_align.cc Mon Sep 26 09:47:41 2011 +0300 +++ b/src/l_align.cc Mon Sep 26 10:16:55 2011 +0300 @@ -43,7 +43,7 @@ get the absolute height from which the textures are drawn */ -int GetTextureRefHeight(int sidedef) /* SWAP! */ +int GetTextureRefHeight(int sidedef) { int l, sector; int otherside = OBJ_NO_NONE; @@ -100,7 +100,7 @@ way to select only one side of a two-sided wall. */ -void AlignTexturesY(SelPtr * sdlist) /* SWAP! */ +void AlignTexturesY(SelPtr * sdlist, int opt_sdef, bool opt_check) { int h, refh; @@ -119,6 +119,7 @@ SideDefs[(*sdlist)->objnum].yoff = (refh - h) % 128; UnSelectObject(sdlist, (*sdlist)->objnum); } + MadeChanges = 1; } @@ -143,7 +144,7 @@ the following needs to be altered radically. */ -void AlignTexturesX(SelPtr * sdlist) /* SWAP! */ +void AlignTexturesX(SelPtr * sdlist, int opt_sdef, bool opt_check, bool opt_offset, int opt_mode) { /* FIRST texture name used in the highlited objects */ char texname[WAD_TEX_NAME + 1]; @@ -156,13 +157,6 @@ i16 texlength; /* the length of texture to format to */ int length; /* length of linedef under scrutiny */ i16 dummy; /* holds useless data */ - int type_off; /* do we have an initial offset to use */ - int type_tex; /* do we check for same textures */ - int type_sd; /* do we align sidedef 1 or sidedef 2 */ - - type_sd = 0; /* which sidedef to align, 1=SideDef1, 2=SideDef2 */ - type_tex = 0; /* do we test for similar textures, 0 = no, 1 = yes */ - type_off = 0; /* do we have an inital offset, 0 = no, 1 = yes */ vert1 = -1; vert2 = -1; /* 1st time round the while loop the -1 value is needed */ @@ -170,129 +164,53 @@ xoffset = 0; useroffset = 0; - switch (vDisplayMenu(250, 110, - "Aligning textures (X offset) :", - " Sidedef 1, Check for identical textures. ", YK_, 0, - " Sidedef 1, As above, but with initial offset.", YK_, 0, - " Sidedef 1, No texture checking. ", YK_, 0, - " Sidedef 1, As above, but with initial offset.", YK_, 0, - " Sidedef 2, Check for identical textures. ", YK_, 0, - " Sidedef 2, As above, but with initial offset.", YK_, 0, - " Sidedef 2, No texture checking. ", YK_, 0, - " Sidedef 2, As above, but with initial offset.", YK_, 0, - NULL)) - { - case 1: /* Sidedef 1 with checking for same textures */ - type_sd = 1; - type_tex = 1; - type_off = 0; - break; - - case 2: /* Sidedef 1 as above, but with inital offset */ - type_sd = 1; - type_tex = 1; - type_off = 1; - break; - - case 3: /* Sidedef 1 regardless of same textures */ - type_sd = 1; - type_tex = 0; - type_off = 0; - break; - - case 4: /* Sidedef 1 as above, but with inital offset */ - type_sd = 1; - type_tex = 0; - type_off = 1; - break; - - case 5: /* Sidedef 2 with checking for same textures */ - type_sd = 2; - type_tex = 1; - type_off = 0; - break; - - case 6: /* Sidedef 2 as above, but with initial offset */ - type_sd = 2; - type_tex = 1; - type_off = 1; - break; - - case 7: /* Sidedef 2 regardless of same textures */ - type_sd = 2; - type_tex = 0; - type_off = 0; - break; - - case 8: /* Sidedef 2 as above, but with initial offset */ - type_sd = 2; - type_tex = 0; - type_off = 1; - break; - default: - return; - } - if (!*sdlist) { Notify(-1, -1, "Error in AlignTexturesX: list is empty", 0); return; } - /* throw out all 1/2nd SideDefs until a 1/2st is found */ - ldef = 0; - sdef = (*sdlist)->objnum; - - while (ldef <= NumLineDefs && ( - (type_sd == 1 && LineDefs[ldef].sidedef1 != sdef) || - (type_sd == 2 && LineDefs[ldef].sidedef2 != sdef) - )) + if (opt_mode == -1) { - ldef++; - if ((type_sd == 1 && LineDefs[ldef].sidedef2 == sdef) || - (type_sd == 2 && LineDefs[ldef].sidedef1 == sdef)) + /* No defined mode, we will try to "guess" which texture + * the user wants to align ... and choose the operating mode + * based on that. + */ + SDPtr pdef = &SideDefs[(*sdlist)->objnum]; + if (ValidTextureName(pdef->tex3)) + { + strncpy(texname, pdef->tex3, WAD_TEX_NAME); + opt_mode = 3; + } + else if (ValidTextureName(pdef->tex2)) { - int tmp = (*sdlist)->objnum; - UnSelectObject(sdlist, tmp); - if (!*sdlist) - { - sprintf(errormessage, "*sdlist == NULL while unselecting sidedefs (type_sd=%d, sdef=%d, ldef=%d, tmp=%d).", - type_sd, sdef, ldef, tmp); - Notify(-1, -1, errormessage, 0); - return; - } - sdef = (*sdlist)->objnum; - ldef = 0; + strncpy(texname, pdef->tex2, WAD_TEX_NAME); + opt_mode = 2; + } + else if (ValidTextureName(pdef->tex1)) + { + strncpy(texname, pdef->tex1, WAD_TEX_NAME); + opt_mode = 1; } - } - - /* get texture name of the sidedef in the *sdlist) */ - SDPtr pdef = &SideDefs[(*sdlist)->objnum]; - int mode = -1; - if (ValidTextureName(pdef->tex3)) - { - strncpy(texname, pdef->tex3, WAD_TEX_NAME); - mode = 3; - } - else if (ValidTextureName(pdef->tex2)) - { - strncpy(texname, pdef->tex2, WAD_TEX_NAME); - mode = 2; - } - else if (ValidTextureName(pdef->tex1)) - { - strncpy(texname, pdef->tex1, WAD_TEX_NAME); - mode = 1; + else + { + sprintf(errormessage, "No texture(s) for sidedef #%d.", + (*sdlist)->objnum); + Notify(-1, -1, errormessage, 0); + return; + } } else { - sprintf(errormessage, "No texture(s) for sidedef #%d.", - (*sdlist)->objnum); - Notify(-1, -1, errormessage, 0); - return; + /* Find first sidedef that has desired texture set */ + + // FIXME! Not implemented yet ... -ccr } - GetWallTextureSize(&texlength, &dummy, texname); /* clunky, but it works */ + /* Get texture width, do some sanity checking as the + * WAD reading may fail. + */ + GetWallTextureSize(&texlength, &dummy, texname); if (texlength < 4) { @@ -302,8 +220,8 @@ return; } - /* get initial offset to use (if required) */ - if (type_off == 1) + /* Get initial offset to use, if requested */ + if (opt_offset) { int x0, y0, key; char prompt[80]; @@ -331,7 +249,7 @@ ldef = 0; sdef = (*sdlist)->objnum; - if (type_sd == 1) /* throw out all 2nd SideDefs untill a 1st is found */ + if (opt_sdef == 1) /* throw out all 2nd SideDefs untill a 1st is found */ { while (LineDefs[ldef].sidedef1 != sdef && ldef <= NumLineDefs) { @@ -341,7 +259,7 @@ UnSelectObject(sdlist, (*sdlist)->objnum); if (*sdlist == NULL) { - sprintf(errormessage, "Error in type_sd==1, *sdlist == NULL"); + sprintf(errormessage, "Error in opt_sdef==1, *sdlist == NULL"); Notify(-1, -1, errormessage, 0); return; } @@ -351,7 +269,7 @@ } } else - if (type_sd == 2) /* throw out all 1st SideDefs untill a 2nd is found */ + if (opt_sdef == 2) /* throw out all 1st SideDefs untill a 2nd is found */ { while (LineDefs[ldef].sidedef2 != sdef && ldef <= NumLineDefs) { @@ -361,7 +279,7 @@ UnSelectObject(sdlist, (*sdlist)->objnum); if (*sdlist == NULL) { - sprintf(errormessage, "Error in type_sd==2, *sdlist == NULL"); + sprintf(errormessage, "Error in opt_sdef==2, *sdlist == NULL"); Notify(-1, -1, errormessage, 0); return; } @@ -372,27 +290,26 @@ } /* do we test for same textures for the sidedef in question?? */ - if (type_tex == 1) + sdef = (*sdlist)->objnum; + if (opt_check) { - pdef = &SideDefs[(*sdlist)->objnum]; - if ((mode == 3 && strncmp(pdef->tex3, texname, WAD_TEX_NAME)) || - (mode == 2 && strncmp(pdef->tex2, texname, WAD_TEX_NAME)) || - (mode == 1 && strncmp(pdef->tex1, texname, WAD_TEX_NAME))) + SDPtr pdef = &SideDefs[sdef]; + if ((opt_mode == 3 && strncmp(pdef->tex3, texname, WAD_TEX_NAME)) || + (opt_mode == 2 && strncmp(pdef->tex2, texname, WAD_TEX_NAME)) || + (opt_mode == 1 && strncmp(pdef->tex1, texname, WAD_TEX_NAME))) { - sprintf(errormessage, "No texture for sidedef #%d.", - (*sdlist)->objnum); + sprintf(errormessage, "No texture or discontinuous texture on sidedef #%d.", + sdef); Notify(-1, -1, errormessage, 0); return; } } - sdef = (*sdlist)->objnum; - /* find out which linedef holds that sidedef */ int n; for (ldef = -1, n = 0; n < NumLineDefs; n++) - if ((type_sd == 1 && LineDefs[n].sidedef1 == sdef) || - (type_sd == 2 && LineDefs[n].sidedef2 == sdef)) + if ((opt_sdef == 1 && LineDefs[n].sidedef1 == sdef) || + (opt_sdef == 2 && LineDefs[n].sidedef2 == sdef)) { ldef = n; break; @@ -420,16 +337,11 @@ /* is this the first time round here */ if (vert1 != vert2) { - if (type_off == 1) /* do we have an initial offset ? */ - { - SideDefs[sdef].xoff = useroffset; - xoffset = useroffset; - } - else - SideDefs[sdef].xoff = 0; + /* Do we have an initial offset? */ + xoffset = opt_offset ? useroffset : 0; } - else /* put new xoffset into the sidedef */ - SideDefs[sdef].xoff = xoffset; + + SideDefs[sdef].xoff = xoffset; /* calculate length of linedef */ vert2 = LineDefs[ldef].end;
--- a/src/yadex.h Mon Sep 26 09:47:41 2011 +0300 +++ b/src/yadex.h Mon Sep 26 10:16:55 2011 +0300 @@ -453,8 +453,8 @@ #include "input.h" // l_align.cc (previously in objects.cc) -void AlignTexturesY(SelPtr *); /* SWAP! */ -void AlignTexturesX(SelPtr *); /* SWAP! */ +void AlignTexturesY(SelPtr *, int opt_sdef, bool opt_check); +void AlignTexturesX(SelPtr *, int opt_sdef, bool opt_check, bool opt_offset, int opt_mode); // l_misc.cc (previously in objects.cc) void FlipLineDefs(SelPtr, bool); /* SWAP! */