Mercurial > hg > forks > yadex
changeset 56:2898afb3c9a0
Cleanup the texture alignment code, also cosmetically. Add more informative
error messages for certain conditions that lacked them.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 26 Sep 2011 06:05:23 +0300 |
parents | 522a71f40632 |
children | 334cf83fd576 |
files | src/l_align.cc |
diffstat | 1 files changed, 118 insertions(+), 94 deletions(-) [+] |
line wrap: on
line diff
--- a/src/l_align.cc Mon Sep 26 06:02:12 2011 +0300 +++ b/src/l_align.cc Mon Sep 26 06:05:23 2011 +0300 @@ -149,7 +149,7 @@ char texname[WAD_TEX_NAME + 1]; char errormessage[128]; /* area to hold the error messages produced */ int ldef; /* linedef number */ - int sd1; /* current sidedef in *sdlist */ + int sdef; /* current sidedef in *sdlist */ int vert1, vert2; /* vertex 1 and 2 for the linedef under scrutiny */ int xoffset; /* xoffset accumulator */ int useroffset; /* user input offset for first input */ @@ -170,23 +170,17 @@ 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)) + 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; @@ -235,57 +229,64 @@ type_tex = 0; type_off = 1; break; + default: + return; } - ldef = 0; if (!*sdlist) { Notify(-1, -1, "Error in AlignTexturesX: list is empty", 0); return; } - sd1 = (*sdlist)->objnum; + + /* throw out all 1/2nd SideDefs until a 1/2st is found */ + ldef = 0; + sdef = (*sdlist)->objnum; - if (type_sd == 1) /* throw out all 2nd SideDefs untill a 1st is found */ + while (ldef <= NumLineDefs && ( + (type_sd == 1 && LineDefs[ldef].sidedef1 != sdef) || + (type_sd == 2 && LineDefs[ldef].sidedef2 != sdef) + )) { - while (*sdlist && LineDefs[ldef].sidedef1 != sd1 - && ldef <= NumLineDefs) + ldef++; + if ((type_sd == 1 && LineDefs[ldef].sidedef2 == sdef) || + (type_sd == 2 && LineDefs[ldef].sidedef1 == sdef)) { - ldef++; - if (LineDefs[ldef].sidedef2 == sd1) + int tmp = (*sdlist)->objnum; + UnSelectObject(sdlist, tmp); + if (!*sdlist) { - UnSelectObject(sdlist, (*sdlist)->objnum); - if (!*sdlist) - return; - sd1 = (*sdlist)->objnum; - ldef = 0; + 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; } - } - } - - if (type_sd == 2) /* throw out all 1st SideDefs untill a 2nd is found */ - { - while (LineDefs[ldef].sidedef2 != sd1 && ldef <= NumLineDefs) - { - ldef++; - if (LineDefs[ldef].sidedef1 == sd1) - { - UnSelectObject(sdlist, (*sdlist)->objnum); - if (!*sdlist) - return; - sd1 = (*sdlist)->objnum; - ldef = 0; - } + sdef = (*sdlist)->objnum; + ldef = 0; } } /* get texture name of the sidedef in the *sdlist) */ - strncpy(texname, SideDefs[(*sdlist)->objnum].tex3, WAD_TEX_NAME); - - /* test if there is a texture there */ - if (texname[0] == 0 || texname[0] == '-') + 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)) { - Beep(); - sprintf(errormessage, "No texture for sidedef #%d.", + 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; @@ -293,16 +294,21 @@ GetWallTextureSize(&texlength, &dummy, texname); /* clunky, but it works */ - /* get initial offset to use (if required) */ - if (type_off == 1) /* source taken from InputObjectNumber */ + if (texlength < 4) { - int x0; /* left hand (x) window start */ - int y0; /* top (y) window start */ - int key; /* holds value returned by InputInteger */ - char prompt[80]; /* prompt for inital offset input */ + sprintf(errormessage, "Texture length for texture '%s' is %d. Not continuing.", + texname, texlength); + Notify(-1, -1, errormessage, 0); + return; + } - sprintf(prompt, "Enter initial offset between 0 and %d:", - (int) texlength); + /* get initial offset to use (if required) */ + if (type_off == 1) + { + int x0, y0, key; + char prompt[80]; + + sprintf(prompt, "Enter initial offset between 0 and %d:", texlength); x0 = (ScrMaxX - 25 - 8 * strlen(prompt)) / 2; y0 = (ScrMaxY - 55) / 2; @@ -311,46 +317,56 @@ set_colour(WHITE); DrawScreenText(x0 + 10, y0 + 8, prompt); - while ((key = - InputInteger(x0 + 10, y0 + 28, &useroffset, 0, - (int) texlength)) != YK_RETURN && key != YK_ESC) + while ((key = InputInteger(x0 + 10, y0 + 28, &useroffset, 0, + (int) texlength)) != YK_RETURN && key != YK_ESC) Beep(); + if (key == YK_ESC) + return; } - while (*sdlist) /* main processing loop */ + /* Main processing loop */ + while (*sdlist) { ldef = 0; - sd1 = (*sdlist)->objnum; + sdef = (*sdlist)->objnum; if (type_sd == 1) /* throw out all 2nd SideDefs untill a 1st is found */ { - while (LineDefs[ldef].sidedef1 != sd1 && ldef <= NumLineDefs) + while (LineDefs[ldef].sidedef1 != sdef && ldef <= NumLineDefs) { ldef++; - if (LineDefs[ldef].sidedef2 == sd1) + if (LineDefs[ldef].sidedef2 == sdef) { UnSelectObject(sdlist, (*sdlist)->objnum); - sd1 = (*sdlist)->objnum; + if (*sdlist == NULL) + { + sprintf(errormessage, "Error in type_sd==1, *sdlist == NULL"); + Notify(-1, -1, errormessage, 0); + return; + } + sdef = (*sdlist)->objnum; ldef = 0; - if (!*sdlist) - return; } } } - + else if (type_sd == 2) /* throw out all 1st SideDefs untill a 2nd is found */ { - while (LineDefs[ldef].sidedef2 != sd1 && ldef <= NumLineDefs) + while (LineDefs[ldef].sidedef2 != sdef && ldef <= NumLineDefs) { ldef++; - if (LineDefs[ldef].sidedef1 == sd1) + if (LineDefs[ldef].sidedef1 == sdef) { UnSelectObject(sdlist, (*sdlist)->objnum); - sd1 = (*sdlist)->objnum; + if (*sdlist == NULL) + { + sprintf(errormessage, "Error in type_sd==2, *sdlist == NULL"); + Notify(-1, -1, errormessage, 0); + return; + } + sdef = (*sdlist)->objnum; ldef = 0; - if (!*sdlist) - return; } } } @@ -358,10 +374,11 @@ /* do we test for same textures for the sidedef in question?? */ if (type_tex == 1) { - if (strncmp - (SideDefs[(*sdlist)->objnum].tex3, texname, WAD_TEX_NAME)) + 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))) { - Beep(); sprintf(errormessage, "No texture for sidedef #%d.", (*sdlist)->objnum); Notify(-1, -1, errormessage, 0); @@ -369,45 +386,50 @@ } } - sd1 = (*sdlist)->objnum; - ldef = 0; + sdef = (*sdlist)->objnum; /* find out which linedef holds that sidedef */ - if (type_sd == 1) + 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)) + { + ldef = n; + break; + } + + if (ldef < 0) { - while (LineDefs[ldef].sidedef1 != sd1 && ldef < NumLineDefs) - ldef++; - } - else - { - while (LineDefs[ldef].sidedef2 != sd1 && ldef < NumLineDefs) - ldef++; + sprintf(errormessage, "Linedef for sidedef #%d not found?!", + sdef); + Notify(-1, -1, errormessage, 0); + return; } + /* test for linedef highlight continuity */ vert1 = LineDefs[ldef].start; - /* test for linedef highlight continuity */ if (vert1 != vert2 && vert2 != -1) { - Beep(); sprintf(errormessage, "Linedef #%d is not contiguous" " with the previous linedef, please reselect.", (*sdlist)->objnum); Notify(-1, -1, errormessage, 0); return; } + /* is this the first time round here */ if (vert1 != vert2) { if (type_off == 1) /* do we have an initial offset ? */ { - SideDefs[sd1].xoff = useroffset; + SideDefs[sdef].xoff = useroffset; xoffset = useroffset; } else - SideDefs[sd1].xoff = 0; + SideDefs[sdef].xoff = 0; } else /* put new xoffset into the sidedef */ - SideDefs[sd1].xoff = xoffset; + SideDefs[sdef].xoff = xoffset; /* calculate length of linedef */ vert2 = LineDefs[ldef].end; @@ -415,8 +437,10 @@ Vertices[vert2].y - Vertices[vert1].y); xoffset += length; + /* remove multiples of texlength from xoffset */ xoffset = xoffset % texlength; + /* move to next object in selected list */ UnSelectObject(sdlist, (*sdlist)->objnum); }