mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-14 08:30:58 +00:00
A couple of tweaks for easier work with TROR:
* When TROR-joining and sectors reachable through former red walls could need displacement, ask the user; if something is wrong with the walls of the two components to join, jump to that place and print coordinates of offending wall and its point2 in the OSD * Ctrl-TAB in 2D mode now toggles filling of the currently aimed-at sector; it's not very in sync with the rest of the controls though (e.g. some commands will potentially affect each sector that contains the crosshair) * Fill sectors slightly different so that highlighted sectors above each other are easier to distinguish * In the editor, always clear the screen to a 'rainbow' of the palette before each frame. This makes no-draw ('HOM') and accidental translucency glitches stand out more clearly * a few misc. tweaks, consistency checks, and fixes git-svn-id: https://svn.eduke32.com/eduke32@1901 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
d3a9dec77c
commit
e1d868dc20
5 changed files with 300 additions and 103 deletions
|
@ -102,6 +102,7 @@ char *OSD_GetFmtPtr(void);
|
||||||
|
|
||||||
int32_t OSD_GetCols(void);
|
int32_t OSD_GetCols(void);
|
||||||
int32_t OSD_IsMoving(void);
|
int32_t OSD_IsMoving(void);
|
||||||
|
int32_t OSD_GetRowsCur(void);
|
||||||
|
|
||||||
// initializes things
|
// initializes things
|
||||||
void OSD_Init(void);
|
void OSD_Init(void);
|
||||||
|
|
|
@ -95,7 +95,7 @@ extern char textfont[128][8];
|
||||||
// only valid when highlightsectorcnt>0 and no structural
|
// only valid when highlightsectorcnt>0 and no structural
|
||||||
// modifications (deleting/inserting sectors or points, setting new firstwall)
|
// modifications (deleting/inserting sectors or points, setting new firstwall)
|
||||||
// have been made
|
// have been made
|
||||||
static int16_t onextwall[MAXWALLS];
|
static int16_t onextwall[MAXWALLS]; // onextwall[i]>=0 implies wall[j].nextwall < 0
|
||||||
static void mkonwvalid(void) { chsecptr_onextwall = onextwall; }
|
static void mkonwvalid(void) { chsecptr_onextwall = onextwall; }
|
||||||
static void mkonwinvalid(void) { chsecptr_onextwall = NULL; }
|
static void mkonwinvalid(void) { chsecptr_onextwall = NULL; }
|
||||||
static int32_t onwisvalid(void) { return chsecptr_onextwall != NULL; }
|
static int32_t onwisvalid(void) { return chsecptr_onextwall != NULL; }
|
||||||
|
@ -128,6 +128,7 @@ static int32_t tempxyar[MAXWALLS][2] ATTRIBUTE((aligned(8)));
|
||||||
static int32_t mousx, mousy;
|
static int32_t mousx, mousy;
|
||||||
int16_t prefixtiles[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
int16_t prefixtiles[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
|
||||||
uint8_t hlsectorbitmap[MAXSECTORS>>3]; // show2dsector is already taken...
|
uint8_t hlsectorbitmap[MAXSECTORS>>3]; // show2dsector is already taken...
|
||||||
|
static int32_t minhlsectorfloorz = 0;
|
||||||
|
|
||||||
static uint8_t visited[MAXWALLS>>3]; // used for AlignWalls and trace_loop
|
static uint8_t visited[MAXWALLS>>3]; // used for AlignWalls and trace_loop
|
||||||
|
|
||||||
|
@ -1812,13 +1813,21 @@ void update_highlightsector(void)
|
||||||
{
|
{
|
||||||
int32_t i;
|
int32_t i;
|
||||||
|
|
||||||
|
minhlsectorfloorz = INT32_MAX;
|
||||||
|
|
||||||
highlightsectorcnt = 0;
|
highlightsectorcnt = 0;
|
||||||
for (i=0; i<numsectors; i++)
|
for (i=0; i<numsectors; i++)
|
||||||
if (hlsectorbitmap[i>>3]&(1<<(i&7)))
|
if (hlsectorbitmap[i>>3]&(1<<(i&7)))
|
||||||
|
{
|
||||||
highlightsector[highlightsectorcnt++] = i;
|
highlightsector[highlightsectorcnt++] = i;
|
||||||
|
minhlsectorfloorz = min(minhlsectorfloorz, sector[i].floorz);
|
||||||
|
}
|
||||||
|
|
||||||
if (highlightsectorcnt==0)
|
if (highlightsectorcnt==0)
|
||||||
|
{
|
||||||
|
minhlsectorfloorz = 0;
|
||||||
highlightsectorcnt = -1;
|
highlightsectorcnt = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// hook run after handleevents in side view
|
// hook run after handleevents in side view
|
||||||
|
@ -2244,6 +2253,7 @@ static int32_t compare_wall_coords(const void *w1, const void *w2)
|
||||||
circlepoints = 7; \
|
circlepoints = 7; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
// breadth-first search helpers
|
// breadth-first search helpers
|
||||||
void bfirst_search_init(int16_t *list, uint8_t *bitmap, int32_t *eltnumptr, int32_t maxnum, int16_t firstelt)
|
void bfirst_search_init(int16_t *list, uint8_t *bitmap, int32_t *eltnumptr, int32_t maxnum, int16_t firstelt)
|
||||||
{
|
{
|
||||||
|
@ -2273,7 +2283,7 @@ static int16_t collsectlist[2][MAXSECTORS];
|
||||||
static uint8_t collsectbitmap[2][MAXSECTORS>>3];
|
static uint8_t collsectbitmap[2][MAXSECTORS>>3];
|
||||||
|
|
||||||
static void collect_sectors1(int16_t *sectlist, uint8_t *sectbitmap, int32_t *numsectptr,
|
static void collect_sectors1(int16_t *sectlist, uint8_t *sectbitmap, int32_t *numsectptr,
|
||||||
int16_t startsec, int32_t alsoyaxnext)
|
int16_t startsec, int32_t alsoyaxnext, int32_t alsoonw)
|
||||||
{
|
{
|
||||||
int32_t j, startwall, endwall, sectcnt;
|
int32_t j, startwall, endwall, sectcnt;
|
||||||
|
|
||||||
|
@ -2282,7 +2292,12 @@ static void collect_sectors1(int16_t *sectlist, uint8_t *sectbitmap, int32_t *nu
|
||||||
for (sectcnt=0; sectcnt<*numsectptr; sectcnt++)
|
for (sectcnt=0; sectcnt<*numsectptr; sectcnt++)
|
||||||
{
|
{
|
||||||
for (WALLS_OF_SECTOR(sectlist[sectcnt], j))
|
for (WALLS_OF_SECTOR(sectlist[sectcnt], j))
|
||||||
bfirst_search_try(sectlist, sectbitmap, numsectptr, wall[j].nextsector);
|
{
|
||||||
|
if (wall[j].nextsector >= 0)
|
||||||
|
bfirst_search_try(sectlist, sectbitmap, numsectptr, wall[j].nextsector);
|
||||||
|
else if (alsoonw && onextwall[j]>=0)
|
||||||
|
bfirst_search_try(sectlist, sectbitmap, numsectptr, sectorofwall(onextwall[j]));
|
||||||
|
}
|
||||||
|
|
||||||
if (alsoyaxnext)
|
if (alsoyaxnext)
|
||||||
{
|
{
|
||||||
|
@ -2298,41 +2313,46 @@ static void collect_sectors1(int16_t *sectlist, uint8_t *sectbitmap, int32_t *nu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t sectors_components(int16_t hlsectcnt, const int16_t *hlsectors, int32_t alsoyaxnext, int32_t alsoonw);
|
||||||
|
static int32_t highlighted_sectors_components(int32_t alsoyaxnext, int32_t alsoonw)
|
||||||
|
{
|
||||||
|
return sectors_components(highlightsectorcnt, highlightsector, alsoyaxnext, alsoonw);
|
||||||
|
}
|
||||||
|
|
||||||
// whether all highlighted sectors are in one (returns 1), two (2)
|
// whether all highlighted sectors are in one (returns 1), two (2)
|
||||||
// or more (>2) connected components wrt the nextsector relation
|
// or more (>2) connected components wrt the nextsector relation
|
||||||
// -1 means error
|
// -1 means error
|
||||||
// alsoyaxnext: also consider "yax-nextsector" relation
|
// alsoyaxnext: also consider "yax-nextsector" relation
|
||||||
static int32_t highlighted_sectors_components(int32_t alsoyaxnext)
|
// alsoonw: also consider "old-nextwall" relation (must be valid)
|
||||||
|
static int32_t sectors_components(int16_t hlsectcnt, const int16_t *hlsector, int32_t alsoyaxnext, int32_t alsoonw)
|
||||||
{
|
{
|
||||||
int32_t j, k, tmp;
|
int32_t j, k, tmp;
|
||||||
|
|
||||||
if (highlightsectorcnt<1)
|
if (hlsectcnt<1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (highlightsectorcnt==1)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
collect_sectors1(collsectlist[0], collsectbitmap[0], &collnumsects[0],
|
collect_sectors1(collsectlist[0], collsectbitmap[0], &collnumsects[0],
|
||||||
highlightsector[0], alsoyaxnext);
|
hlsector[0], alsoyaxnext, alsoonw);
|
||||||
|
|
||||||
for (k=0; k<highlightsectorcnt; k++)
|
for (k=1; k<hlsectcnt; k++)
|
||||||
{
|
{
|
||||||
j = highlightsector[k];
|
j = hlsector[k];
|
||||||
if ((collsectbitmap[0][j>>3]&(1<<(j&7)))==0)
|
if ((collsectbitmap[0][j>>3]&(1<<(j&7)))==0)
|
||||||
{
|
{
|
||||||
// sector j not collected --> more than 1 conn. comp.
|
// sector j not collected --> more than 1 conn. comp.
|
||||||
collect_sectors1(collsectlist[1], collsectbitmap[1], &collnumsects[1],
|
collect_sectors1(collsectlist[1], collsectbitmap[1], &collnumsects[1],
|
||||||
j, alsoyaxnext);
|
j, alsoyaxnext, alsoonw);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (k == highlightsectorcnt)
|
if (k == hlsectcnt)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
for (k=0; k<highlightsectorcnt; k++)
|
for (k=0; k<hlsectcnt; k++)
|
||||||
{
|
{
|
||||||
j = highlightsector[k];
|
j = hlsector[k];
|
||||||
tmp = (((collsectbitmap[0][j>>3]&(1<<(j&7)))!=0) + (((collsectbitmap[1][j>>3]&(1<<(j&7)))!=0)<<1));
|
tmp = (((collsectbitmap[0][j>>3]&(1<<(j&7)))!=0) + (((collsectbitmap[1][j>>3]&(1<<(j&7)))!=0)<<1));
|
||||||
|
|
||||||
if (tmp==3)
|
if (tmp==3)
|
||||||
|
@ -2430,6 +2450,42 @@ static void handlesecthighlight1(int32_t i, int32_t sub, int32_t nograycheck)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef YAX_ENABLE
|
||||||
|
// 1: good, 0: bad
|
||||||
|
static int32_t hl_all_bunch_sectors_p()
|
||||||
|
{
|
||||||
|
uint8_t *const havebunch = visited;
|
||||||
|
int16_t cf, cb, fb;
|
||||||
|
int32_t i, j;
|
||||||
|
|
||||||
|
if (numyaxbunches > 0)
|
||||||
|
{
|
||||||
|
Bmemset(havebunch, 0, (numyaxbunches+7)>>3);
|
||||||
|
for (i=0; i<highlightsectorcnt; i++)
|
||||||
|
{
|
||||||
|
yax_getbunches(highlightsector[i], &cb, &fb);
|
||||||
|
if (cb>=0)
|
||||||
|
havebunch[cb>>3] |= (1<<(cb&7));
|
||||||
|
if (fb>=0)
|
||||||
|
havebunch[fb>>3] |= (1<<(fb&7));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i<numyaxbunches; i++)
|
||||||
|
{
|
||||||
|
if ((havebunch[i>>3] & (1<<(i&7)))==0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (cf=0; cf<2; cf++)
|
||||||
|
for (SECTORS_OF_BUNCH(i,cf, j))
|
||||||
|
if ((hlsectorbitmap[j>>3]&(1<<(j&7)))==0)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void overheadeditor(void)
|
void overheadeditor(void)
|
||||||
{
|
{
|
||||||
char buffer[80], ch;
|
char buffer[80], ch;
|
||||||
|
@ -2728,12 +2784,9 @@ void overheadeditor(void)
|
||||||
|
|
||||||
if (highlightsectorcnt >= 0)
|
if (highlightsectorcnt >= 0)
|
||||||
{
|
{
|
||||||
int32_t oydim16 = ydim16;
|
|
||||||
ydim16 = ydim-STATUS2DSIZ2;
|
|
||||||
for (i=0; i<numsectors; i++)
|
for (i=0; i<numsectors; i++)
|
||||||
if (hlsectorbitmap[i>>3]&(1<<(i&7)))
|
if (hlsectorbitmap[i>>3]&(1<<(i&7)))
|
||||||
fillsector(i, -1);
|
fillsector(i, -1);
|
||||||
ydim16 = oydim16;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keystatus[0x2a]) // FIXME
|
if (keystatus[0x2a]) // FIXME
|
||||||
|
@ -2841,6 +2894,13 @@ void overheadeditor(void)
|
||||||
int32_t about_x=keystatus[0x2d];
|
int32_t about_x=keystatus[0x2d];
|
||||||
int32_t doMirror = eitherALT; // mirror walls and wall/floor sprites
|
int32_t doMirror = eitherALT; // mirror walls and wall/floor sprites
|
||||||
|
|
||||||
|
#ifdef YAX_ENABLE
|
||||||
|
if (highlightsectorcnt > 0 && !hl_all_bunch_sectors_p())
|
||||||
|
{
|
||||||
|
printmessage16("To flip extended sectors, all sectors of a bunch must be selected");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
if (highlightsectorcnt > 0)
|
if (highlightsectorcnt > 0)
|
||||||
{
|
{
|
||||||
keystatus[0x2d] = keystatus[0x15] = 0;
|
keystatus[0x2d] = keystatus[0x15] = 0;
|
||||||
|
@ -3017,6 +3077,13 @@ void overheadeditor(void)
|
||||||
|
|
||||||
if (tsign)
|
if (tsign)
|
||||||
{
|
{
|
||||||
|
#ifdef YAX_ENABLE
|
||||||
|
if (highlightsectorcnt > 0 && !hl_all_bunch_sectors_p())
|
||||||
|
{
|
||||||
|
printmessage16("To rotate ext. sectors, all sectors of a bunch must be selected");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
if (highlightsectorcnt > 0)
|
if (highlightsectorcnt > 0)
|
||||||
{
|
{
|
||||||
int32_t smoothRotation = !eitherSHIFT;
|
int32_t smoothRotation = !eitherSHIFT;
|
||||||
|
@ -3232,7 +3299,7 @@ void overheadeditor(void)
|
||||||
goto end_yax;
|
goto end_yax;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (highlighted_sectors_components(0) != 1)
|
if (highlighted_sectors_components(0,0) != 1)
|
||||||
{
|
{
|
||||||
message("Sectors to extend must be in one connected component");
|
message("Sectors to extend must be in one connected component");
|
||||||
goto end_yax;
|
goto end_yax;
|
||||||
|
@ -4092,29 +4159,20 @@ end_after_dragging:
|
||||||
|
|
||||||
if (cursectorhighlight >= 0 && cursectorhighlight < numsectors)
|
if (cursectorhighlight >= 0 && cursectorhighlight < numsectors)
|
||||||
{
|
{
|
||||||
// for (i=0; i<highlightsectorcnt; i++)
|
//You clicked inside one of the flashing sectors!
|
||||||
// if (cursectorhighlight == highlightsector[i])
|
sectorhighlightstat = 1;
|
||||||
{
|
|
||||||
//You clicked inside one of the flashing sectors!
|
|
||||||
sectorhighlightstat = 1;
|
|
||||||
|
|
||||||
dax = mousxplc;
|
dax = mousxplc;
|
||||||
day = mousyplc;
|
day = mousyplc;
|
||||||
if (gridlock && grid > 0)
|
if (gridlock && grid > 0)
|
||||||
locktogrid(&dax, &day);
|
locktogrid(&dax, &day);
|
||||||
|
|
||||||
sectorhighlightx = dax;
|
sectorhighlightx = dax;
|
||||||
sectorhighlighty = day;
|
sectorhighlighty = day;
|
||||||
// break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (sectorhighlightstat == 1)
|
else if (sectorhighlightstat == 1)
|
||||||
{
|
{
|
||||||
#ifdef YAX_ENABLE
|
|
||||||
uint8_t *const havebunch = visited;
|
|
||||||
int16_t cf, cb, fb, good=1;
|
|
||||||
#endif
|
|
||||||
dax = mousxplc;
|
dax = mousxplc;
|
||||||
day = mousyplc;
|
day = mousyplc;
|
||||||
if (gridlock && grid > 0)
|
if (gridlock && grid > 0)
|
||||||
|
@ -4125,35 +4183,7 @@ end_after_dragging:
|
||||||
sectorhighlightx += dax;
|
sectorhighlightx += dax;
|
||||||
sectorhighlighty += day;
|
sectorhighlighty += day;
|
||||||
#ifdef YAX_ENABLE
|
#ifdef YAX_ENABLE
|
||||||
if (numyaxbunches > 0)
|
if (!hl_all_bunch_sectors_p())
|
||||||
{
|
|
||||||
Bmemset(havebunch, 0, (numyaxbunches+7)>>3);
|
|
||||||
for (i=0; i<highlightsectorcnt; i++)
|
|
||||||
{
|
|
||||||
yax_getbunches(highlightsector[i], &cb, &fb);
|
|
||||||
if (cb>=0)
|
|
||||||
havebunch[cb>>3] |= (1<<(cb&7));
|
|
||||||
if (fb>=0)
|
|
||||||
havebunch[fb>>3] |= (1<<(fb&7));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0; i<numyaxbunches; i++)
|
|
||||||
{
|
|
||||||
if ((havebunch[i>>3] & (1<<(i&7)))==0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
for (cf=0; cf<2; cf++)
|
|
||||||
for (SECTORS_OF_BUNCH(i,cf, j))
|
|
||||||
if ((hlsectorbitmap[j>>3]&(1<<(j&7)))==0)
|
|
||||||
{
|
|
||||||
good = 0;
|
|
||||||
goto try_dragging_sectors;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try_dragging_sectors:
|
|
||||||
if (!good)
|
|
||||||
printmessage16("To drag extended sectors, all sectors of a bunch must be selected");
|
printmessage16("To drag extended sectors, all sectors of a bunch must be selected");
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
@ -4521,11 +4551,12 @@ end_point_dragging:
|
||||||
// (doesn't yet say which is stationary)
|
// (doesn't yet say which is stationary)
|
||||||
// movestat: which component can be displaced?
|
// movestat: which component can be displaced?
|
||||||
// &1: first, &2: second
|
// &1: first, &2: second
|
||||||
int32_t askres, joinstat, needsdisp, movestat, dx=0,dy=0,dz;
|
int32_t askres, joinstat, needsdisp, moveonwp;
|
||||||
|
int32_t movestat, dx=0,dy=0,dz, delayerr=0;
|
||||||
|
|
||||||
// tempxyar: int32_t [MAXWALLS][2]
|
// tempxyar: int32_t [MAXWALLS][2]
|
||||||
int32_t numouterwalls[2] = {0,0}, numowals;
|
int32_t numouterwalls[2] = {0,0}, numowals;
|
||||||
int16_t *const outerwall[2] = { (int16_t *)tempxyar, ((int16_t *)tempxyar)+MAXWALLS };
|
static int16_t outerwall[2][MAXWALLS];
|
||||||
const walltype *wal0, *wal1;
|
const walltype *wal0, *wal1;
|
||||||
|
|
||||||
// join sector ceilings/floors to a new bunch
|
// join sector ceilings/floors to a new bunch
|
||||||
|
@ -4537,7 +4568,7 @@ end_point_dragging:
|
||||||
|
|
||||||
// first, see whether we have exactly two connected components
|
// first, see whether we have exactly two connected components
|
||||||
// wrt wall[].nextsector
|
// wrt wall[].nextsector
|
||||||
if (highlighted_sectors_components(0) != 2)
|
if (highlighted_sectors_components(0,0) != 2)
|
||||||
{
|
{
|
||||||
message("Sectors must be partitioned in two components to join");
|
message("Sectors must be partitioned in two components to join");
|
||||||
goto end_join_sectors;
|
goto end_join_sectors;
|
||||||
|
@ -4603,9 +4634,12 @@ end_point_dragging:
|
||||||
if (numouterwalls[0] != numouterwalls[1])
|
if (numouterwalls[0] != numouterwalls[1])
|
||||||
{
|
{
|
||||||
message("Number of outer walls must be equal for both components");
|
message("Number of outer walls must be equal for both components");
|
||||||
goto end_join_sectors;
|
if (numouterwalls[0]>0 && numouterwalls[1]>0)
|
||||||
|
delayerr = 1;
|
||||||
|
else
|
||||||
|
goto end_join_sectors;
|
||||||
}
|
}
|
||||||
numowals = numouterwalls[0];
|
numowals = min(numouterwalls[0], numouterwalls[1]);
|
||||||
|
|
||||||
// now sort outer walls 'geometrically'
|
// now sort outer walls 'geometrically'
|
||||||
for (comp=0; comp<2; comp++)
|
for (comp=0; comp<2; comp++)
|
||||||
|
@ -4626,11 +4660,23 @@ end_point_dragging:
|
||||||
wall[wal1->point2].x - wall[wal0->point2].x != dx ||
|
wall[wal1->point2].x - wall[wal0->point2].x != dx ||
|
||||||
wall[wal1->point2].y - wall[wal0->point2].y != dy)
|
wall[wal1->point2].y - wall[wal0->point2].y != dy)
|
||||||
{
|
{
|
||||||
|
pos.x = wal0->x;
|
||||||
|
pos.y = wal0->y;
|
||||||
|
pos.z = getflorzofslope(sectorofwall(wal0-wall), pos.x, pos.y);
|
||||||
|
|
||||||
message("Outer wall coordinates must coincide for both components");
|
message("Outer wall coordinates must coincide for both components");
|
||||||
|
OSD_Printf("wal0:%d (%d,%d)--(%d,%d)\n",wal0-wall, wal0->x,wal0->y,
|
||||||
|
wall[wal0->point2].x,wall[wal0->point2].y);
|
||||||
|
OSD_Printf("wal1:%d (%d,%d)--(%d,%d)\n",wal1-wall, wal1->x,wal1->y,
|
||||||
|
wall[wal1->point2].x,wall[wal1->point2].y);
|
||||||
|
|
||||||
goto end_join_sectors;
|
goto end_join_sectors;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (delayerr)
|
||||||
|
goto end_join_sectors;
|
||||||
|
|
||||||
if (joinstat == 3)
|
if (joinstat == 3)
|
||||||
{
|
{
|
||||||
char askchars[2] = {'1', 'v'};
|
char askchars[2] = {'1', 'v'};
|
||||||
|
@ -4683,9 +4729,47 @@ end_point_dragging:
|
||||||
if (movestat==1)
|
if (movestat==1)
|
||||||
dx*=-1, dy*=-1, dz*=-1;
|
dx*=-1, dy*=-1, dz*=-1;
|
||||||
|
|
||||||
|
moveonwp = 0;
|
||||||
|
if (onwisvalid())
|
||||||
|
{
|
||||||
|
static int16_t ocollsectlist[MAXSECTORS];
|
||||||
|
static uint8_t tcollbitmap[MAXSECTORS>>3];
|
||||||
|
int16_t ocollnumsects=collnumsects[movestat], tmpsect;
|
||||||
|
|
||||||
|
Bmemcpy(ocollsectlist, collsectlist[movestat], ocollnumsects*sizeof(int16_t));
|
||||||
|
Bmemset(tcollbitmap, 0, sizeof(tcollbitmap));
|
||||||
|
|
||||||
|
for (k=0; k<ocollnumsects; k++)
|
||||||
|
for (WALLS_OF_SECTOR(ocollsectlist[k], j))
|
||||||
|
{
|
||||||
|
if (onextwall[j] < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
tmpsect = sectorofwall(onextwall[j]);
|
||||||
|
sectors_components(1, &tmpsect, 1,0);
|
||||||
|
|
||||||
|
for (m=0; m<(numsectors+7)>>3; m++)
|
||||||
|
tcollbitmap[m] |= collsectbitmap[0][m];
|
||||||
|
moveonwp = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (moveonwp)
|
||||||
|
{
|
||||||
|
int32_t movecol = movestat==0 ? 159 : editorcolors[11];
|
||||||
|
for (i=0; i<numsectors; i++)
|
||||||
|
if (tcollbitmap[i>>3]&(1<<(i&7)))
|
||||||
|
fillsector(i, editorcolors[12]);
|
||||||
|
|
||||||
|
fade_editor_screen(editorcolors[12] | (movecol<<8));
|
||||||
|
moveonwp = ask_if_sure("Also move formerly wall-connected sectors?",0);
|
||||||
|
if (moveonwp==-1)
|
||||||
|
goto end_join_sectors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// now need to collect them wrt. the nextsector but also
|
// now need to collect them wrt. the nextsector but also
|
||||||
// the yax-nextsector relation
|
// the yax-nextsector relation
|
||||||
if (highlighted_sectors_components(1) != 2)
|
if (highlighted_sectors_components(1,moveonwp) != 2)
|
||||||
{
|
{
|
||||||
message("Must not have TROR connections between the two components");
|
message("Must not have TROR connections between the two components");
|
||||||
goto end_join_sectors;
|
goto end_join_sectors;
|
||||||
|
@ -4713,14 +4797,18 @@ end_point_dragging:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// restore old components
|
// restore old components, i.e. only the bunch sectors
|
||||||
highlighted_sectors_components(0);
|
highlighted_sectors_components(0,0);
|
||||||
|
|
||||||
} // end if (needsdisp)
|
} // end if (needsdisp)
|
||||||
|
|
||||||
/*** construct the YAX connection! ***/
|
/*** construct the YAX connection! ***/
|
||||||
for (comp=0; comp<2; comp++)
|
for (comp=0; comp<2; comp++)
|
||||||
{
|
{
|
||||||
|
// walls
|
||||||
|
for (j=0; j<numowals; j++)
|
||||||
|
yax_setnextwall(outerwall[comp][j], comp^joinstat, outerwall[!comp][j]);
|
||||||
|
|
||||||
// sectors
|
// sectors
|
||||||
for (k=0; k<collnumsects[comp]; k++)
|
for (k=0; k<collnumsects[comp]; k++)
|
||||||
{
|
{
|
||||||
|
@ -4728,15 +4816,12 @@ end_point_dragging:
|
||||||
yax_setbunch(i, comp^joinstat, numyaxbunches);
|
yax_setbunch(i, comp^joinstat, numyaxbunches);
|
||||||
SECTORFLD(i,stat, comp^joinstat) &= ~1; // no plax
|
SECTORFLD(i,stat, comp^joinstat) &= ~1; // no plax
|
||||||
|
|
||||||
// restore red walls
|
// restore red walls AFTER setting nextwalls
|
||||||
|
// (see checksectorpointer() for why)
|
||||||
for (WALLS_OF_SECTOR(i, j))
|
for (WALLS_OF_SECTOR(i, j))
|
||||||
if (wall[j].nextwall < 0)
|
if (wall[j].nextwall < 0)
|
||||||
checksectorpointer(j, i);
|
checksectorpointer(j, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
// walls
|
|
||||||
for (j=0; j<numowals; j++)
|
|
||||||
yax_setnextwall(outerwall[comp][j], comp^joinstat, outerwall[!comp][j]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Bmemset(hlsectorbitmap, 0, sizeof(hlsectorbitmap));
|
Bmemset(hlsectorbitmap, 0, sizeof(hlsectorbitmap));
|
||||||
|
@ -5936,7 +6021,7 @@ end_space_handling:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
Bmemset(hlsectorbitmap, 0, sizeof(hlsectorbitmap));
|
Bmemset(hlsectorbitmap, 0, sizeof(hlsectorbitmap));
|
||||||
highlightsectorcnt = -1;
|
update_highlightsector();
|
||||||
|
|
||||||
Bmemset(show2dwall, 0, sizeof(show2dwall));
|
Bmemset(show2dwall, 0, sizeof(show2dwall));
|
||||||
update_highlight();
|
update_highlight();
|
||||||
|
@ -8123,9 +8208,15 @@ static int32_t menuselect(void)
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int32_t imod(int32_t a, int32_t b)
|
||||||
|
{
|
||||||
|
if (a >= 0) return(a%b);
|
||||||
|
return(((a+1)%b)+b-1);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t fillsector(int16_t sectnum, int32_t fillcolor)
|
int32_t fillsector(int16_t sectnum, int32_t fillcolor)
|
||||||
{
|
{
|
||||||
int32_t x1, x2, y1, y2, sy, y;
|
int32_t x1, x2, y1, y2, sy, y, daminy;
|
||||||
int32_t lborder, rborder, uborder, dborder, miny, maxy, dax;
|
int32_t lborder, rborder, uborder, dborder, miny, maxy, dax;
|
||||||
int16_t z, zz, startwall, endwall, fillcnt;
|
int16_t z, zz, startwall, endwall, fillcnt;
|
||||||
|
|
||||||
|
@ -8137,7 +8228,8 @@ int32_t fillsector(int16_t sectnum, int32_t fillcolor)
|
||||||
col = fillcolor;
|
col = fillcolor;
|
||||||
|
|
||||||
lborder = 0; rborder = xdim;
|
lborder = 0; rborder = xdim;
|
||||||
uborder = 0; dborder = ydim16;
|
y = OSD_GetRowsCur();
|
||||||
|
uborder = (y>=0)?(y+1)*8:0; dborder = ydim16-STATUS2DSIZ2;
|
||||||
|
|
||||||
if (sectnum == -1)
|
if (sectnum == -1)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -8169,8 +8261,12 @@ int32_t fillsector(int16_t sectnum, int32_t fillcolor)
|
||||||
if (miny < uborder) miny = uborder;
|
if (miny < uborder) miny = uborder;
|
||||||
if (maxy >= dborder) maxy = dborder-1;
|
if (maxy >= dborder) maxy = dborder-1;
|
||||||
|
|
||||||
|
daminy = miny+2 - imod(miny+2,3);
|
||||||
|
if (sector[sectnum].floorz > minhlsectorfloorz)
|
||||||
|
daminy++;
|
||||||
|
|
||||||
//+((totalclock>>2)&3)
|
//+((totalclock>>2)&3)
|
||||||
for (sy=miny; sy<=maxy; sy+=3) // JBF 20040116: numframes%3 -> (totalclock>>2)&3
|
for (sy=daminy; sy<=maxy; sy+=3) // JBF 20040116: numframes%3 -> (totalclock>>2)&3
|
||||||
{
|
{
|
||||||
y = pos.y + ((sy-midydim16)<<14)/zoom;
|
y = pos.y + ((sy-midydim16)<<14)/zoom;
|
||||||
|
|
||||||
|
@ -8240,7 +8336,7 @@ int32_t fillsector(int16_t sectnum, int32_t fillcolor)
|
||||||
if (fillist[z+1] > rborder)
|
if (fillist[z+1] > rborder)
|
||||||
fillist[z+1] = rborder;
|
fillist[z+1] = rborder;
|
||||||
|
|
||||||
drawline16(fillist[z],sy, fillist[z+1],sy, col); //editorcolors[fillcolor]
|
drawline16(fillist[z]+1,sy, fillist[z+1]-1,sy, col); //editorcolors[fillcolor]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -878,20 +878,28 @@ void yax_drawrooms(void (*ExtAnalyzeSprites)(void), int32_t horiz, int16_t sectn
|
||||||
g_nodraw = 0;
|
g_nodraw = 0;
|
||||||
scansector_collectsprites = 0;
|
scansector_collectsprites = 0;
|
||||||
|
|
||||||
#ifdef ENGINE_CLEAR_SCREEN
|
#if 1
|
||||||
if (getrendermode()==0)
|
//def ENGINE_CLEAR_SCREEN
|
||||||
|
if (editstatus==1)
|
||||||
{
|
{
|
||||||
begindrawing();
|
if (getrendermode()==0)
|
||||||
for (i=0; i<xdimen*ydimen; i++)
|
{
|
||||||
*((char *)frameplace + i) = i;
|
begindrawing();
|
||||||
enddrawing();
|
j = 0;
|
||||||
}
|
for (i=0; i<xdimen*ydimen; i++)
|
||||||
|
{
|
||||||
|
*((char *)frameplace + i) = (char)j;
|
||||||
|
j = (j+1)%xdimen;
|
||||||
|
}
|
||||||
|
enddrawing();
|
||||||
|
}
|
||||||
#ifdef USE_OPENGL
|
#ifdef USE_OPENGL
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
|
bglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (cf=0; cf<2; cf++)
|
for (cf=0; cf<2; cf++)
|
||||||
|
@ -1554,11 +1562,33 @@ int32_t clipmapinfo_load(const char *filename)
|
||||||
#define WALLS_ARE_CONSISTENT(k) ((wall[k].x == x2 && wall[k].y == y2) \
|
#define WALLS_ARE_CONSISTENT(k) ((wall[k].x == x2 && wall[k].y == y2) \
|
||||||
&& ((wall[wall[k].point2]).x == x1 && (wall[wall[k].point2]).y == y1))
|
&& ((wall[wall[k].point2]).x == x1 && (wall[wall[k].point2]).y == y1))
|
||||||
|
|
||||||
|
static int32_t getscore(int32_t w1c, int32_t w1f, int32_t w2c, int32_t w2f)
|
||||||
|
{
|
||||||
|
int32_t minflor, maxceil;
|
||||||
|
|
||||||
|
if (w1c > w1f)
|
||||||
|
swaplong(&w1c, &w1f);
|
||||||
|
if (w2c > w2f)
|
||||||
|
swaplong(&w2c, &w2f);
|
||||||
|
|
||||||
|
// now: c <= f for each "wall-vline"
|
||||||
|
|
||||||
|
maxceil = max(w1c, w2c);
|
||||||
|
minflor = min(w1f, w2f);
|
||||||
|
|
||||||
|
return minflor-maxceil;
|
||||||
|
}
|
||||||
|
|
||||||
const int16_t *chsecptr_onextwall = NULL;
|
const int16_t *chsecptr_onextwall = NULL;
|
||||||
|
|
||||||
int32_t checksectorpointer(int16_t i, int16_t sectnum)
|
int32_t checksectorpointer(int16_t i, int16_t sectnum)
|
||||||
{
|
{
|
||||||
int32_t j, k, startwall, endwall, x1, y1, x2, y2, numnewwalls=0;
|
int32_t j, k, startwall, endwall, x1, y1, x2, y2, numnewwalls=0;
|
||||||
|
int32_t bestnextwall=-1, bestnextsec=-1, bestwallscore=INT32_MIN;
|
||||||
|
int32_t cz[4], fz[4], tmp[2], tmpscore=0;
|
||||||
|
#ifdef YAX_ENABLE
|
||||||
|
int16_t cb[2], fb[2];
|
||||||
|
#endif
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (checksectorpointer_warn && (i<0 || i>=max(numwalls,newnumwalls)))
|
if (checksectorpointer_warn && (i<0 || i>=max(numwalls,newnumwalls)))
|
||||||
|
@ -1589,6 +1619,7 @@ int32_t checksectorpointer(int16_t i, int16_t sectnum)
|
||||||
|
|
||||||
if (chsecptr_onextwall && (k=chsecptr_onextwall[i])>=0 && wall[k].nextwall<0)
|
if (chsecptr_onextwall && (k=chsecptr_onextwall[i])>=0 && wall[k].nextwall<0)
|
||||||
{
|
{
|
||||||
|
// old next wall found
|
||||||
if (WALLS_ARE_CONSISTENT(k))
|
if (WALLS_ARE_CONSISTENT(k))
|
||||||
{
|
{
|
||||||
j = sectorofwall(k);
|
j = sectorofwall(k);
|
||||||
|
@ -1620,19 +1651,57 @@ int32_t checksectorpointer(int16_t i, int16_t sectnum)
|
||||||
// The nextwall relation should be definitely one-to-one at all times!
|
// The nextwall relation should be definitely one-to-one at all times!
|
||||||
if (wall[k].nextwall>=0 && wall[k].nextwall != i)
|
if (wall[k].nextwall>=0 && wall[k].nextwall != i)
|
||||||
continue;
|
continue;
|
||||||
|
#ifdef YAX_ENABLE
|
||||||
|
yax_getbunches(sectnum, &cb[0], &fb[0]);
|
||||||
|
yax_getbunches(j, &cb[1], &fb[1]);
|
||||||
|
|
||||||
if (sectnum != -2 && numnewwalls==0) // -2 means dry run
|
if ((cb[0]>=0 && cb[0]==cb[1]) || (fb[0]>=0 && fb[0]==fb[1]))
|
||||||
{
|
{
|
||||||
wall[i].nextsector = j;
|
tmpscore = INT32_MAX;
|
||||||
wall[i].nextwall = k;
|
}
|
||||||
wall[k].nextsector = sectnum;
|
else
|
||||||
wall[k].nextwall = i;
|
#endif
|
||||||
|
{
|
||||||
|
getzsofslope(sectnum, x1,y1, &cz[0],&fz[0]);
|
||||||
|
getzsofslope(sectnum, x2,y2, &cz[1],&fz[1]);
|
||||||
|
getzsofslope(j, x1,y1, &cz[2],&fz[2]);
|
||||||
|
getzsofslope(j, x2,y2, &cz[3],&fz[3]);
|
||||||
|
|
||||||
|
tmp[0] = getscore(cz[0],fz[0], cz[2],fz[2]);
|
||||||
|
tmp[1] = getscore(cz[1],fz[1], cz[3],fz[3]);
|
||||||
|
|
||||||
|
if ((tmp[0]^tmp[1]) >= 0)
|
||||||
|
tmpscore = tmp[0]+tmp[1];
|
||||||
|
else
|
||||||
|
tmpscore = max(tmp[0], tmp[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bestnextwall == -1 || tmpscore > bestwallscore)
|
||||||
|
{
|
||||||
|
bestwallscore = tmpscore;
|
||||||
|
bestnextwall = k;
|
||||||
|
bestnextsec = j;
|
||||||
}
|
}
|
||||||
|
|
||||||
numnewwalls++;
|
numnewwalls++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// sectnum -2 means dry run
|
||||||
|
if (bestnextwall >= 0 && sectnum!=-2)
|
||||||
|
#ifdef YAX_ENABLE
|
||||||
|
// be conservative in case if score <=0 (meaning that no wall area is mutually
|
||||||
|
// visible) -- it could be that another sector is a better candidate later on
|
||||||
|
if ((yax_getnextwall(i, 0)<0 && yax_getnextwall(i, 1)<0) || bestwallscore>0)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
// initprintf("w%d new nw=%d (score %d)\n", i, bestnextwall, bestwallscore)
|
||||||
|
wall[i].nextsector = bestnextsec;
|
||||||
|
wall[i].nextwall = bestnextwall;
|
||||||
|
wall[bestnextwall].nextsector = sectnum;
|
||||||
|
wall[bestnextwall].nextwall = i;
|
||||||
|
}
|
||||||
|
|
||||||
return numnewwalls;
|
return numnewwalls;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4512,6 +4581,9 @@ static void drawalls(int32_t bunch)
|
||||||
}
|
}
|
||||||
if ((nextsectnum < 0) || (wal->cstat&32)) //White/1-way wall
|
if ((nextsectnum < 0) || (wal->cstat&32)) //White/1-way wall
|
||||||
{
|
{
|
||||||
|
#ifdef YAX_ENABLE
|
||||||
|
int16_t ynw[2];
|
||||||
|
#endif
|
||||||
globalorientation = (int32_t)wal->cstat;
|
globalorientation = (int32_t)wal->cstat;
|
||||||
if (nextsectnum < 0) globalpicnum = wal->picnum;
|
if (nextsectnum < 0) globalpicnum = wal->picnum;
|
||||||
else globalpicnum = wal->overpicnum;
|
else globalpicnum = wal->overpicnum;
|
||||||
|
@ -4545,7 +4617,12 @@ static void drawalls(int32_t bunch)
|
||||||
wallscan(x1,x2,uplc,dplc,swall,lwall);
|
wallscan(x1,x2,uplc,dplc,swall,lwall);
|
||||||
#ifdef YAX_ENABLE
|
#ifdef YAX_ENABLE
|
||||||
// TODO: slopes?
|
// TODO: slopes?
|
||||||
if (globalposz > sec->floorz && (x = yax_getnextwall(wallnum, YAX_FLOOR)) >= 0 && wall[x].nextwall>=0)
|
ynw[0] = yax_getnextwall(wallnum, 0);
|
||||||
|
ynw[1] = yax_getnextwall(wallnum, 1);
|
||||||
|
|
||||||
|
if (globalposz > sec->floorz && ((ynw[1]>=0 && wall[ynw[1]].nextwall>=0)
|
||||||
|
// || (nextsectnum>=0 && yax_getbunch(sectnum,1)>=0)
|
||||||
|
))
|
||||||
{
|
{
|
||||||
for (x=x1; x<=x2; x++)
|
for (x=x1; x<=x2; x++)
|
||||||
if (dplc[x] > umost[x] && umost[x] <= dmost[x])
|
if (dplc[x] > umost[x] && umost[x] <= dmost[x])
|
||||||
|
@ -4554,7 +4631,9 @@ static void drawalls(int32_t bunch)
|
||||||
if (umost[x] > dmost[x]) numhits--;
|
if (umost[x] > dmost[x]) numhits--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (globalposz < sec->ceilingz && (x = yax_getnextwall(wallnum, YAX_CEILING)) >= 0 && wall[x].nextwall>=0)
|
else if (globalposz < sec->ceilingz && ((ynw[0]>=0 && wall[ynw[0]].nextwall>=0)
|
||||||
|
// || (nextsectnum>=0 && yax_getbunch(sectnum,0)>=0)
|
||||||
|
))
|
||||||
{
|
{
|
||||||
for (x=x1; x<=x2; x++)
|
for (x=x1; x<=x2; x++)
|
||||||
if (uplc[x] < dmost[x] && umost[x] <= dmost[x])
|
if (uplc[x] < dmost[x] && umost[x] <= dmost[x])
|
||||||
|
|
|
@ -300,6 +300,11 @@ int32_t OSD_IsMoving(void)
|
||||||
return (osdrowscur!=-1 && osdrowscur!=osdrows);
|
return (osdrowscur!=-1 && osdrowscur!=osdrows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t OSD_GetRowsCur(void)
|
||||||
|
{
|
||||||
|
return osdrowscur;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t OSD_GetTextMode(void)
|
int32_t OSD_GetTextMode(void)
|
||||||
{
|
{
|
||||||
return osdtextmode;
|
return osdtextmode;
|
||||||
|
|
|
@ -57,6 +57,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
static int32_t floor_over_floor;
|
static int32_t floor_over_floor;
|
||||||
|
static int32_t g_fillCurSector = 0;
|
||||||
|
|
||||||
// static char *startwin_labeltext = "Starting Mapster32...";
|
// static char *startwin_labeltext = "Starting Mapster32...";
|
||||||
static char setupfilename[]= "mapster32.cfg";
|
static char setupfilename[]= "mapster32.cfg";
|
||||||
|
@ -7473,7 +7474,12 @@ static void Keys2d(void)
|
||||||
|
|
||||||
if (keystatus[KEYSC_TAB]) //TAB
|
if (keystatus[KEYSC_TAB]) //TAB
|
||||||
{
|
{
|
||||||
if (eitherSHIFT || eitherCTRL)
|
if (eitherCTRL)
|
||||||
|
{
|
||||||
|
g_fillCurSector = !g_fillCurSector;
|
||||||
|
message("Fill currently pointed-at sector: %s", ONOFF(g_fillCurSector));
|
||||||
|
}
|
||||||
|
else if (eitherSHIFT)
|
||||||
{
|
{
|
||||||
if (pointhighlight >= 16384)
|
if (pointhighlight >= 16384)
|
||||||
{
|
{
|
||||||
|
@ -7538,6 +7544,16 @@ static void Keys2d(void)
|
||||||
|
|
||||||
///__bigcomment__
|
///__bigcomment__
|
||||||
|
|
||||||
|
if ((i=tcursectornum)>=0 && g_fillCurSector && (hlsectorbitmap[i>>3]&(1<<(i&7)))==0)
|
||||||
|
{
|
||||||
|
int32_t col = editorcolors[4];
|
||||||
|
#ifdef YAX_ENABLE
|
||||||
|
if (yax_getbunch(tcursectornum, YAX_FLOOR)>=0)
|
||||||
|
col = editorcolors[12];
|
||||||
|
#endif
|
||||||
|
fillsector(tcursectornum, col);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef YAX_ENABLE
|
#ifdef YAX_ENABLE
|
||||||
if (eitherCTRL && PRESSED_KEYSC(U) && tcursectornum>=0) // Ctrl-U: unlink bunch sectors
|
if (eitherCTRL && PRESSED_KEYSC(U) && tcursectornum>=0) // Ctrl-U: unlink bunch sectors
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue