mirror of
https://git.do.srb2.org/KartKrew/Kart-Public.git
synced 2025-01-17 23:21:05 +00:00
Merge v1
This commit is contained in:
commit
f720dd3ddb
62 changed files with 3456 additions and 2645 deletions
|
@ -401,7 +401,11 @@ if(${SRB2_CONFIG_HWRENDER})
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_light.c
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_light.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_main.c
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_main.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md2.c
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md2.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md2load.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md3load.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_model.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_trick.c
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_trick.c
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/u_list.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set (SRB2_HWRENDER_HEADERS
|
set (SRB2_HWRENDER_HEADERS
|
||||||
|
@ -415,6 +419,10 @@ if(${SRB2_CONFIG_HWRENDER})
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_light.h
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_light.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_main.h
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_main.h
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md2.h
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md2.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md2load.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_md3load.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_model.h
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/hardware/u_list.h
|
||||||
)
|
)
|
||||||
|
|
||||||
set(SRB2_R_OPENGL_SOURCES
|
set(SRB2_R_OPENGL_SOURCES
|
||||||
|
|
28
src/Makefile
28
src/Makefile
|
@ -282,7 +282,8 @@ ifndef DC
|
||||||
endif
|
endif
|
||||||
OPTS+=-DHWRENDER
|
OPTS+=-DHWRENDER
|
||||||
OBJS+=$(OBJDIR)/hw_bsp.o $(OBJDIR)/hw_draw.o $(OBJDIR)/hw_light.o \
|
OBJS+=$(OBJDIR)/hw_bsp.o $(OBJDIR)/hw_draw.o $(OBJDIR)/hw_light.o \
|
||||||
$(OBJDIR)/hw_main.o $(OBJDIR)/hw_clip.o $(OBJDIR)/hw_md2.o $(OBJDIR)/hw_cache.o $(OBJDIR)/hw_trick.o
|
$(OBJDIR)/hw_main.o $(OBJDIR)/hw_clip.o $(OBJDIR)/hw_md2.o $(OBJDIR)/hw_cache.o $(OBJDIR)/hw_trick.o \
|
||||||
|
$(OBJDIR)/hw_md2load.o $(OBJDIR)/hw_md3load.o $(OBJDIR)/hw_model.o $(OBJDIR)/u_list.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef NOHS
|
ifdef NOHS
|
||||||
|
@ -741,16 +742,18 @@ ifdef MINGW
|
||||||
$(OBJDIR)/r_opengl.o: hardware/r_opengl/r_opengl.c hardware/r_opengl/r_opengl.h \
|
$(OBJDIR)/r_opengl.o: hardware/r_opengl/r_opengl.c hardware/r_opengl/r_opengl.h \
|
||||||
doomdef.h doomtype.h g_state.h m_swap.h hardware/hw_drv.h screen.h \
|
doomdef.h doomtype.h g_state.h m_swap.h hardware/hw_drv.h screen.h \
|
||||||
command.h hardware/hw_data.h hardware/hw_glide.h hardware/hw_defs.h \
|
command.h hardware/hw_data.h hardware/hw_glide.h hardware/hw_defs.h \
|
||||||
hardware/hw_md2.h hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.h am_map.h \
|
hardware/hw_md2.h hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.h \
|
||||||
d_event.h d_player.h p_pspr.h m_fixed.h tables.h info.h d_think.h \
|
hardware/hw_md2load.h hardware/hw_md3load.h hardware/hw_model.h hardware/u_list.h \
|
||||||
|
am_map.h d_event.h d_player.h p_pspr.h m_fixed.h tables.h info.h d_think.h \
|
||||||
p_mobj.h doomdata.h d_ticcmd.h r_defs.h hardware/hw_dll.h
|
p_mobj.h doomdata.h d_ticcmd.h r_defs.h hardware/hw_dll.h
|
||||||
$(CC) $(CFLAGS) $(WFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) $(WFLAGS) -c $< -o $@
|
||||||
else
|
else
|
||||||
$(OBJDIR)/r_opengl.o: hardware/r_opengl/r_opengl.c hardware/r_opengl/r_opengl.h \
|
$(OBJDIR)/r_opengl.o: hardware/r_opengl/r_opengl.c hardware/r_opengl/r_opengl.h \
|
||||||
doomdef.h doomtype.h g_state.h m_swap.h hardware/hw_drv.h screen.h \
|
doomdef.h doomtype.h g_state.h m_swap.h hardware/hw_drv.h screen.h \
|
||||||
command.h hardware/hw_data.h hardware/hw_glide.h hardware/hw_defs.h \
|
command.h hardware/hw_data.h hardware/hw_glide.h hardware/hw_defs.h \
|
||||||
hardware/hw_md2.h hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.h am_map.h \
|
hardware/hw_md2.h hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.h \
|
||||||
d_event.h d_player.h p_pspr.h m_fixed.h tables.h info.h d_think.h \
|
hardware/hw_md2load.h hardware/hw_md3load.h hardware/hw_model.h hardware/u_list.h \
|
||||||
|
am_map.h d_event.h d_player.h p_pspr.h m_fixed.h tables.h info.h d_think.h \
|
||||||
p_mobj.h doomdata.h d_ticcmd.h r_defs.h hardware/hw_dll.h
|
p_mobj.h doomdata.h d_ticcmd.h r_defs.h hardware/hw_dll.h
|
||||||
$(CC) $(CFLAGS) $(WFLAGS) -I/usr/X11R6/include -c $< -o $@
|
$(CC) $(CFLAGS) $(WFLAGS) -I/usr/X11R6/include -c $< -o $@
|
||||||
endif
|
endif
|
||||||
|
@ -902,24 +905,27 @@ ifndef NOHW
|
||||||
$(OBJDIR)/r_opengl.o: hardware/r_opengl/r_opengl.c hardware/r_opengl/r_opengl.h \
|
$(OBJDIR)/r_opengl.o: hardware/r_opengl/r_opengl.c hardware/r_opengl/r_opengl.h \
|
||||||
doomdef.h doomtype.h g_state.h m_swap.h hardware/hw_drv.h screen.h \
|
doomdef.h doomtype.h g_state.h m_swap.h hardware/hw_drv.h screen.h \
|
||||||
command.h hardware/hw_data.h hardware/hw_glide.h hardware/hw_defs.h \
|
command.h hardware/hw_data.h hardware/hw_glide.h hardware/hw_defs.h \
|
||||||
hardware/hw_md2.h hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.h am_map.h \
|
hardware/hw_md2.h hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.h \
|
||||||
d_event.h d_player.h p_pspr.h m_fixed.h tables.h info.h d_think.h \
|
hardware/hw_md2load.h hardware/hw_md3load.h hardware/hw_model.h hardware/u_list.h \
|
||||||
|
am_map.h d_event.h d_player.h p_pspr.h m_fixed.h tables.h info.h d_think.h \
|
||||||
p_mobj.h doomdata.h d_ticcmd.h r_defs.h hardware/hw_dll.h
|
p_mobj.h doomdata.h d_ticcmd.h r_defs.h hardware/hw_dll.h
|
||||||
$(CC) $(CFLAGS) $(WFLAGS) -D_WINDOWS -mwindows -c $< -o $@
|
$(CC) $(CFLAGS) $(WFLAGS) -D_WINDOWS -mwindows -c $< -o $@
|
||||||
|
|
||||||
$(OBJDIR)/ogl_win.o: hardware/r_opengl/ogl_win.c hardware/r_opengl/r_opengl.h \
|
$(OBJDIR)/ogl_win.o: hardware/r_opengl/ogl_win.c hardware/r_opengl/r_opengl.h \
|
||||||
doomdef.h doomtype.h g_state.h m_swap.h hardware/hw_drv.h screen.h \
|
doomdef.h doomtype.h g_state.h m_swap.h hardware/hw_drv.h screen.h \
|
||||||
command.h hardware/hw_data.h hardware/hw_glide.h hardware/hw_defs.h \
|
command.h hardware/hw_data.h hardware/hw_glide.h hardware/hw_defs.h \
|
||||||
hardware/hw_md2.h hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.h am_map.h \
|
hardware/hw_md2.h hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.h \
|
||||||
d_event.h d_player.h p_pspr.h m_fixed.h tables.h info.h d_think.h \
|
hardware/hw_md2load.h hardware/hw_md3load.h hardware/hw_model.h hardware/u_list.h \
|
||||||
|
am_map.h d_event.h d_player.h p_pspr.h m_fixed.h tables.h info.h d_think.h \
|
||||||
p_mobj.h doomdata.h d_ticcmd.h r_defs.h hardware/hw_dll.h
|
p_mobj.h doomdata.h d_ticcmd.h r_defs.h hardware/hw_dll.h
|
||||||
$(CC) $(CFLAGS) $(WFLAGS) -D_WINDOWS -mwindows -c $< -o $@
|
$(CC) $(CFLAGS) $(WFLAGS) -D_WINDOWS -mwindows -c $< -o $@
|
||||||
|
|
||||||
$(OBJDIR)/r_minigl.o: hardware/r_minigl/r_minigl.c hardware/r_opengl/r_opengl.h \
|
$(OBJDIR)/r_minigl.o: hardware/r_minigl/r_minigl.c hardware/r_opengl/r_opengl.h \
|
||||||
doomdef.h doomtype.h g_state.h m_swap.h hardware/hw_drv.h screen.h \
|
doomdef.h doomtype.h g_state.h m_swap.h hardware/hw_drv.h screen.h \
|
||||||
command.h hardware/hw_data.h hardware/hw_glide.h hardware/hw_defs.h \
|
command.h hardware/hw_data.h hardware/hw_glide.h hardware/hw_defs.h \
|
||||||
hardware/hw_md2.h hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.h am_map.h \
|
hardware/hw_md2.h hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.h \
|
||||||
d_event.h d_player.h p_pspr.h m_fixed.h tables.h info.h d_think.h \
|
hardware/hw_md2load.h hardware/hw_md3load.h hardware/hw_model.h hardware/u_list.h \
|
||||||
|
am_map.h d_event.h d_player.h p_pspr.h m_fixed.h tables.h info.h d_think.h \
|
||||||
p_mobj.h doomdata.h d_ticcmd.h r_defs.h hardware/hw_dll.h
|
p_mobj.h doomdata.h d_ticcmd.h r_defs.h hardware/hw_dll.h
|
||||||
$(CC) $(CFLAGS) $(WFLAGS) -D_WINDOWS -mwindows -c $< -o $@
|
$(CC) $(CFLAGS) $(WFLAGS) -D_WINDOWS -mwindows -c $< -o $@
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -271,13 +271,7 @@ void B_RespawnBot(INT32 playernum)
|
||||||
player->powers[pw_nocontrol] = sonic->player->powers[pw_nocontrol];
|
player->powers[pw_nocontrol] = sonic->player->powers[pw_nocontrol];
|
||||||
|
|
||||||
P_TeleportMove(tails, x, y, z);
|
P_TeleportMove(tails, x, y, z);
|
||||||
if (player->charability == CA_FLY)
|
P_SetPlayerMobjState(tails, S_KART_STND1); // SRB2kart - was S_PLAY_FALL1
|
||||||
{
|
|
||||||
P_SetPlayerMobjState(tails, S_KART_STND1); // SRB2kart - was S_PLAY_ABL1
|
|
||||||
tails->player->powers[pw_tailsfly] = (UINT16)-1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
P_SetPlayerMobjState(tails, S_KART_STND1); // SRB2kart - was S_PLAY_FALL1
|
|
||||||
P_SetScale(tails, sonic->scale);
|
P_SetScale(tails, sonic->scale);
|
||||||
tails->destscale = sonic->destscale;
|
tails->destscale = sonic->destscale;
|
||||||
}
|
}
|
||||||
|
|
|
@ -539,10 +539,41 @@ static void COM_ExecuteString(char *ptext)
|
||||||
{
|
{
|
||||||
CONS_Alert(CONS_WARNING, M_GetText("Alias recursion cycle detected!\n"));
|
CONS_Alert(CONS_WARNING, M_GetText("Alias recursion cycle detected!\n"));
|
||||||
recursion = 0;
|
recursion = 0;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
recursion++;
|
else
|
||||||
COM_BufInsertText(a->value);
|
{
|
||||||
|
char buf[1024];
|
||||||
|
char *write = buf, *read = a->value, *seek = read;
|
||||||
|
|
||||||
|
while ((seek = strchr(seek, '$')) != NULL)
|
||||||
|
{
|
||||||
|
memcpy(write, read, seek-read);
|
||||||
|
write += seek-read;
|
||||||
|
|
||||||
|
seek++;
|
||||||
|
|
||||||
|
if (*seek >= '1' && *seek <= '9')
|
||||||
|
{
|
||||||
|
if (com_argc > (size_t)(*seek - '0'))
|
||||||
|
{
|
||||||
|
memcpy(write, com_argv[*seek - '0'], strlen(com_argv[*seek - '0']));
|
||||||
|
write += strlen(com_argv[*seek - '0']);
|
||||||
|
}
|
||||||
|
seek++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*write = '$';
|
||||||
|
write++;
|
||||||
|
}
|
||||||
|
|
||||||
|
read = seek;
|
||||||
|
}
|
||||||
|
WRITESTRING(write, read);
|
||||||
|
|
||||||
|
recursion++;
|
||||||
|
COM_BufInsertText(buf);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -565,8 +596,6 @@ static void COM_ExecuteString(char *ptext)
|
||||||
static void COM_Alias_f(void)
|
static void COM_Alias_f(void)
|
||||||
{
|
{
|
||||||
cmdalias_t *a;
|
cmdalias_t *a;
|
||||||
char cmd[1024];
|
|
||||||
size_t i, c;
|
|
||||||
|
|
||||||
if (COM_Argc() < 3)
|
if (COM_Argc() < 3)
|
||||||
{
|
{
|
||||||
|
@ -579,19 +608,9 @@ static void COM_Alias_f(void)
|
||||||
com_alias = a;
|
com_alias = a;
|
||||||
|
|
||||||
a->name = Z_StrDup(COM_Argv(1));
|
a->name = Z_StrDup(COM_Argv(1));
|
||||||
|
// Just use arg 2 if it's the only other argument, in case the alias is wrapped in quotes (backward compat, or multiple commands in one string).
|
||||||
// copy the rest of the command line
|
// Otherwise pull the whole string and seek to the end of the alias name. The strctr is in case the alias is quoted.
|
||||||
cmd[0] = 0; // start out with a null string
|
a->value = Z_StrDup(COM_Argc() == 3 ? COM_Argv(2) : (strchr(COM_Args() + strlen(a->name), ' ') + 1));
|
||||||
c = COM_Argc();
|
|
||||||
for (i = 2; i < c; i++)
|
|
||||||
{
|
|
||||||
strcat(cmd, COM_Argv(i));
|
|
||||||
if (i != c)
|
|
||||||
strcat(cmd, " ");
|
|
||||||
}
|
|
||||||
strcat(cmd, "\n");
|
|
||||||
|
|
||||||
a->value = Z_StrDup(cmd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Prints a line of text to the console.
|
/** Prints a line of text to the console.
|
||||||
|
|
|
@ -91,12 +91,10 @@ tic_t jointimeout = (3*TICRATE);
|
||||||
static boolean sendingsavegame[MAXNETNODES]; // Are we sending the savegame?
|
static boolean sendingsavegame[MAXNETNODES]; // Are we sending the savegame?
|
||||||
static tic_t freezetimeout[MAXNETNODES]; // Until when can this node freeze the server before getting a timeout?
|
static tic_t freezetimeout[MAXNETNODES]; // Until when can this node freeze the server before getting a timeout?
|
||||||
|
|
||||||
#ifdef NEWPING
|
|
||||||
UINT16 pingmeasurecount = 1;
|
UINT16 pingmeasurecount = 1;
|
||||||
UINT32 realpingtable[MAXPLAYERS]; //the base table of ping where an average will be sent to everyone.
|
UINT32 realpingtable[MAXPLAYERS]; //the base table of ping where an average will be sent to everyone.
|
||||||
UINT32 playerpingtable[MAXPLAYERS]; //table of player latency values.
|
UINT32 playerpingtable[MAXPLAYERS]; //table of player latency values.
|
||||||
tic_t servermaxping = 800; // server's max ping. Defaults to 800
|
tic_t servermaxping = 800; // server's max ping. Defaults to 800
|
||||||
#endif
|
|
||||||
SINT8 nodetoplayer[MAXNETNODES];
|
SINT8 nodetoplayer[MAXNETNODES];
|
||||||
SINT8 nodetoplayer2[MAXNETNODES]; // say the numplayer for this node if any (splitscreen)
|
SINT8 nodetoplayer2[MAXNETNODES]; // say the numplayer for this node if any (splitscreen)
|
||||||
SINT8 nodetoplayer3[MAXNETNODES]; // say the numplayer for this node if any (splitscreen == 2)
|
SINT8 nodetoplayer3[MAXNETNODES]; // say the numplayer for this node if any (splitscreen == 2)
|
||||||
|
@ -586,21 +584,7 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
|
||||||
rsp->kartspeed = (UINT8)players[i].kartspeed;
|
rsp->kartspeed = (UINT8)players[i].kartspeed;
|
||||||
rsp->kartweight = (UINT8)players[i].kartweight;
|
rsp->kartweight = (UINT8)players[i].kartweight;
|
||||||
//
|
//
|
||||||
rsp->normalspeed = (fixed_t)LONG(players[i].normalspeed);
|
|
||||||
rsp->runspeed = (fixed_t)LONG(players[i].runspeed);
|
|
||||||
rsp->thrustfactor = players[i].thrustfactor;
|
|
||||||
rsp->accelstart = players[i].accelstart;
|
|
||||||
rsp->acceleration = players[i].acceleration;
|
|
||||||
rsp->charability = players[i].charability;
|
|
||||||
rsp->charability2 = players[i].charability2;
|
|
||||||
rsp->charflags = (UINT32)LONG(players[i].charflags);
|
rsp->charflags = (UINT32)LONG(players[i].charflags);
|
||||||
rsp->thokitem = (UINT32)LONG(players[i].thokitem); //mobjtype_t
|
|
||||||
rsp->spinitem = (UINT32)LONG(players[i].spinitem); //mobjtype_t
|
|
||||||
rsp->revitem = (UINT32)LONG(players[i].revitem); //mobjtype_t
|
|
||||||
rsp->actionspd = (fixed_t)LONG(players[i].actionspd);
|
|
||||||
rsp->mindash = (fixed_t)LONG(players[i].mindash);
|
|
||||||
rsp->maxdash = (fixed_t)LONG(players[i].maxdash);
|
|
||||||
rsp->jumpfactor = (fixed_t)LONG(players[i].jumpfactor);
|
|
||||||
|
|
||||||
rsp->speed = (fixed_t)LONG(players[i].speed);
|
rsp->speed = (fixed_t)LONG(players[i].speed);
|
||||||
rsp->jumping = players[i].jumping;
|
rsp->jumping = players[i].jumping;
|
||||||
|
@ -723,21 +707,7 @@ static void resynch_read_player(resynch_pak *rsp)
|
||||||
players[i].kartspeed = (UINT8)rsp->kartspeed;
|
players[i].kartspeed = (UINT8)rsp->kartspeed;
|
||||||
players[i].kartweight = (UINT8)rsp->kartweight;
|
players[i].kartweight = (UINT8)rsp->kartweight;
|
||||||
|
|
||||||
players[i].normalspeed = (fixed_t)LONG(rsp->normalspeed);
|
|
||||||
players[i].runspeed = (fixed_t)LONG(rsp->runspeed);
|
|
||||||
players[i].thrustfactor = rsp->thrustfactor;
|
|
||||||
players[i].accelstart = rsp->accelstart;
|
|
||||||
players[i].acceleration = rsp->acceleration;
|
|
||||||
players[i].charability = rsp->charability;
|
|
||||||
players[i].charability2 = rsp->charability2;
|
|
||||||
players[i].charflags = (UINT32)LONG(rsp->charflags);
|
players[i].charflags = (UINT32)LONG(rsp->charflags);
|
||||||
players[i].thokitem = (UINT32)LONG(rsp->thokitem); //mobjtype_t
|
|
||||||
players[i].spinitem = (UINT32)LONG(rsp->spinitem); //mobjtype_t
|
|
||||||
players[i].revitem = (UINT32)LONG(rsp->revitem); //mobjtype_t
|
|
||||||
players[i].actionspd = (fixed_t)LONG(rsp->actionspd);
|
|
||||||
players[i].mindash = (fixed_t)LONG(rsp->mindash);
|
|
||||||
players[i].maxdash = (fixed_t)LONG(rsp->maxdash);
|
|
||||||
players[i].jumpfactor = (fixed_t)LONG(rsp->jumpfactor);
|
|
||||||
|
|
||||||
players[i].speed = (fixed_t)LONG(rsp->speed);
|
players[i].speed = (fixed_t)LONG(rsp->speed);
|
||||||
players[i].jumping = rsp->jumping;
|
players[i].jumping = rsp->jumping;
|
||||||
|
@ -3080,12 +3050,10 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
|
||||||
HU_AddChatText(va("\x82*%s has been kicked (Go away)", player_names[pnum]), false);
|
HU_AddChatText(va("\x82*%s has been kicked (Go away)", player_names[pnum]), false);
|
||||||
kickreason = KR_KICK;
|
kickreason = KR_KICK;
|
||||||
break;
|
break;
|
||||||
#ifdef NEWPING
|
|
||||||
case KICK_MSG_PING_HIGH:
|
case KICK_MSG_PING_HIGH:
|
||||||
HU_AddChatText(va("\x82*%s left the game (Broke ping limit)", player_names[pnum]), false);
|
HU_AddChatText(va("\x82*%s left the game (Broke ping limit)", player_names[pnum]), false);
|
||||||
kickreason = KR_PINGLIMIT;
|
kickreason = KR_PINGLIMIT;
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
case KICK_MSG_CON_FAIL:
|
case KICK_MSG_CON_FAIL:
|
||||||
HU_AddChatText(va("\x82*%s left the game (Synch Failure)", player_names[pnum]), false);
|
HU_AddChatText(va("\x82*%s left the game (Synch Failure)", player_names[pnum]), false);
|
||||||
kickreason = KR_SYNCH;
|
kickreason = KR_SYNCH;
|
||||||
|
@ -3158,10 +3126,8 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
|
||||||
D_StartTitle();
|
D_StartTitle();
|
||||||
if (msg == KICK_MSG_CON_FAIL)
|
if (msg == KICK_MSG_CON_FAIL)
|
||||||
M_StartMessage(M_GetText("Server closed connection\n(Synch failure)\nPress ESC\n"), NULL, MM_NOTHING);
|
M_StartMessage(M_GetText("Server closed connection\n(Synch failure)\nPress ESC\n"), NULL, MM_NOTHING);
|
||||||
#ifdef NEWPING
|
|
||||||
else if (msg == KICK_MSG_PING_HIGH)
|
else if (msg == KICK_MSG_PING_HIGH)
|
||||||
M_StartMessage(M_GetText("Server closed connection\n(Broke ping limit)\nPress ESC\n"), NULL, MM_NOTHING);
|
M_StartMessage(M_GetText("Server closed connection\n(Broke ping limit)\nPress ESC\n"), NULL, MM_NOTHING);
|
||||||
#endif
|
|
||||||
else if (msg == KICK_MSG_BANNED)
|
else if (msg == KICK_MSG_BANNED)
|
||||||
M_StartMessage(M_GetText("You have been banned by the server\n\nPress ESC\n"), NULL, MM_NOTHING);
|
M_StartMessage(M_GetText("You have been banned by the server\n\nPress ESC\n"), NULL, MM_NOTHING);
|
||||||
else if (msg == KICK_MSG_CUSTOM_KICK)
|
else if (msg == KICK_MSG_CUSTOM_KICK)
|
||||||
|
@ -3205,15 +3171,15 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
|
||||||
static CV_PossibleValue_t netticbuffer_cons_t[] = {{0, "MIN"}, {3, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t netticbuffer_cons_t[] = {{0, "MIN"}, {3, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_netticbuffer = {"netticbuffer", "1", CV_SAVE, netticbuffer_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_netticbuffer = {"netticbuffer", "1", CV_SAVE, netticbuffer_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_allownewplayer = {"allowjoin", "On", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL };
|
consvar_t cv_allownewplayer = {"allowjoin", "On", CV_SAVE|CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL };
|
||||||
#ifdef VANILLAJOINNEXTROUND
|
#ifdef VANILLAJOINNEXTROUND
|
||||||
consvar_t cv_joinnextround = {"joinnextround", "Off", CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; /// \todo not done
|
consvar_t cv_joinnextround = {"joinnextround", "Off", CV_SAVE|CV_NETVAR, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; /// \todo not done
|
||||||
#endif
|
#endif
|
||||||
static CV_PossibleValue_t maxplayers_cons_t[] = {{2, "MIN"}, {MAXPLAYERS, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t maxplayers_cons_t[] = {{2, "MIN"}, {MAXPLAYERS, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_maxplayers = {"maxplayers", "8", CV_SAVE, maxplayers_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_maxplayers = {"maxplayers", "8", CV_SAVE, maxplayers_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
static CV_PossibleValue_t resynchattempts_cons_t[] = {{0, "MIN"}, {20, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t resynchattempts_cons_t[] = {{0, "MIN"}, {20, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_resynchattempts = {"resynchattempts", "5", CV_SAVE, resynchattempts_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL };
|
consvar_t cv_resynchattempts = {"resynchattempts", "5", CV_SAVE, resynchattempts_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL };
|
||||||
consvar_t cv_blamecfail = {"blamecfail", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL };
|
consvar_t cv_blamecfail = {"blamecfail", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL };
|
||||||
|
|
||||||
// max file size to send to a player (in kilobytes)
|
// max file size to send to a player (in kilobytes)
|
||||||
static CV_PossibleValue_t maxsend_cons_t[] = {{0, "MIN"}, {51200, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t maxsend_cons_t[] = {{0, "MIN"}, {51200, "MAX"}, {0, NULL}};
|
||||||
|
@ -3256,12 +3222,6 @@ void D_ClientServerInit(void)
|
||||||
RegisterNetXCmd(XD_ADDPLAYER, Got_AddPlayer);
|
RegisterNetXCmd(XD_ADDPLAYER, Got_AddPlayer);
|
||||||
RegisterNetXCmd(XD_REMOVEPLAYER, Got_RemovePlayer);
|
RegisterNetXCmd(XD_REMOVEPLAYER, Got_RemovePlayer);
|
||||||
#ifndef NONET
|
#ifndef NONET
|
||||||
CV_RegisterVar(&cv_allownewplayer);
|
|
||||||
#ifdef VANILLAJOINNEXTROUND
|
|
||||||
CV_RegisterVar(&cv_joinnextround);
|
|
||||||
#endif
|
|
||||||
CV_RegisterVar(&cv_showjoinaddress);
|
|
||||||
CV_RegisterVar(&cv_blamecfail);
|
|
||||||
#ifdef DUMPCONSISTENCY
|
#ifdef DUMPCONSISTENCY
|
||||||
CV_RegisterVar(&cv_dumpconsistency);
|
CV_RegisterVar(&cv_dumpconsistency);
|
||||||
#endif
|
#endif
|
||||||
|
@ -4602,7 +4562,6 @@ FILESTAMP
|
||||||
resynch_local_inprogress = true;
|
resynch_local_inprogress = true;
|
||||||
CL_AcknowledgeResynch(&netbuffer->u.resynchpak);
|
CL_AcknowledgeResynch(&netbuffer->u.resynchpak);
|
||||||
break;
|
break;
|
||||||
#ifdef NEWPING
|
|
||||||
case PT_PING:
|
case PT_PING:
|
||||||
// Only accept PT_PING from the server.
|
// Only accept PT_PING from the server.
|
||||||
if (node != servernode)
|
if (node != servernode)
|
||||||
|
@ -4632,7 +4591,6 @@ FILESTAMP
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
case PT_SERVERCFG:
|
case PT_SERVERCFG:
|
||||||
break;
|
break;
|
||||||
case PT_FILEFRAGMENT:
|
case PT_FILEFRAGMENT:
|
||||||
|
@ -5270,7 +5228,6 @@ void TryRunTics(tic_t realtics)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NEWPING
|
|
||||||
|
|
||||||
/* Ping Update except better:
|
/* Ping Update except better:
|
||||||
We call this once per second and check for people's pings. If their ping happens to be too high, we increment some timer and kick them out.
|
We call this once per second and check for people's pings. If their ping happens to be too high, we increment some timer and kick them out.
|
||||||
|
@ -5354,11 +5311,9 @@ static inline void PingUpdate(void)
|
||||||
|
|
||||||
pingmeasurecount = 1; //Reset count
|
pingmeasurecount = 1; //Reset count
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static tic_t gametime = 0;
|
static tic_t gametime = 0;
|
||||||
|
|
||||||
#ifdef NEWPING
|
|
||||||
static void UpdatePingTable(void)
|
static void UpdatePingTable(void)
|
||||||
{
|
{
|
||||||
INT32 i;
|
INT32 i;
|
||||||
|
@ -5373,7 +5328,6 @@ static void UpdatePingTable(void)
|
||||||
pingmeasurecount++;
|
pingmeasurecount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// Handle timeouts to prevent definitive freezes from happenning
|
// Handle timeouts to prevent definitive freezes from happenning
|
||||||
static void HandleNodeTimeouts(void)
|
static void HandleNodeTimeouts(void)
|
||||||
|
@ -5398,9 +5352,7 @@ void NetKeepAlive(void)
|
||||||
if (realtics <= 0) // nothing new to update
|
if (realtics <= 0) // nothing new to update
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef NEWPING
|
|
||||||
UpdatePingTable();
|
UpdatePingTable();
|
||||||
#endif
|
|
||||||
|
|
||||||
if (server)
|
if (server)
|
||||||
CL_SendClientKeepAlive();
|
CL_SendClientKeepAlive();
|
||||||
|
@ -5447,9 +5399,7 @@ void NetUpdate(void)
|
||||||
|
|
||||||
gametime = nowtime;
|
gametime = nowtime;
|
||||||
|
|
||||||
#ifdef NEWPING
|
|
||||||
UpdatePingTable();
|
UpdatePingTable();
|
||||||
#endif
|
|
||||||
|
|
||||||
if (client)
|
if (client)
|
||||||
maketic = neededtic;
|
maketic = neededtic;
|
||||||
|
|
|
@ -93,9 +93,7 @@ typedef enum
|
||||||
PT_NODETIMEOUT, // Packet sent to self if the connection times out.
|
PT_NODETIMEOUT, // Packet sent to self if the connection times out.
|
||||||
PT_RESYNCHING, // Packet sent to resync players.
|
PT_RESYNCHING, // Packet sent to resync players.
|
||||||
// Blocks game advance until synched.
|
// Blocks game advance until synched.
|
||||||
#ifdef NEWPING
|
|
||||||
PT_PING, // Packet sent to tell clients the other client's latency to server.
|
PT_PING, // Packet sent to tell clients the other client's latency to server.
|
||||||
#endif
|
|
||||||
NUMPACKETTYPE
|
NUMPACKETTYPE
|
||||||
} packettype_t;
|
} packettype_t;
|
||||||
|
|
||||||
|
@ -224,21 +222,7 @@ typedef struct
|
||||||
UINT8 kartspeed;
|
UINT8 kartspeed;
|
||||||
UINT8 kartweight;
|
UINT8 kartweight;
|
||||||
//
|
//
|
||||||
fixed_t normalspeed;
|
|
||||||
fixed_t runspeed;
|
|
||||||
UINT8 thrustfactor;
|
|
||||||
UINT8 accelstart;
|
|
||||||
UINT8 acceleration;
|
|
||||||
UINT8 charability;
|
|
||||||
UINT8 charability2;
|
|
||||||
UINT32 charflags;
|
UINT32 charflags;
|
||||||
UINT32 thokitem; // mobjtype_t
|
|
||||||
UINT32 spinitem; // mobjtype_t
|
|
||||||
UINT32 revitem; // mobjtype_t
|
|
||||||
fixed_t actionspd;
|
|
||||||
fixed_t mindash;
|
|
||||||
fixed_t maxdash;
|
|
||||||
fixed_t jumpfactor;
|
|
||||||
|
|
||||||
fixed_t speed;
|
fixed_t speed;
|
||||||
UINT8 jumping;
|
UINT8 jumping;
|
||||||
|
@ -473,9 +457,7 @@ typedef struct
|
||||||
msaskinfo_pak msaskinfo; // 22 bytes
|
msaskinfo_pak msaskinfo; // 22 bytes
|
||||||
plrinfo playerinfo[MAXPLAYERS]; // 576 bytes(?)
|
plrinfo playerinfo[MAXPLAYERS]; // 576 bytes(?)
|
||||||
plrconfig playerconfig[MAXPLAYERS]; // (up to) 528 bytes(?)
|
plrconfig playerconfig[MAXPLAYERS]; // (up to) 528 bytes(?)
|
||||||
#ifdef NEWPING
|
|
||||||
UINT32 pingtable[MAXPLAYERS+1]; // 68 bytes
|
UINT32 pingtable[MAXPLAYERS+1]; // 68 bytes
|
||||||
#endif
|
|
||||||
} u; // This is needed to pack diff packet types data together
|
} u; // This is needed to pack diff packet types data together
|
||||||
} ATTRPACK doomdata_t;
|
} ATTRPACK doomdata_t;
|
||||||
|
|
||||||
|
@ -509,9 +491,7 @@ extern consvar_t cv_playbackspeed;
|
||||||
#define KICK_MSG_PLAYER_QUIT 3
|
#define KICK_MSG_PLAYER_QUIT 3
|
||||||
#define KICK_MSG_TIMEOUT 4
|
#define KICK_MSG_TIMEOUT 4
|
||||||
#define KICK_MSG_BANNED 5
|
#define KICK_MSG_BANNED 5
|
||||||
#ifdef NEWPING
|
|
||||||
#define KICK_MSG_PING_HIGH 6
|
#define KICK_MSG_PING_HIGH 6
|
||||||
#endif
|
|
||||||
#define KICK_MSG_CUSTOM_KICK 7
|
#define KICK_MSG_CUSTOM_KICK 7
|
||||||
#define KICK_MSG_CUSTOM_BAN 8
|
#define KICK_MSG_CUSTOM_BAN 8
|
||||||
|
|
||||||
|
@ -537,12 +517,10 @@ extern char connectedservername[MAXSERVERNAME];
|
||||||
void Command_Ping_f(void);
|
void Command_Ping_f(void);
|
||||||
extern tic_t connectiontimeout;
|
extern tic_t connectiontimeout;
|
||||||
extern tic_t jointimeout;
|
extern tic_t jointimeout;
|
||||||
#ifdef NEWPING
|
|
||||||
extern UINT16 pingmeasurecount;
|
extern UINT16 pingmeasurecount;
|
||||||
extern UINT32 realpingtable[MAXPLAYERS];
|
extern UINT32 realpingtable[MAXPLAYERS];
|
||||||
extern UINT32 playerpingtable[MAXPLAYERS];
|
extern UINT32 playerpingtable[MAXPLAYERS];
|
||||||
extern tic_t servermaxping;
|
extern tic_t servermaxping;
|
||||||
#endif
|
|
||||||
|
|
||||||
extern consvar_t
|
extern consvar_t
|
||||||
#ifdef VANILLAJOINNEXTROUND
|
#ifdef VANILLAJOINNEXTROUND
|
||||||
|
|
|
@ -614,9 +614,6 @@ void D_SRB2Loop(void)
|
||||||
if (dedicated)
|
if (dedicated)
|
||||||
server = true;
|
server = true;
|
||||||
|
|
||||||
if (M_CheckParm("-voodoo")) // 256x256 Texture Limiter
|
|
||||||
COM_BufAddText("gr_voodoocompatibility on\n");
|
|
||||||
|
|
||||||
// Pushing of + parameters is now done back in D_SRB2Main, not here.
|
// Pushing of + parameters is now done back in D_SRB2Main, not here.
|
||||||
|
|
||||||
CONS_Printf("I_StartupKeyboard()...\n");
|
CONS_Printf("I_StartupKeyboard()...\n");
|
||||||
|
|
125
src/d_net.c
125
src/d_net.c
|
@ -185,22 +185,10 @@ typedef struct
|
||||||
UINT8 nextacknum;
|
UINT8 nextacknum;
|
||||||
|
|
||||||
UINT8 flags;
|
UINT8 flags;
|
||||||
#ifndef NEWPING
|
|
||||||
// jacobson tcp timeout evaluation algorithm (Karn variation)
|
|
||||||
fixed_t ping;
|
|
||||||
fixed_t varping;
|
|
||||||
INT32 timeout; // computed with ping and varping
|
|
||||||
#endif
|
|
||||||
} node_t;
|
} node_t;
|
||||||
|
|
||||||
static node_t nodes[MAXNETNODES];
|
static node_t nodes[MAXNETNODES];
|
||||||
#ifndef NEWPING
|
#define NODETIMEOUT 14
|
||||||
#define PINGDEFAULT ((200*TICRATE*FRACUNIT)/1000)
|
|
||||||
#define VARPINGDEFAULT ((50*TICRATE*FRACUNIT)/1000)
|
|
||||||
#define TIMEOUT(p,v) (p+4*v+FRACUNIT/2)>>FRACBITS;
|
|
||||||
#else
|
|
||||||
#define NODETIMEOUT 14 //What the above boiled down to...
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NONET
|
#ifndef NONET
|
||||||
// return <0 if a < b (mod 256)
|
// return <0 if a < b (mod 256)
|
||||||
|
@ -320,19 +308,7 @@ static UINT8 GetAcktosend(INT32 node)
|
||||||
static void RemoveAck(INT32 i)
|
static void RemoveAck(INT32 i)
|
||||||
{
|
{
|
||||||
INT32 node = ackpak[i].destinationnode;
|
INT32 node = ackpak[i].destinationnode;
|
||||||
#ifndef NEWPING
|
|
||||||
fixed_t trueping = (I_GetTime() - ackpak[i].senttime)<<FRACBITS;
|
|
||||||
if (ackpak[i].resentnum)
|
|
||||||
{
|
|
||||||
// +FRACUNIT/2 for round
|
|
||||||
nodes[node].ping = (nodes[node].ping*7 + trueping)/8;
|
|
||||||
nodes[node].varping = (nodes[node].varping*7 + abs(nodes[node].ping-trueping))/8;
|
|
||||||
nodes[node].timeout = TIMEOUT(nodes[node].ping,nodes[node].varping);
|
|
||||||
}
|
|
||||||
DEBFILE(va("Remove ack %d trueping %d ping %f var %f timeout %d\n",ackpak[i].acknum,trueping>>FRACBITS,(double)FIXED_TO_FLOAT(nodes[node].ping),(double)FIXED_TO_FLOAT(nodes[node].varping),nodes[node].timeout));
|
|
||||||
#else
|
|
||||||
DEBFILE(va("Remove ack %d\n",ackpak[i].acknum));
|
DEBFILE(va("Remove ack %d\n",ackpak[i].acknum));
|
||||||
#endif
|
|
||||||
ackpak[i].acknum = 0;
|
ackpak[i].acknum = 0;
|
||||||
if (nodes[node].flags & NF_CLOSE)
|
if (nodes[node].flags & NF_CLOSE)
|
||||||
Net_CloseConnection(node);
|
Net_CloseConnection(node);
|
||||||
|
@ -519,11 +495,7 @@ void Net_AckTicker(void)
|
||||||
{
|
{
|
||||||
const INT32 nodei = ackpak[i].destinationnode;
|
const INT32 nodei = ackpak[i].destinationnode;
|
||||||
node_t *node = &nodes[nodei];
|
node_t *node = &nodes[nodei];
|
||||||
#ifdef NEWPING
|
|
||||||
if (ackpak[i].acknum && ackpak[i].senttime + NODETIMEOUT < I_GetTime())
|
if (ackpak[i].acknum && ackpak[i].senttime + NODETIMEOUT < I_GetTime())
|
||||||
#else
|
|
||||||
if (ackpak[i].acknum && ackpak[i].senttime + node->timeout < I_GetTime())
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
if (ackpak[i].resentnum > 10 && (node->flags & NF_CLOSE))
|
if (ackpak[i].resentnum > 10 && (node->flags & NF_CLOSE))
|
||||||
{
|
{
|
||||||
|
@ -534,13 +506,8 @@ void Net_AckTicker(void)
|
||||||
ackpak[i].acknum = 0;
|
ackpak[i].acknum = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#ifdef NEWPING
|
|
||||||
DEBFILE(va("Resend ack %d, %u<%d at %u\n", ackpak[i].acknum, ackpak[i].senttime,
|
DEBFILE(va("Resend ack %d, %u<%d at %u\n", ackpak[i].acknum, ackpak[i].senttime,
|
||||||
NODETIMEOUT, I_GetTime()));
|
NODETIMEOUT, I_GetTime()));
|
||||||
#else
|
|
||||||
DEBFILE(va("Resend ack %d, %u<%d at %u\n", ackpak[i].acknum, ackpak[i].senttime,
|
|
||||||
node->timeout, I_GetTime()));
|
|
||||||
#endif
|
|
||||||
M_Memcpy(netbuffer, ackpak[i].pak.raw, ackpak[i].length);
|
M_Memcpy(netbuffer, ackpak[i].pak.raw, ackpak[i].length);
|
||||||
ackpak[i].senttime = I_GetTime();
|
ackpak[i].senttime = I_GetTime();
|
||||||
ackpak[i].resentnum++;
|
ackpak[i].resentnum++;
|
||||||
|
@ -658,11 +625,6 @@ void Net_WaitAllAckReceived(UINT32 timeout)
|
||||||
static void InitNode(node_t *node)
|
static void InitNode(node_t *node)
|
||||||
{
|
{
|
||||||
node->acktosend_head = node->acktosend_tail = 0;
|
node->acktosend_head = node->acktosend_tail = 0;
|
||||||
#ifndef NEWPING
|
|
||||||
node->ping = PINGDEFAULT;
|
|
||||||
node->varping = VARPINGDEFAULT;
|
|
||||||
node->timeout = TIMEOUT(node->ping, node->varping);
|
|
||||||
#endif
|
|
||||||
node->firstacktosend = 0;
|
node->firstacktosend = 0;
|
||||||
node->nextacknum = 1;
|
node->nextacknum = 1;
|
||||||
node->remotefirstack = 0;
|
node->remotefirstack = 0;
|
||||||
|
@ -854,9 +816,7 @@ static const char *packettypename[NUMPACKETTYPE] =
|
||||||
"CLIENTJOIN",
|
"CLIENTJOIN",
|
||||||
"NODETIMEOUT",
|
"NODETIMEOUT",
|
||||||
"RESYNCHING",
|
"RESYNCHING",
|
||||||
#ifdef NEWPING
|
|
||||||
"PING"
|
"PING"
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void DebugPrintpacket(const char *header)
|
static void DebugPrintpacket(const char *header)
|
||||||
|
@ -1410,30 +1370,73 @@ boolean D_CheckNetGame(void)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct pingcell
|
||||||
|
{
|
||||||
|
INT32 num;
|
||||||
|
INT32 ms;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int pingcellcmp(const void *va, const void *vb)
|
||||||
|
{
|
||||||
|
const struct pingcell *a, *b;
|
||||||
|
a = va;
|
||||||
|
b = vb;
|
||||||
|
return ( a->ms - b->ms );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
New ping command formatted nicely to present ping in
|
||||||
|
ascending order. And with equally spaced columns.
|
||||||
|
The caller's ping is presented at the bottom too, for
|
||||||
|
convenience.
|
||||||
|
*/
|
||||||
|
|
||||||
void Command_Ping_f(void)
|
void Command_Ping_f(void)
|
||||||
{
|
{
|
||||||
#ifndef NEWPING
|
struct pingcell pingv[MAXPLAYERS];
|
||||||
if(server)
|
INT32 pingc;
|
||||||
|
|
||||||
|
int name_width = 0;
|
||||||
|
int ms_width = 0;
|
||||||
|
|
||||||
|
int n;
|
||||||
|
INT32 i;
|
||||||
|
|
||||||
|
pingc = 0;
|
||||||
|
for (i = 1; i < MAXPLAYERS; ++i)
|
||||||
|
if (playeringame[i])
|
||||||
{
|
{
|
||||||
#endif
|
n = strlen(player_names[i]);
|
||||||
INT32 i;
|
if (n > name_width)
|
||||||
for (i = 0; i < MAXPLAYERS;i++)
|
name_width = n;
|
||||||
{
|
|
||||||
#ifndef NEWPING
|
n = playerpingtable[i];
|
||||||
const INT32 node = playernode[i];
|
if (n > ms_width)
|
||||||
if (playeringame[i] && node != 0)
|
ms_width = n;
|
||||||
CONS_Printf(M_GetText("%.2d : %s\n %d tics, %d ms.\n"), i, player_names[i],
|
|
||||||
GetLag(node), G_TicsToMilliseconds(GetLag(node)));
|
pingv[pingc].num = i;
|
||||||
#else
|
pingv[pingc].ms = playerpingtable[i];
|
||||||
if (playeringame[i] && i != 0)
|
pingc++;
|
||||||
CONS_Printf(M_GetText("%.2d : %s\n %d ms\n"), i, player_names[i], playerpingtable[i]);
|
}
|
||||||
#endif
|
|
||||||
}
|
if (ms_width < 10) ms_width = 1;
|
||||||
#ifndef NEWPING
|
else if (ms_width < 100) ms_width = 2;
|
||||||
|
else ms_width = 3;
|
||||||
|
|
||||||
|
qsort(pingv, pingc, sizeof (struct pingcell), &pingcellcmp);
|
||||||
|
|
||||||
|
for (i = 0; i < pingc; ++i)
|
||||||
|
{
|
||||||
|
CONS_Printf("%02d : %-*s %*d ms\n",
|
||||||
|
pingv[i].num,
|
||||||
|
name_width, player_names[pingv[i].num],
|
||||||
|
ms_width, pingv[i].ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!server && playeringame[consoleplayer])
|
||||||
|
{
|
||||||
|
CONS_Printf("\nYour ping is %d ms\n", playerpingtable[consoleplayer]);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
CONS_Printf(M_GetText("Only the server can use this.\n"));
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void D_CloseConnection(void)
|
void D_CloseConnection(void)
|
||||||
|
|
|
@ -437,7 +437,6 @@ static CV_PossibleValue_t nettimeout_cons_t[] = {{TICRATE/7, "MIN"}, {60*TICRATE
|
||||||
consvar_t cv_nettimeout = {"nettimeout", "105", CV_CALL|CV_SAVE, nettimeout_cons_t, NetTimeout_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_nettimeout = {"nettimeout", "105", CV_CALL|CV_SAVE, nettimeout_cons_t, NetTimeout_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
//static CV_PossibleValue_t jointimeout_cons_t[] = {{5*TICRATE, "MIN"}, {60*TICRATE, "MAX"}, {0, NULL}};
|
//static CV_PossibleValue_t jointimeout_cons_t[] = {{5*TICRATE, "MIN"}, {60*TICRATE, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_jointimeout = {"jointimeout", "105", CV_CALL|CV_SAVE, nettimeout_cons_t, JoinTimeout_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_jointimeout = {"jointimeout", "105", CV_CALL|CV_SAVE, nettimeout_cons_t, JoinTimeout_OnChange, 0, NULL, NULL, 0, 0, NULL};
|
||||||
#ifdef NEWPING
|
|
||||||
static CV_PossibleValue_t maxping_cons_t[] = {{0, "MIN"}, {1000, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t maxping_cons_t[] = {{0, "MIN"}, {1000, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_maxping = {"maxping", "800", CV_SAVE, maxping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_maxping = {"maxping", "800", CV_SAVE, maxping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
@ -448,7 +447,6 @@ consvar_t cv_pingtimeout = {"pingtimeout", "10", CV_SAVE, pingtimeout_cons_t, NU
|
||||||
static CV_PossibleValue_t showping_cons_t[] = {{0, "Off"}, {1, "Always"}, {2, "Warning"}, {0, NULL}};
|
static CV_PossibleValue_t showping_cons_t[] = {{0, "Off"}, {1, "Always"}, {2, "Warning"}, {0, NULL}};
|
||||||
consvar_t cv_showping = {"showping", "Always", CV_SAVE, showping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_showping = {"showping", "Always", CV_SAVE, showping_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
#endif
|
|
||||||
// Intermission time Tails 04-19-2002
|
// Intermission time Tails 04-19-2002
|
||||||
static CV_PossibleValue_t inttime_cons_t[] = {{0, "MIN"}, {3600, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t inttime_cons_t[] = {{0, "MIN"}, {3600, "MAX"}, {0, NULL}};
|
||||||
consvar_t cv_inttime = {"inttime", "20", CV_NETVAR, inttime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_inttime = {"inttime", "20", CV_NETVAR, inttime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
@ -681,6 +679,14 @@ void D_RegisterServerCommands(void)
|
||||||
CV_RegisterVar(&cv_maxsend);
|
CV_RegisterVar(&cv_maxsend);
|
||||||
CV_RegisterVar(&cv_noticedownload);
|
CV_RegisterVar(&cv_noticedownload);
|
||||||
CV_RegisterVar(&cv_downloadspeed);
|
CV_RegisterVar(&cv_downloadspeed);
|
||||||
|
#ifndef NONET
|
||||||
|
CV_RegisterVar(&cv_allownewplayer);
|
||||||
|
#ifdef VANILLAJOINNEXTROUND
|
||||||
|
CV_RegisterVar(&cv_joinnextround);
|
||||||
|
#endif
|
||||||
|
CV_RegisterVar(&cv_showjoinaddress);
|
||||||
|
CV_RegisterVar(&cv_blamecfail);
|
||||||
|
#endif
|
||||||
|
|
||||||
COM_AddCommand("ping", Command_Ping_f);
|
COM_AddCommand("ping", Command_Ping_f);
|
||||||
CV_RegisterVar(&cv_nettimeout);
|
CV_RegisterVar(&cv_nettimeout);
|
||||||
|
@ -688,11 +694,9 @@ void D_RegisterServerCommands(void)
|
||||||
|
|
||||||
CV_RegisterVar(&cv_skipmapcheck);
|
CV_RegisterVar(&cv_skipmapcheck);
|
||||||
CV_RegisterVar(&cv_sleep);
|
CV_RegisterVar(&cv_sleep);
|
||||||
#ifdef NEWPING
|
|
||||||
CV_RegisterVar(&cv_maxping);
|
CV_RegisterVar(&cv_maxping);
|
||||||
CV_RegisterVar(&cv_pingtimeout);
|
CV_RegisterVar(&cv_pingtimeout);
|
||||||
CV_RegisterVar(&cv_showping);
|
CV_RegisterVar(&cv_showping);
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SEENAMES
|
#ifdef SEENAMES
|
||||||
CV_RegisterVar(&cv_allowseenames);
|
CV_RegisterVar(&cv_allowseenames);
|
||||||
|
@ -877,6 +881,10 @@ void D_RegisterClientCommands(void)
|
||||||
CV_RegisterVar(&cv_driftaxis2);
|
CV_RegisterVar(&cv_driftaxis2);
|
||||||
CV_RegisterVar(&cv_driftaxis3);
|
CV_RegisterVar(&cv_driftaxis3);
|
||||||
CV_RegisterVar(&cv_driftaxis4);
|
CV_RegisterVar(&cv_driftaxis4);
|
||||||
|
CV_RegisterVar(&cv_deadzone);
|
||||||
|
CV_RegisterVar(&cv_deadzone2);
|
||||||
|
CV_RegisterVar(&cv_deadzone3);
|
||||||
|
CV_RegisterVar(&cv_deadzone4);
|
||||||
|
|
||||||
// filesrch.c
|
// filesrch.c
|
||||||
CV_RegisterVar(&cv_addons_option);
|
CV_RegisterVar(&cv_addons_option);
|
||||||
|
@ -2427,12 +2435,14 @@ static void Command_Map_f(void)
|
||||||
const char *mapname;
|
const char *mapname;
|
||||||
size_t i;
|
size_t i;
|
||||||
INT32 j, newmapnum;
|
INT32 j, newmapnum;
|
||||||
boolean newresetplayers;
|
boolean newresetplayers, newencoremode;
|
||||||
INT32 newgametype = gametype;
|
INT32 newgametype = gametype;
|
||||||
|
|
||||||
// max length of command: map map03 -gametype coop -noresetplayers -force
|
// max length of command: map map03 -gametype race -noresetplayers -force -encore
|
||||||
// 1 2 3 4 5 6
|
// 1 2 3 4 5 6 7
|
||||||
// = 8 arg max
|
// = 8 arg max
|
||||||
|
// i don't know whether this is intrinsic to the system or just someone being weird but
|
||||||
|
// "noresetplayers" is pretty useless for kart if it turns out this is too close to the limit
|
||||||
if (COM_Argc() < 2 || COM_Argc() > 8)
|
if (COM_Argc() < 2 || COM_Argc() > 8)
|
||||||
{
|
{
|
||||||
CONS_Printf(M_GetText("map <mapname> [-gametype <type> [-force]: warp to map\n"));
|
CONS_Printf(M_GetText("map <mapname> [-gametype <type> [-force]: warp to map\n"));
|
||||||
|
@ -2515,6 +2525,21 @@ static void Command_Map_f(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// new encoremode value
|
||||||
|
// use cvar by default
|
||||||
|
|
||||||
|
newencoremode = (boolean)cv_kartencore.value;
|
||||||
|
|
||||||
|
if (COM_CheckParm("-encore"))
|
||||||
|
{
|
||||||
|
if (!M_SecretUnlocked(SECRET_ENCORE) && !newencoremode)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_NOTICE, M_GetText("You haven't unlocked Encore Mode yet!\n"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
newencoremode = !newencoremode;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(i = COM_CheckParm("-force")) && newgametype == gametype) // SRB2Kart
|
if (!(i = COM_CheckParm("-force")) && newgametype == gametype) // SRB2Kart
|
||||||
newresetplayers = false; // if not forcing and gametypes is the same
|
newresetplayers = false; // if not forcing and gametypes is the same
|
||||||
|
|
||||||
|
@ -2545,7 +2570,7 @@ static void Command_Map_f(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
fromlevelselect = false;
|
fromlevelselect = false;
|
||||||
D_MapChange(newmapnum, newgametype, (boolean)cv_kartencore.value, newresetplayers, 0, false, false);
|
D_MapChange(newmapnum, newgametype, newencoremode, newresetplayers, 0, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Receives a map command and changes the map.
|
/** Receives a map command and changes the map.
|
||||||
|
|
|
@ -143,11 +143,9 @@ extern consvar_t cv_ringslinger, cv_soundtest;
|
||||||
|
|
||||||
extern consvar_t cv_specialrings, cv_powerstones, cv_matchboxes, cv_competitionboxes;
|
extern consvar_t cv_specialrings, cv_powerstones, cv_matchboxes, cv_competitionboxes;
|
||||||
|
|
||||||
#ifdef NEWPING
|
|
||||||
extern consvar_t cv_maxping;
|
extern consvar_t cv_maxping;
|
||||||
extern consvar_t cv_pingtimeout;
|
extern consvar_t cv_pingtimeout;
|
||||||
extern consvar_t cv_showping;
|
extern consvar_t cv_showping;
|
||||||
#endif
|
|
||||||
|
|
||||||
extern consvar_t cv_skipmapcheck;
|
extern consvar_t cv_skipmapcheck;
|
||||||
|
|
||||||
|
|
|
@ -35,33 +35,6 @@ typedef enum
|
||||||
SF_HIRES = 1, // Draw the sprite 2x as small?
|
SF_HIRES = 1, // Draw the sprite 2x as small?
|
||||||
} skinflags_t;
|
} skinflags_t;
|
||||||
|
|
||||||
//Primary and secondary skin abilities
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
CA_NONE=0,
|
|
||||||
CA_THOK,
|
|
||||||
CA_FLY,
|
|
||||||
CA_GLIDEANDCLIMB,
|
|
||||||
CA_HOMINGTHOK,
|
|
||||||
CA_SWIM,
|
|
||||||
CA_DOUBLEJUMP,
|
|
||||||
CA_FLOAT,
|
|
||||||
CA_SLOWFALL,
|
|
||||||
CA_TELEKINESIS,
|
|
||||||
CA_FALLSWITCH,
|
|
||||||
CA_JUMPBOOST,
|
|
||||||
CA_AIRDRILL,
|
|
||||||
CA_JUMPTHOK
|
|
||||||
} charability_t;
|
|
||||||
|
|
||||||
//Secondary skin abilities
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
CA2_NONE=0,
|
|
||||||
CA2_SPINDASH,
|
|
||||||
CA2_MULTIABILITY
|
|
||||||
} charability2_t;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Player states.
|
// Player states.
|
||||||
//
|
//
|
||||||
|
@ -442,29 +415,8 @@ typedef struct player_s
|
||||||
UINT8 kartweight; // Kart weight stat between 1 and 9
|
UINT8 kartweight; // Kart weight stat between 1 and 9
|
||||||
//
|
//
|
||||||
|
|
||||||
fixed_t normalspeed; // Normal ground
|
|
||||||
fixed_t runspeed; // Speed you break into the run animation
|
|
||||||
UINT8 thrustfactor; // Thrust = thrustfactor * acceleration
|
|
||||||
UINT8 accelstart; // Starting acceleration if speed = 0.
|
|
||||||
UINT8 acceleration; // Acceleration
|
|
||||||
|
|
||||||
// See charability_t and charability2_t for more information.
|
|
||||||
UINT8 charability; // Ability definition
|
|
||||||
UINT8 charability2; // Secondary ability definition
|
|
||||||
|
|
||||||
UINT32 charflags; // Extra abilities/settings for skins (combinable stuff)
|
UINT32 charflags; // Extra abilities/settings for skins (combinable stuff)
|
||||||
// See SF_ flags
|
// See SF_ flags
|
||||||
|
|
||||||
mobjtype_t thokitem; // Object # to spawn for the thok
|
|
||||||
mobjtype_t spinitem; // Object # to spawn for spindash/spinning
|
|
||||||
mobjtype_t revitem; // Object # to spawn for spindash/spinning
|
|
||||||
|
|
||||||
fixed_t actionspd; // Speed of thok/glide/fly
|
|
||||||
fixed_t mindash; // Minimum spindash speed
|
|
||||||
fixed_t maxdash; // Maximum spindash speed
|
|
||||||
|
|
||||||
fixed_t jumpfactor; // How high can the player jump?
|
|
||||||
|
|
||||||
SINT8 lives;
|
SINT8 lives;
|
||||||
SINT8 continues; // continues that player has acquired
|
SINT8 continues; // continues that player has acquired
|
||||||
|
|
||||||
|
|
|
@ -8136,29 +8136,35 @@ static const char *const ML_LIST[16] = {
|
||||||
|
|
||||||
// This DOES differ from r_draw's Color_Names, unfortunately.
|
// This DOES differ from r_draw's Color_Names, unfortunately.
|
||||||
// Also includes Super colors
|
// Also includes Super colors
|
||||||
static const char *COLOR_ENUMS[] = { // Rejigged for Kart.
|
static const char *COLOR_ENUMS[] = { // Rejigged for Kart.
|
||||||
"NONE", // SKINCOLOR_NONE
|
"NONE", // SKINCOLOR_NONE
|
||||||
"WHITE", // SKINCOLOR_WHITE
|
"WHITE", // SKINCOLOR_WHITE
|
||||||
"SILVER", // SKINCOLOR_SILVER
|
"SILVER", // SKINCOLOR_SILVER
|
||||||
"GREY", // SKINCOLOR_GREY
|
"GREY", // SKINCOLOR_GREY
|
||||||
"NICKEL", // SKINCOLOR_NICKEL
|
"NICKEL", // SKINCOLOR_NICKEL
|
||||||
"BLACK", // SKINCOLOR_BLACK
|
"BLACK", // SKINCOLOR_BLACK
|
||||||
|
"SKUNK", // SKINCOLOR_SKUNK
|
||||||
"FAIRY", // SKINCOLOR_FAIRY
|
"FAIRY", // SKINCOLOR_FAIRY
|
||||||
"POPCORN", // SKINCOLOR_POPCORN
|
"POPCORN", // SKINCOLOR_POPCORN
|
||||||
|
"ARTICHOKE", // SKINCOLOR_ARTICHOKE
|
||||||
|
"PIGEON", // SKINCOLOR_PIGEON
|
||||||
"SEPIA", // SKINCOLOR_SEPIA
|
"SEPIA", // SKINCOLOR_SEPIA
|
||||||
"BEIGE", // SKINCOLOR_BEIGE
|
"BEIGE", // SKINCOLOR_BEIGE
|
||||||
|
"WALNUT", // SKINCOLOR_WALNUT
|
||||||
"BROWN", // SKINCOLOR_BROWN
|
"BROWN", // SKINCOLOR_BROWN
|
||||||
"LEATHER", // SKINCOLOR_LEATHER
|
"LEATHER", // SKINCOLOR_LEATHER
|
||||||
"SALMON", // SKINCOLOR_SALMON
|
"SALMON", // SKINCOLOR_SALMON
|
||||||
"PINK", // SKINCOLOR_PINK
|
"PINK", // SKINCOLOR_PINK
|
||||||
"ROSE", // SKINCOLOR_ROSE
|
"ROSE", // SKINCOLOR_ROSE
|
||||||
"BRICK", // SKINCOLOR_BRICK
|
"BRICK", // SKINCOLOR_BRICK
|
||||||
|
"CINNAMON", // SKINCOLOR_CINNAMON
|
||||||
"RUBY", // SKINCOLOR_RUBY
|
"RUBY", // SKINCOLOR_RUBY
|
||||||
"RASPBERRY", // SKINCOLOR_RASPBERRY
|
"RASPBERRY", // SKINCOLOR_RASPBERRY
|
||||||
"CHERRY", // SKINCOLOR_CHERRY
|
"CHERRY", // SKINCOLOR_CHERRY
|
||||||
"RED", // SKINCOLOR_RED
|
"RED", // SKINCOLOR_RED
|
||||||
"CRIMSON", // SKINCOLOR_CRIMSON
|
"CRIMSON", // SKINCOLOR_CRIMSON
|
||||||
"MAROON", // SKINCOLOR_MAROON
|
"MAROON", // SKINCOLOR_MAROON
|
||||||
|
"LEMONADE", // SKINCOLOR_LEMONADE
|
||||||
"FLAME", // SKINCOLOR_FLAME
|
"FLAME", // SKINCOLOR_FLAME
|
||||||
"SCARLET", // SKINCOLOR_SCARLET
|
"SCARLET", // SKINCOLOR_SCARLET
|
||||||
"KETCHUP", // SKINCOLOR_KETCHUP
|
"KETCHUP", // SKINCOLOR_KETCHUP
|
||||||
|
@ -8177,8 +8183,10 @@ static const char *COLOR_ENUMS[] = { // Rejigged for Kart.
|
||||||
"ROYAL", // SKINCOLOR_ROYAL
|
"ROYAL", // SKINCOLOR_ROYAL
|
||||||
"BRONZE", // SKINCOLOR_BRONZE
|
"BRONZE", // SKINCOLOR_BRONZE
|
||||||
"COPPER", // SKINCOLOR_COPPER
|
"COPPER", // SKINCOLOR_COPPER
|
||||||
|
"QUARRY", // SKINCOLOR_QUARRY
|
||||||
"YELLOW", // SKINCOLOR_YELLOW
|
"YELLOW", // SKINCOLOR_YELLOW
|
||||||
"MUSTARD", // SKINCOLOR_MUSTARD
|
"MUSTARD", // SKINCOLOR_MUSTARD
|
||||||
|
"CROCODILE", // SKINCOLOR_CROCODILE
|
||||||
"OLIVE", // SKINCOLOR_OLIVE
|
"OLIVE", // SKINCOLOR_OLIVE
|
||||||
"VOMIT", // SKINCOLOR_VOMIT
|
"VOMIT", // SKINCOLOR_VOMIT
|
||||||
"GARDEN", // SKINCOLOR_GARDEN
|
"GARDEN", // SKINCOLOR_GARDEN
|
||||||
|
@ -8198,6 +8206,7 @@ static const char *COLOR_ENUMS[] = { // Rejigged for Kart.
|
||||||
"PLAGUE", // SKINCOLOR_PLAGUE
|
"PLAGUE", // SKINCOLOR_PLAGUE
|
||||||
"ALGAE", // SKINCOLOR_ALGAE
|
"ALGAE", // SKINCOLOR_ALGAE
|
||||||
"CARIBBEAN", // SKINCOLOR_CARIBBEAN
|
"CARIBBEAN", // SKINCOLOR_CARIBBEAN
|
||||||
|
"AZURE", // SKINCOLOR_AZURE
|
||||||
"AQUA", // SKINCOLOR_AQUA
|
"AQUA", // SKINCOLOR_AQUA
|
||||||
"TEAL", // SKINCOLOR_TEAL
|
"TEAL", // SKINCOLOR_TEAL
|
||||||
"CYAN", // SKINCOLOR_CYAN
|
"CYAN", // SKINCOLOR_CYAN
|
||||||
|
@ -8207,7 +8216,9 @@ static const char *COLOR_ENUMS[] = { // Rejigged for Kart.
|
||||||
"PLATINUM", // SKINCOLOR_PLATINUM
|
"PLATINUM", // SKINCOLOR_PLATINUM
|
||||||
"SLATE", // SKINCOLOR_SLATE
|
"SLATE", // SKINCOLOR_SLATE
|
||||||
"STEEL", // SKINCOLOR_STEEL
|
"STEEL", // SKINCOLOR_STEEL
|
||||||
|
"THUNDER", // SKINCOLOR_THUNDER
|
||||||
"RUST", // SKINCOLOR_RUST
|
"RUST", // SKINCOLOR_RUST
|
||||||
|
"WRISTWATCH", // SKINCOLOR_WRISTWATCH
|
||||||
"JET", // SKINCOLOR_JET
|
"JET", // SKINCOLOR_JET
|
||||||
"SAPPHIRE", // SKINCOLOR_SAPPHIRE
|
"SAPPHIRE", // SKINCOLOR_SAPPHIRE
|
||||||
"PERIWINKLE", // SKINCOLOR_PERIWINKLE
|
"PERIWINKLE", // SKINCOLOR_PERIWINKLE
|
||||||
|
@ -8228,10 +8239,6 @@ static const char *COLOR_ENUMS[] = { // Rejigged for Kart.
|
||||||
"POMEGRANATE", // SKINCOLOR_POMEGRANATE
|
"POMEGRANATE", // SKINCOLOR_POMEGRANATE
|
||||||
"LILAC", // SKINCOLOR_LILAC
|
"LILAC", // SKINCOLOR_LILAC
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Special super colors
|
// Special super colors
|
||||||
// Super Sonic Yellow
|
// Super Sonic Yellow
|
||||||
"SUPER1", // SKINCOLOR_SUPER1
|
"SUPER1", // SKINCOLOR_SUPER1
|
||||||
|
@ -8643,27 +8650,6 @@ struct {
|
||||||
// Character flags (skinflags_t)
|
// Character flags (skinflags_t)
|
||||||
{"SF_HIRES",SF_HIRES},
|
{"SF_HIRES",SF_HIRES},
|
||||||
|
|
||||||
// Character abilities!
|
|
||||||
// Primary
|
|
||||||
{"CA_NONE",CA_NONE}, // now slot 0!
|
|
||||||
{"CA_THOK",CA_THOK},
|
|
||||||
{"CA_FLY",CA_FLY},
|
|
||||||
{"CA_GLIDEANDCLIMB",CA_GLIDEANDCLIMB},
|
|
||||||
{"CA_HOMINGTHOK",CA_HOMINGTHOK},
|
|
||||||
{"CA_DOUBLEJUMP",CA_DOUBLEJUMP},
|
|
||||||
{"CA_FLOAT",CA_FLOAT},
|
|
||||||
{"CA_SLOWFALL",CA_SLOWFALL},
|
|
||||||
{"CA_SWIM",CA_SWIM},
|
|
||||||
{"CA_TELEKINESIS",CA_TELEKINESIS},
|
|
||||||
{"CA_FALLSWITCH",CA_FALLSWITCH},
|
|
||||||
{"CA_JUMPBOOST",CA_JUMPBOOST},
|
|
||||||
{"CA_AIRDRILL",CA_AIRDRILL},
|
|
||||||
{"CA_JUMPTHOK",CA_JUMPTHOK},
|
|
||||||
// Secondary
|
|
||||||
{"CA2_NONE",CA2_NONE}, // now slot 0!
|
|
||||||
{"CA2_SPINDASH",CA2_SPINDASH},
|
|
||||||
{"CA2_MULTIABILITY",CA2_MULTIABILITY},
|
|
||||||
|
|
||||||
// Sound flags
|
// Sound flags
|
||||||
{"SF_TOTALLYSINGLE",SF_TOTALLYSINGLE},
|
{"SF_TOTALLYSINGLE",SF_TOTALLYSINGLE},
|
||||||
{"SF_NOMULTIPLESOUND",SF_NOMULTIPLESOUND},
|
{"SF_NOMULTIPLESOUND",SF_NOMULTIPLESOUND},
|
||||||
|
@ -9926,6 +9912,9 @@ static inline int lib_getenum(lua_State *L)
|
||||||
} else if (fastcmp(word,"mapobjectscale")) {
|
} else if (fastcmp(word,"mapobjectscale")) {
|
||||||
lua_pushinteger(L, mapobjectscale);
|
lua_pushinteger(L, mapobjectscale);
|
||||||
return 1;
|
return 1;
|
||||||
|
} else if (fastcmp(word,"numlaps")) {
|
||||||
|
lua_pushinteger(L, cv_numlaps.value);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -259,22 +259,28 @@ typedef enum
|
||||||
SKINCOLOR_GREY,
|
SKINCOLOR_GREY,
|
||||||
SKINCOLOR_NICKEL,
|
SKINCOLOR_NICKEL,
|
||||||
SKINCOLOR_BLACK,
|
SKINCOLOR_BLACK,
|
||||||
|
SKINCOLOR_SKUNK,
|
||||||
SKINCOLOR_FAIRY,
|
SKINCOLOR_FAIRY,
|
||||||
SKINCOLOR_POPCORN,
|
SKINCOLOR_POPCORN,
|
||||||
|
SKINCOLOR_ARTICHOKE,
|
||||||
|
SKINCOLOR_PIGEON,
|
||||||
SKINCOLOR_SEPIA,
|
SKINCOLOR_SEPIA,
|
||||||
SKINCOLOR_BEIGE,
|
SKINCOLOR_BEIGE,
|
||||||
|
SKINCOLOR_WALNUT,
|
||||||
SKINCOLOR_BROWN,
|
SKINCOLOR_BROWN,
|
||||||
SKINCOLOR_LEATHER,
|
SKINCOLOR_LEATHER,
|
||||||
SKINCOLOR_SALMON,
|
SKINCOLOR_SALMON,
|
||||||
SKINCOLOR_PINK,
|
SKINCOLOR_PINK,
|
||||||
SKINCOLOR_ROSE,
|
SKINCOLOR_ROSE,
|
||||||
SKINCOLOR_BRICK,
|
SKINCOLOR_BRICK,
|
||||||
|
SKINCOLOR_CINNAMON,
|
||||||
SKINCOLOR_RUBY,
|
SKINCOLOR_RUBY,
|
||||||
SKINCOLOR_RASPBERRY,
|
SKINCOLOR_RASPBERRY,
|
||||||
SKINCOLOR_CHERRY,
|
SKINCOLOR_CHERRY,
|
||||||
SKINCOLOR_RED,
|
SKINCOLOR_RED,
|
||||||
SKINCOLOR_CRIMSON,
|
SKINCOLOR_CRIMSON,
|
||||||
SKINCOLOR_MAROON,
|
SKINCOLOR_MAROON,
|
||||||
|
SKINCOLOR_LEMONADE,
|
||||||
SKINCOLOR_FLAME,
|
SKINCOLOR_FLAME,
|
||||||
SKINCOLOR_SCARLET,
|
SKINCOLOR_SCARLET,
|
||||||
SKINCOLOR_KETCHUP,
|
SKINCOLOR_KETCHUP,
|
||||||
|
@ -293,8 +299,10 @@ typedef enum
|
||||||
SKINCOLOR_ROYAL,
|
SKINCOLOR_ROYAL,
|
||||||
SKINCOLOR_BRONZE,
|
SKINCOLOR_BRONZE,
|
||||||
SKINCOLOR_COPPER,
|
SKINCOLOR_COPPER,
|
||||||
|
SKINCOLOR_QUARRY,
|
||||||
SKINCOLOR_YELLOW,
|
SKINCOLOR_YELLOW,
|
||||||
SKINCOLOR_MUSTARD,
|
SKINCOLOR_MUSTARD,
|
||||||
|
SKINCOLOR_CROCODILE,
|
||||||
SKINCOLOR_OLIVE,
|
SKINCOLOR_OLIVE,
|
||||||
SKINCOLOR_VOMIT,
|
SKINCOLOR_VOMIT,
|
||||||
SKINCOLOR_GARDEN,
|
SKINCOLOR_GARDEN,
|
||||||
|
@ -314,6 +322,7 @@ typedef enum
|
||||||
SKINCOLOR_PLAGUE,
|
SKINCOLOR_PLAGUE,
|
||||||
SKINCOLOR_ALGAE,
|
SKINCOLOR_ALGAE,
|
||||||
SKINCOLOR_CARIBBEAN,
|
SKINCOLOR_CARIBBEAN,
|
||||||
|
SKINCOLOR_AZURE,
|
||||||
SKINCOLOR_AQUA,
|
SKINCOLOR_AQUA,
|
||||||
SKINCOLOR_TEAL,
|
SKINCOLOR_TEAL,
|
||||||
SKINCOLOR_CYAN,
|
SKINCOLOR_CYAN,
|
||||||
|
@ -323,7 +332,9 @@ typedef enum
|
||||||
SKINCOLOR_PLATINUM,
|
SKINCOLOR_PLATINUM,
|
||||||
SKINCOLOR_SLATE,
|
SKINCOLOR_SLATE,
|
||||||
SKINCOLOR_STEEL,
|
SKINCOLOR_STEEL,
|
||||||
|
SKINCOLOR_THUNDER,
|
||||||
SKINCOLOR_RUST,
|
SKINCOLOR_RUST,
|
||||||
|
SKINCOLOR_WRISTWATCH,
|
||||||
SKINCOLOR_JET,
|
SKINCOLOR_JET,
|
||||||
SKINCOLOR_SAPPHIRE, // sweet mother, i cannot weave - slender aphrodite has overcome me with longing for a girl
|
SKINCOLOR_SAPPHIRE, // sweet mother, i cannot weave - slender aphrodite has overcome me with longing for a girl
|
||||||
SKINCOLOR_PERIWINKLE,
|
SKINCOLOR_PERIWINKLE,
|
||||||
|
@ -604,9 +615,6 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
|
||||||
/// Polyobject fake flat code
|
/// Polyobject fake flat code
|
||||||
#define POLYOBJECTS_PLANES
|
#define POLYOBJECTS_PLANES
|
||||||
|
|
||||||
/// Improved way of dealing with ping values and a ping limit.
|
|
||||||
#define NEWPING
|
|
||||||
|
|
||||||
/// See name of player in your crosshair
|
/// See name of player in your crosshair
|
||||||
#define SEENAMES
|
#define SEENAMES
|
||||||
|
|
||||||
|
|
|
@ -537,9 +537,7 @@ extern consvar_t cv_forceskin; // force clients to use the server's skin
|
||||||
extern consvar_t cv_downloading; // allow clients to downloading WADs.
|
extern consvar_t cv_downloading; // allow clients to downloading WADs.
|
||||||
extern consvar_t cv_nettimeout; // SRB2Kart: Advanced server options menu
|
extern consvar_t cv_nettimeout; // SRB2Kart: Advanced server options menu
|
||||||
extern consvar_t cv_jointimeout;
|
extern consvar_t cv_jointimeout;
|
||||||
#ifdef NEWPING
|
|
||||||
extern consvar_t cv_maxping;
|
extern consvar_t cv_maxping;
|
||||||
#endif
|
|
||||||
extern ticcmd_t netcmds[BACKUPTICS][MAXPLAYERS];
|
extern ticcmd_t netcmds[BACKUPTICS][MAXPLAYERS];
|
||||||
extern INT32 serverplayer;
|
extern INT32 serverplayer;
|
||||||
extern INT32 adminplayers[MAXPLAYERS];
|
extern INT32 adminplayers[MAXPLAYERS];
|
||||||
|
|
|
@ -366,16 +366,18 @@ size_t strlcpy(char *dst, const char *src, size_t siz);
|
||||||
|
|
||||||
/* Miscellaneous types that don't fit anywhere else (Can this be changed?) */
|
/* Miscellaneous types that don't fit anywhere else (Can this be changed?) */
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
UINT8 red;
|
||||||
|
UINT8 green;
|
||||||
|
UINT8 blue;
|
||||||
|
UINT8 alpha;
|
||||||
|
} byteColor_t;
|
||||||
|
|
||||||
union FColorRGBA
|
union FColorRGBA
|
||||||
{
|
{
|
||||||
UINT32 rgba;
|
UINT32 rgba;
|
||||||
struct
|
byteColor_t s;
|
||||||
{
|
|
||||||
UINT8 red;
|
|
||||||
UINT8 green;
|
|
||||||
UINT8 blue;
|
|
||||||
UINT8 alpha;
|
|
||||||
} s;
|
|
||||||
} ATTRPACK;
|
} ATTRPACK;
|
||||||
typedef union FColorRGBA RGBA_t;
|
typedef union FColorRGBA RGBA_t;
|
||||||
|
|
||||||
|
|
60
src/g_game.c
60
src/g_game.c
|
@ -410,6 +410,8 @@ static CV_PossibleValue_t joyaxis_cons_t[] = {{0, "None"},
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static CV_PossibleValue_t deadzone_cons_t[] = {{0, "MIN"}, {FRACUNIT, "MAX"}, {0, NULL}};
|
||||||
|
|
||||||
// don't mind me putting these here, I was lazy to figure out where else I could put those without blowing up the compiler.
|
// don't mind me putting these here, I was lazy to figure out where else I could put those without blowing up the compiler.
|
||||||
|
|
||||||
// it automatically becomes compact with 20+ players, but if you like it, I guess you can turn that on!
|
// it automatically becomes compact with 20+ players, but if you like it, I guess you can turn that on!
|
||||||
|
@ -480,6 +482,7 @@ consvar_t cv_aimaxis = {"joyaxis_aim", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL,
|
||||||
consvar_t cv_lookaxis = {"joyaxis_look", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_lookaxis = {"joyaxis_look", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_fireaxis = {"joyaxis_fire", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_fireaxis = {"joyaxis_fire", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_driftaxis = {"joyaxis_drift", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_driftaxis = {"joyaxis_drift", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_deadzone = {"joy_deadzone", "0.5", CV_FLOAT|CV_SAVE, deadzone_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_turnaxis2 = {"joyaxis2_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_turnaxis2 = {"joyaxis2_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_moveaxis2 = {"joyaxis2_move", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_moveaxis2 = {"joyaxis2_move", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
@ -488,6 +491,7 @@ consvar_t cv_aimaxis2 = {"joyaxis2_aim", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL
|
||||||
consvar_t cv_lookaxis2 = {"joyaxis2_look", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_lookaxis2 = {"joyaxis2_look", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_fireaxis2 = {"joyaxis2_fire", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_fireaxis2 = {"joyaxis2_fire", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_driftaxis2 = {"joyaxis2_drift", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_driftaxis2 = {"joyaxis2_drift", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_deadzone2 = {"joy2_deadzone", "0.5", CV_FLOAT|CV_SAVE, deadzone_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_turnaxis3 = {"joyaxis3_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_turnaxis3 = {"joyaxis3_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_moveaxis3 = {"joyaxis3_move", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_moveaxis3 = {"joyaxis3_move", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
@ -496,6 +500,7 @@ consvar_t cv_aimaxis3 = {"joyaxis3_aim", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL
|
||||||
consvar_t cv_lookaxis3 = {"joyaxis3_look", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_lookaxis3 = {"joyaxis3_look", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_fireaxis3 = {"joyaxis3_fire", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_fireaxis3 = {"joyaxis3_fire", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_driftaxis3 = {"joyaxis3_drift", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_driftaxis3 = {"joyaxis3_drift", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_deadzone3 = {"joy3_deadzone", "0.5", CV_FLOAT|CV_SAVE, deadzone_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
consvar_t cv_turnaxis4 = {"joyaxis4_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_turnaxis4 = {"joyaxis4_turn", "X-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_moveaxis4 = {"joyaxis4_move", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_moveaxis4 = {"joyaxis4_move", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
@ -504,6 +509,7 @@ consvar_t cv_aimaxis4 = {"joyaxis4_aim", "Y-Axis", CV_SAVE, joyaxis_cons_t, NULL
|
||||||
consvar_t cv_lookaxis4 = {"joyaxis4_look", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_lookaxis4 = {"joyaxis4_look", "None", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_fireaxis4 = {"joyaxis4_fire", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_fireaxis4 = {"joyaxis4_fire", "Z-Axis", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_driftaxis4 = {"joyaxis4_drift", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_driftaxis4 = {"joyaxis4_drift", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
consvar_t cv_deadzone4 = {"joy4_deadzone", "0.5", CV_FLOAT|CV_SAVE, deadzone_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
|
||||||
|
|
||||||
#if MAXPLAYERS > 16
|
#if MAXPLAYERS > 16
|
||||||
|
@ -929,8 +935,8 @@ static INT32 Joy1Axis(axis_input_e axissel)
|
||||||
retaxis = +JOYAXISRANGE;
|
retaxis = +JOYAXISRANGE;
|
||||||
if (!Joystick.bGamepadStyle && axissel < AXISDEAD)
|
if (!Joystick.bGamepadStyle && axissel < AXISDEAD)
|
||||||
{
|
{
|
||||||
const INT32 jdeadzone = JOYAXISRANGE/4;
|
const INT32 jdeadzone = ((JOYAXISRANGE-1) * cv_deadzone.value) >> FRACBITS;
|
||||||
if (-jdeadzone < retaxis && retaxis < jdeadzone)
|
if (abs(retaxis) <= jdeadzone)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (flp) retaxis = -retaxis; //flip it around
|
if (flp) retaxis = -retaxis; //flip it around
|
||||||
|
@ -1010,7 +1016,7 @@ static INT32 Joy2Axis(axis_input_e axissel)
|
||||||
retaxis = +JOYAXISRANGE;
|
retaxis = +JOYAXISRANGE;
|
||||||
if (!Joystick2.bGamepadStyle && axissel < AXISDEAD)
|
if (!Joystick2.bGamepadStyle && axissel < AXISDEAD)
|
||||||
{
|
{
|
||||||
const INT32 jdeadzone = JOYAXISRANGE/4;
|
const INT32 jdeadzone = ((JOYAXISRANGE-1) * cv_deadzone2.value) >> FRACBITS;
|
||||||
if (-jdeadzone < retaxis && retaxis < jdeadzone)
|
if (-jdeadzone < retaxis && retaxis < jdeadzone)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1091,7 +1097,7 @@ static INT32 Joy3Axis(axis_input_e axissel)
|
||||||
retaxis = +JOYAXISRANGE;
|
retaxis = +JOYAXISRANGE;
|
||||||
if (!Joystick3.bGamepadStyle && axissel < AXISDEAD)
|
if (!Joystick3.bGamepadStyle && axissel < AXISDEAD)
|
||||||
{
|
{
|
||||||
const INT32 jdeadzone = JOYAXISRANGE/4;
|
const INT32 jdeadzone = ((JOYAXISRANGE-1) * cv_deadzone3.value) >> FRACBITS;
|
||||||
if (-jdeadzone < retaxis && retaxis < jdeadzone)
|
if (-jdeadzone < retaxis && retaxis < jdeadzone)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1171,7 +1177,7 @@ static INT32 Joy4Axis(axis_input_e axissel)
|
||||||
retaxis = +JOYAXISRANGE;
|
retaxis = +JOYAXISRANGE;
|
||||||
if (!Joystick4.bGamepadStyle && axissel < AXISDEAD)
|
if (!Joystick4.bGamepadStyle && axissel < AXISDEAD)
|
||||||
{
|
{
|
||||||
const INT32 jdeadzone = JOYAXISRANGE/4;
|
const INT32 jdeadzone = ((JOYAXISRANGE-1) * cv_deadzone4.value) >> FRACBITS;
|
||||||
if (-jdeadzone < retaxis && retaxis < jdeadzone)
|
if (-jdeadzone < retaxis && retaxis < jdeadzone)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2534,25 +2540,12 @@ void G_PlayerReborn(INT32 player)
|
||||||
INT32 score, marescore;
|
INT32 score, marescore;
|
||||||
INT32 lives;
|
INT32 lives;
|
||||||
INT32 continues;
|
INT32 continues;
|
||||||
UINT8 charability;
|
|
||||||
UINT8 charability2;
|
|
||||||
// SRB2kart
|
// SRB2kart
|
||||||
UINT8 kartspeed;
|
UINT8 kartspeed;
|
||||||
UINT8 kartweight;
|
UINT8 kartweight;
|
||||||
//
|
//
|
||||||
fixed_t normalspeed;
|
|
||||||
fixed_t runspeed;
|
|
||||||
UINT8 thrustfactor;
|
|
||||||
UINT8 accelstart;
|
|
||||||
UINT8 acceleration;
|
|
||||||
INT32 charflags;
|
INT32 charflags;
|
||||||
INT32 pflags;
|
INT32 pflags;
|
||||||
UINT32 thokitem;
|
|
||||||
UINT32 spinitem;
|
|
||||||
UINT32 revitem;
|
|
||||||
fixed_t actionspd;
|
|
||||||
fixed_t mindash;
|
|
||||||
fixed_t maxdash;
|
|
||||||
INT32 ctfteam;
|
INT32 ctfteam;
|
||||||
INT32 starposttime;
|
INT32 starposttime;
|
||||||
INT16 starpostx;
|
INT16 starpostx;
|
||||||
|
@ -2560,7 +2553,6 @@ void G_PlayerReborn(INT32 player)
|
||||||
INT16 starpostz;
|
INT16 starpostz;
|
||||||
INT32 starpostnum;
|
INT32 starpostnum;
|
||||||
INT32 starpostangle;
|
INT32 starpostangle;
|
||||||
fixed_t jumpfactor;
|
|
||||||
INT32 exiting;
|
INT32 exiting;
|
||||||
INT16 numboxes;
|
INT16 numboxes;
|
||||||
INT16 totalring;
|
INT16 totalring;
|
||||||
|
@ -2608,17 +2600,10 @@ void G_PlayerReborn(INT32 player)
|
||||||
|
|
||||||
skincolor = players[player].skincolor;
|
skincolor = players[player].skincolor;
|
||||||
skin = players[player].skin;
|
skin = players[player].skin;
|
||||||
charability = players[player].charability;
|
|
||||||
charability2 = players[player].charability2;
|
|
||||||
// SRB2kart
|
// SRB2kart
|
||||||
kartspeed = players[player].kartspeed;
|
kartspeed = players[player].kartspeed;
|
||||||
kartweight = players[player].kartweight;
|
kartweight = players[player].kartweight;
|
||||||
//
|
//
|
||||||
normalspeed = players[player].normalspeed;
|
|
||||||
runspeed = players[player].runspeed;
|
|
||||||
thrustfactor = players[player].thrustfactor;
|
|
||||||
accelstart = players[player].accelstart;
|
|
||||||
acceleration = players[player].acceleration;
|
|
||||||
charflags = players[player].charflags;
|
charflags = players[player].charflags;
|
||||||
|
|
||||||
starposttime = players[player].starposttime;
|
starposttime = players[player].starposttime;
|
||||||
|
@ -2628,13 +2613,6 @@ void G_PlayerReborn(INT32 player)
|
||||||
starpostnum = players[player].starpostnum;
|
starpostnum = players[player].starpostnum;
|
||||||
respawnflip = players[player].kartstuff[k_starpostflip]; //SRB2KART
|
respawnflip = players[player].kartstuff[k_starpostflip]; //SRB2KART
|
||||||
starpostangle = players[player].starpostangle;
|
starpostangle = players[player].starpostangle;
|
||||||
jumpfactor = players[player].jumpfactor;
|
|
||||||
thokitem = players[player].thokitem;
|
|
||||||
spinitem = players[player].spinitem;
|
|
||||||
revitem = players[player].revitem;
|
|
||||||
actionspd = players[player].actionspd;
|
|
||||||
mindash = players[player].mindash;
|
|
||||||
maxdash = players[player].maxdash;
|
|
||||||
|
|
||||||
mare = players[player].mare;
|
mare = players[player].mare;
|
||||||
bot = players[player].bot;
|
bot = players[player].bot;
|
||||||
|
@ -2698,24 +2676,11 @@ void G_PlayerReborn(INT32 player)
|
||||||
// save player config truth reborn
|
// save player config truth reborn
|
||||||
p->skincolor = skincolor;
|
p->skincolor = skincolor;
|
||||||
p->skin = skin;
|
p->skin = skin;
|
||||||
p->charability = charability;
|
|
||||||
p->charability2 = charability2;
|
|
||||||
// SRB2kart
|
// SRB2kart
|
||||||
p->kartspeed = kartspeed;
|
p->kartspeed = kartspeed;
|
||||||
p->kartweight = kartweight;
|
p->kartweight = kartweight;
|
||||||
//
|
//
|
||||||
p->normalspeed = normalspeed;
|
|
||||||
p->runspeed = runspeed;
|
|
||||||
p->thrustfactor = thrustfactor;
|
|
||||||
p->accelstart = accelstart;
|
|
||||||
p->acceleration = acceleration;
|
|
||||||
p->charflags = charflags;
|
p->charflags = charflags;
|
||||||
p->thokitem = thokitem;
|
|
||||||
p->spinitem = spinitem;
|
|
||||||
p->revitem = revitem;
|
|
||||||
p->actionspd = actionspd;
|
|
||||||
p->mindash = mindash;
|
|
||||||
p->maxdash = maxdash;
|
|
||||||
|
|
||||||
p->starposttime = starposttime;
|
p->starposttime = starposttime;
|
||||||
p->starpostx = starpostx;
|
p->starpostx = starpostx;
|
||||||
|
@ -2723,7 +2688,6 @@ void G_PlayerReborn(INT32 player)
|
||||||
p->starpostz = starpostz;
|
p->starpostz = starpostz;
|
||||||
p->starpostnum = starpostnum;
|
p->starpostnum = starpostnum;
|
||||||
p->starpostangle = starpostangle;
|
p->starpostangle = starpostangle;
|
||||||
p->jumpfactor = jumpfactor;
|
|
||||||
p->exiting = exiting;
|
p->exiting = exiting;
|
||||||
|
|
||||||
p->numboxes = numboxes;
|
p->numboxes = numboxes;
|
||||||
|
@ -6122,7 +6086,7 @@ void G_ReadMetalTic(mobj_t *metal)
|
||||||
speed = FixedDiv(P_AproxDistance(oldmetal.momx, oldmetal.momy), metal->scale)>>FRACBITS;
|
speed = FixedDiv(P_AproxDistance(oldmetal.momx, oldmetal.momy), metal->scale)>>FRACBITS;
|
||||||
|
|
||||||
// Use speed to decide an appropriate state
|
// Use speed to decide an appropriate state
|
||||||
if (speed > 28) // default skin runspeed
|
if (speed > 20) // default skin runspeed
|
||||||
statetype = 2;
|
statetype = 2;
|
||||||
else if (speed > 1) // stopspeed
|
else if (speed > 1) // stopspeed
|
||||||
statetype = 1;
|
statetype = 1;
|
||||||
|
|
|
@ -112,10 +112,10 @@ extern consvar_t cv_invertmouse/*, cv_alwaysfreelook, cv_chasefreelook, cv_mouse
|
||||||
extern consvar_t cv_invertmouse2/*, cv_alwaysfreelook2, cv_chasefreelook2, cv_mousemove2*/;
|
extern consvar_t cv_invertmouse2/*, cv_alwaysfreelook2, cv_chasefreelook2, cv_mousemove2*/;
|
||||||
extern consvar_t cv_useranalog, cv_useranalog2, cv_useranalog3, cv_useranalog4;
|
extern consvar_t cv_useranalog, cv_useranalog2, cv_useranalog3, cv_useranalog4;
|
||||||
extern consvar_t cv_analog, cv_analog2, cv_analog3, cv_analog4;
|
extern consvar_t cv_analog, cv_analog2, cv_analog3, cv_analog4;
|
||||||
extern consvar_t cv_turnaxis,cv_moveaxis,cv_brakeaxis,cv_aimaxis,cv_lookaxis,cv_fireaxis,cv_driftaxis;
|
extern consvar_t cv_turnaxis,cv_moveaxis,cv_brakeaxis,cv_aimaxis,cv_lookaxis,cv_fireaxis,cv_driftaxis,cv_deadzone;
|
||||||
extern consvar_t cv_turnaxis2,cv_moveaxis2,cv_brakeaxis2,cv_aimaxis2,cv_lookaxis2,cv_fireaxis2,cv_driftaxis2;
|
extern consvar_t cv_turnaxis2,cv_moveaxis2,cv_brakeaxis2,cv_aimaxis2,cv_lookaxis2,cv_fireaxis2,cv_driftaxis2,cv_deadzone2;
|
||||||
extern consvar_t cv_turnaxis3,cv_moveaxis3,cv_brakeaxis3,cv_aimaxis3,cv_lookaxis3,cv_fireaxis3,cv_driftaxis3;
|
extern consvar_t cv_turnaxis3,cv_moveaxis3,cv_brakeaxis3,cv_aimaxis3,cv_lookaxis3,cv_fireaxis3,cv_driftaxis3,cv_deadzone3;
|
||||||
extern consvar_t cv_turnaxis4,cv_moveaxis4,cv_brakeaxis4,cv_aimaxis4,cv_lookaxis4,cv_fireaxis4,cv_driftaxis4;
|
extern consvar_t cv_turnaxis4,cv_moveaxis4,cv_brakeaxis4,cv_aimaxis4,cv_lookaxis4,cv_fireaxis4,cv_driftaxis4,cv_deadzone4;
|
||||||
extern consvar_t cv_ghost_besttime, cv_ghost_bestlap, cv_ghost_last, cv_ghost_guest, cv_ghost_staff;
|
extern consvar_t cv_ghost_besttime, cv_ghost_bestlap, cv_ghost_last, cv_ghost_guest, cv_ghost_staff;
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
|
|
|
@ -241,43 +241,6 @@ static void HWR_ResizeBlock(INT32 originalwidth, INT32 originalheight,
|
||||||
if (blockheight < 1)
|
if (blockheight < 1)
|
||||||
I_Error("3D GenerateTexture : too small");
|
I_Error("3D GenerateTexture : too small");
|
||||||
}
|
}
|
||||||
else if (cv_voodoocompatibility.value)
|
|
||||||
{
|
|
||||||
if (originalwidth > 256 || originalheight > 256)
|
|
||||||
{
|
|
||||||
blockwidth = 256;
|
|
||||||
while (originalwidth < blockwidth)
|
|
||||||
blockwidth >>= 1;
|
|
||||||
if (blockwidth < 1)
|
|
||||||
I_Error("3D GenerateTexture : too small");
|
|
||||||
|
|
||||||
blockheight = 256;
|
|
||||||
while (originalheight < blockheight)
|
|
||||||
blockheight >>= 1;
|
|
||||||
if (blockheight < 1)
|
|
||||||
I_Error("3D GenerateTexture : too small");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//size up to nearest power of 2
|
|
||||||
blockwidth = 1;
|
|
||||||
while (blockwidth < originalwidth)
|
|
||||||
blockwidth <<= 1;
|
|
||||||
// scale down the original graphics to fit in 256
|
|
||||||
if (blockwidth > 256)
|
|
||||||
blockwidth = 256;
|
|
||||||
//I_Error("3D GenerateTexture : too big");
|
|
||||||
|
|
||||||
//size up to nearest power of 2
|
|
||||||
blockheight = 1;
|
|
||||||
while (blockheight < originalheight)
|
|
||||||
blockheight <<= 1;
|
|
||||||
// scale down the original graphics to fit in 256
|
|
||||||
if (blockheight > 256)
|
|
||||||
blockheight = 255;
|
|
||||||
//I_Error("3D GenerateTexture : too big");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//size up to nearest power of 2
|
//size up to nearest power of 2
|
||||||
|
@ -508,18 +471,6 @@ void HWR_MakePatch (const patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipm
|
||||||
newwidth = blockwidth;
|
newwidth = blockwidth;
|
||||||
newheight = blockheight;
|
newheight = blockheight;
|
||||||
}
|
}
|
||||||
else if (cv_voodoocompatibility.value) // Only scales down textures that exceed 256x256.
|
|
||||||
{
|
|
||||||
// no rounddown, do not size up patches, so they don't look 'scaled'
|
|
||||||
newwidth = min(grPatch->width, blockwidth);
|
|
||||||
newheight = min(grPatch->height, blockheight);
|
|
||||||
|
|
||||||
if (newwidth > 256 || newheight > 256)
|
|
||||||
{
|
|
||||||
newwidth = blockwidth;
|
|
||||||
newheight = blockheight;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// no rounddown, do not size up patches, so they don't look 'scaled'
|
// no rounddown, do not size up patches, so they don't look 'scaled'
|
||||||
|
@ -935,18 +886,6 @@ GLPatch_t *HWR_GetPic(lumpnum_t lumpnum)
|
||||||
newwidth = blockwidth;
|
newwidth = blockwidth;
|
||||||
newheight = blockheight;
|
newheight = blockheight;
|
||||||
}
|
}
|
||||||
else if (cv_voodoocompatibility.value) // Only scales down textures that exceed 256x256.
|
|
||||||
{
|
|
||||||
// no rounddown, do not size up patches, so they don't look 'scaled'
|
|
||||||
newwidth = min(SHORT(pic->width),blockwidth);
|
|
||||||
newheight = min(SHORT(pic->height),blockheight);
|
|
||||||
|
|
||||||
if (newwidth > 256 || newheight > 256)
|
|
||||||
{
|
|
||||||
newwidth = blockwidth;
|
|
||||||
newheight = blockheight;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// no rounddown, do not size up patches, so they don't look 'scaled'
|
// no rounddown, do not size up patches, so they don't look 'scaled'
|
||||||
|
|
|
@ -78,8 +78,8 @@
|
||||||
#include "r_opengl/r_opengl.h"
|
#include "r_opengl/r_opengl.h"
|
||||||
|
|
||||||
#ifdef HAVE_SPHEREFRUSTRUM
|
#ifdef HAVE_SPHEREFRUSTRUM
|
||||||
static GLdouble viewMatrix[16];
|
static GLfloat viewMatrix[16];
|
||||||
static GLdouble projMatrix[16];
|
static GLfloat projMatrix[16];
|
||||||
float frustum[6][4];
|
float frustum[6][4];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -381,8 +381,8 @@ void gld_FrustrumSetup(void)
|
||||||
float t;
|
float t;
|
||||||
float clip[16];
|
float clip[16];
|
||||||
|
|
||||||
pglGetDoublev(GL_PROJECTION_MATRIX, projMatrix);
|
pglGeFloatv(GL_PROJECTION_MATRIX, projMatrix);
|
||||||
pglGetDoublev(GL_MODELVIEW_MATRIX, viewMatrix);
|
pglGetFloatv(GL_MODELVIEW_MATRIX, viewMatrix);
|
||||||
|
|
||||||
clip[0] = CALCMATRIX(0, 0, 1, 4, 2, 8, 3, 12);
|
clip[0] = CALCMATRIX(0, 0, 1, 4, 2, 8, 3, 12);
|
||||||
clip[1] = CALCMATRIX(0, 1, 1, 5, 2, 9, 3, 13);
|
clip[1] = CALCMATRIX(0, 1, 1, 5, 2, 9, 3, 13);
|
||||||
|
|
|
@ -101,15 +101,29 @@ typedef struct
|
||||||
|
|
||||||
//Hurdler: Transform (coords + angles)
|
//Hurdler: Transform (coords + angles)
|
||||||
//BP: transform order : scale(rotation_x(rotation_y(translation(v))))
|
//BP: transform order : scale(rotation_x(rotation_y(translation(v))))
|
||||||
|
|
||||||
|
// Kart features
|
||||||
|
#define USE_FTRANSFORM_ANGLEZ
|
||||||
|
#define USE_FTRANSFORM_MIRROR
|
||||||
|
|
||||||
|
// Vanilla features
|
||||||
|
//#define USE_MODEL_NEXTFRAME
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
FLOAT x,y,z; // position
|
FLOAT x,y,z; // position
|
||||||
|
#ifdef USE_FTRANSFORM_ANGLEZ
|
||||||
FLOAT anglex,angley,anglez; // aimingangle / viewangle
|
FLOAT anglex,angley,anglez; // aimingangle / viewangle
|
||||||
|
#else
|
||||||
|
FLOAT anglex,angley; // aimingangle / viewangle
|
||||||
|
#endif
|
||||||
FLOAT scalex,scaley,scalez;
|
FLOAT scalex,scaley,scalez;
|
||||||
FLOAT fovxangle, fovyangle;
|
FLOAT fovxangle, fovyangle;
|
||||||
UINT8 splitscreen;
|
UINT8 splitscreen;
|
||||||
boolean flip; // screenflip
|
boolean flip; // screenflip
|
||||||
|
#ifdef USE_FTRANSFORM_MIRROR
|
||||||
boolean mirror; // SRB2Kart: Encore Mode
|
boolean mirror; // SRB2Kart: Encore Mode
|
||||||
|
#endif
|
||||||
} FTransform;
|
} FTransform;
|
||||||
|
|
||||||
// Transformed vector, as passed to HWR API
|
// Transformed vector, as passed to HWR API
|
||||||
|
@ -152,7 +166,7 @@ enum EPolyFlags
|
||||||
// When set, pass the color constant into the FSurfaceInfo -> FlatColor
|
// When set, pass the color constant into the FSurfaceInfo -> FlatColor
|
||||||
PF_NoTexture = 0x00002000, // Use the small white texture
|
PF_NoTexture = 0x00002000, // Use the small white texture
|
||||||
PF_Corona = 0x00004000, // Tell the rendrer we are drawing a corona
|
PF_Corona = 0x00004000, // Tell the rendrer we are drawing a corona
|
||||||
PF_MD2 = 0x00008000, // Tell the rendrer we are drawing an MD2
|
PF_Unused = 0x00008000, // Unused
|
||||||
PF_RemoveYWrap = 0x00010000, // Force clamp texture on Y
|
PF_RemoveYWrap = 0x00010000, // Force clamp texture on Y
|
||||||
PF_ForceWrapX = 0x00020000, // Force repeat texture on X
|
PF_ForceWrapX = 0x00020000, // Force repeat texture on X
|
||||||
PF_ForceWrapY = 0x00040000, // Force repeat texture on Y
|
PF_ForceWrapY = 0x00040000, // Force repeat texture on Y
|
||||||
|
@ -210,8 +224,6 @@ enum hwdsetspecialstate
|
||||||
HWD_SET_FOG_COLOR,
|
HWD_SET_FOG_COLOR,
|
||||||
HWD_SET_FOG_DENSITY,
|
HWD_SET_FOG_DENSITY,
|
||||||
HWD_SET_FOV,
|
HWD_SET_FOV,
|
||||||
HWD_SET_POLYGON_SMOOTH,
|
|
||||||
HWD_SET_PALETTECOLOR,
|
|
||||||
HWD_SET_TEXTUREFILTERMODE,
|
HWD_SET_TEXTUREFILTERMODE,
|
||||||
HWD_SET_TEXTUREANISOTROPICMODE,
|
HWD_SET_TEXTUREANISOTROPICMODE,
|
||||||
HWD_NUMSTATE
|
HWD_NUMSTATE
|
||||||
|
|
|
@ -58,20 +58,18 @@ EXPORT void HWRAPI(ClearMipMapCache) (void);
|
||||||
EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value);
|
EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value);
|
||||||
|
|
||||||
//Hurdler: added for new development
|
//Hurdler: added for new development
|
||||||
EXPORT void HWRAPI(DrawMD2) (INT32 *gl_cmd_buffer, md2_frame_t *frame, FTransform *pos, float scale);
|
EXPORT void HWRAPI(DrawModel) (model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex, FTransform *pos, float scale, UINT8 flipped, UINT8 *color);
|
||||||
EXPORT void HWRAPI(DrawMD2i) (INT32 *gl_cmd_buffer, md2_frame_t *frame, INT32 duration, INT32 tics, md2_frame_t *nextframe, FTransform *pos, float scale, UINT8 flipped, UINT8 *color);
|
EXPORT void HWRAPI(CreateModelVBOs) (model_t *model);
|
||||||
EXPORT void HWRAPI(SetTransform) (FTransform *ptransform);
|
EXPORT void HWRAPI(SetTransform) (FTransform *ptransform);
|
||||||
EXPORT INT32 HWRAPI(GetTextureUsed) (void);
|
EXPORT INT32 HWRAPI(GetTextureUsed) (void);
|
||||||
EXPORT INT32 HWRAPI(GetRenderVersion) (void);
|
EXPORT INT32 HWRAPI(GetRenderVersion) (void);
|
||||||
|
|
||||||
#ifdef SHUFFLE
|
|
||||||
#define SCREENVERTS 10
|
#define SCREENVERTS 10
|
||||||
EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2]);
|
EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2]);
|
||||||
#endif
|
|
||||||
EXPORT void HWRAPI(FlushScreenTextures) (void);
|
EXPORT void HWRAPI(FlushScreenTextures) (void);
|
||||||
EXPORT void HWRAPI(StartScreenWipe) (void);
|
EXPORT void HWRAPI(StartScreenWipe) (void);
|
||||||
EXPORT void HWRAPI(EndScreenWipe) (void);
|
EXPORT void HWRAPI(EndScreenWipe) (void);
|
||||||
EXPORT void HWRAPI(DoScreenWipe) (float alpha);
|
EXPORT void HWRAPI(DoScreenWipe) (void);
|
||||||
EXPORT void HWRAPI(DrawIntermissionBG) (void);
|
EXPORT void HWRAPI(DrawIntermissionBG) (void);
|
||||||
EXPORT void HWRAPI(MakeScreenTexture) (void);
|
EXPORT void HWRAPI(MakeScreenTexture) (void);
|
||||||
EXPORT void HWRAPI(MakeScreenFinalTexture) (void);
|
EXPORT void HWRAPI(MakeScreenFinalTexture) (void);
|
||||||
|
@ -96,8 +94,8 @@ struct hwdriver_s
|
||||||
GClipRect pfnGClipRect;
|
GClipRect pfnGClipRect;
|
||||||
ClearMipMapCache pfnClearMipMapCache;
|
ClearMipMapCache pfnClearMipMapCache;
|
||||||
SetSpecialState pfnSetSpecialState;//Hurdler: added for backward compatibility
|
SetSpecialState pfnSetSpecialState;//Hurdler: added for backward compatibility
|
||||||
DrawMD2 pfnDrawMD2;
|
DrawModel pfnDrawModel;
|
||||||
DrawMD2i pfnDrawMD2i;
|
CreateModelVBOs pfnCreateModelVBOs;
|
||||||
SetTransform pfnSetTransform;
|
SetTransform pfnSetTransform;
|
||||||
GetTextureUsed pfnGetTextureUsed;
|
GetTextureUsed pfnGetTextureUsed;
|
||||||
GetRenderVersion pfnGetRenderVersion;
|
GetRenderVersion pfnGetRenderVersion;
|
||||||
|
@ -107,9 +105,7 @@ struct hwdriver_s
|
||||||
#ifndef HAVE_SDL
|
#ifndef HAVE_SDL
|
||||||
Shutdown pfnShutdown;
|
Shutdown pfnShutdown;
|
||||||
#endif
|
#endif
|
||||||
#ifdef SHUFFLE
|
|
||||||
PostImgRedraw pfnPostImgRedraw;
|
PostImgRedraw pfnPostImgRedraw;
|
||||||
#endif
|
|
||||||
FlushScreenTextures pfnFlushScreenTextures;
|
FlushScreenTextures pfnFlushScreenTextures;
|
||||||
StartScreenWipe pfnStartScreenWipe;
|
StartScreenWipe pfnStartScreenWipe;
|
||||||
EndScreenWipe pfnEndScreenWipe;
|
EndScreenWipe pfnEndScreenWipe;
|
||||||
|
|
|
@ -5261,14 +5261,14 @@ static void HWR_DrawSprites(void)
|
||||||
if (spr->mobj && spr->mobj->skin && spr->mobj->sprite == SPR_PLAY)
|
if (spr->mobj && spr->mobj->skin && spr->mobj->sprite == SPR_PLAY)
|
||||||
{
|
{
|
||||||
// 8/1/19: Only don't display player models if no default SPR_PLAY is found.
|
// 8/1/19: Only don't display player models if no default SPR_PLAY is found.
|
||||||
if (!cv_grmd2.value || ((md2_playermodels[(skin_t*)spr->mobj->skin-skins].notfound || md2_playermodels[(skin_t*)spr->mobj->skin-skins].scale < 0.0f) && ((!cv_grfallbackplayermodel.value) || md2_models[SPR_PLAY].notfound || md2_models[SPR_PLAY].scale < 0.0f)))
|
if (!cv_grmdls.value || ((md2_playermodels[(skin_t*)spr->mobj->skin-skins].notfound || md2_playermodels[(skin_t*)spr->mobj->skin-skins].scale < 0.0f) && ((!cv_grfallbackplayermodel.value) || md2_models[SPR_PLAY].notfound || md2_models[SPR_PLAY].scale < 0.0f)))
|
||||||
HWR_DrawSprite(spr);
|
HWR_DrawSprite(spr);
|
||||||
else
|
else
|
||||||
HWR_DrawMD2(spr);
|
HWR_DrawMD2(spr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!cv_grmd2.value || md2_models[spr->mobj->sprite].notfound || md2_models[spr->mobj->sprite].scale < 0.0f)
|
if (!cv_grmdls.value || md2_models[spr->mobj->sprite].notfound || md2_models[spr->mobj->sprite].scale < 0.0f)
|
||||||
HWR_DrawSprite(spr);
|
HWR_DrawSprite(spr);
|
||||||
else
|
else
|
||||||
HWR_DrawMD2(spr);
|
HWR_DrawMD2(spr);
|
||||||
|
@ -5435,7 +5435,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
|
||||||
tz = (tr_x * gr_viewcos) + (tr_y * gr_viewsin);
|
tz = (tr_x * gr_viewcos) + (tr_y * gr_viewsin);
|
||||||
|
|
||||||
// thing is behind view plane?
|
// thing is behind view plane?
|
||||||
if (tz < ZCLIP_PLANE && !papersprite && (!cv_grmd2.value || md2_models[thing->sprite].notfound == true)) //Yellow: Only MD2's dont disappear
|
if (tz < ZCLIP_PLANE && !papersprite && (!cv_grmdls.value || md2_models[thing->sprite].notfound == true)) //Yellow: Only MD2's dont disappear
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// The above can stay as it works for cutting sprites that are too close
|
// The above can stay as it works for cutting sprites that are too close
|
||||||
|
@ -6745,11 +6745,6 @@ static void HWR_RenderWall(wallVert3D *wallVerts, FSurfaceInfo *pSurf, FBITFIE
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void HWR_SetPaletteColor(INT32 palcolor)
|
|
||||||
{
|
|
||||||
HWD.pfnSetSpecialState(HWD_SET_PALETTECOLOR, palcolor);
|
|
||||||
}
|
|
||||||
|
|
||||||
INT32 HWR_GetTextureUsed(void)
|
INT32 HWR_GetTextureUsed(void)
|
||||||
{
|
{
|
||||||
return HWD.pfnGetTextureUsed();
|
return HWD.pfnGetTextureUsed();
|
||||||
|
@ -6801,7 +6796,6 @@ void HWR_DoPostProcessor(player_t *player)
|
||||||
if (splitscreen) // Not supported in splitscreen - someone want to add support?
|
if (splitscreen) // Not supported in splitscreen - someone want to add support?
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#ifdef SHUFFLE
|
|
||||||
// Drunken vision! WooOOooo~
|
// Drunken vision! WooOOooo~
|
||||||
if (*type == postimg_water || *type == postimg_heat)
|
if (*type == postimg_water || *type == postimg_heat)
|
||||||
{
|
{
|
||||||
|
@ -6844,7 +6838,6 @@ void HWR_DoPostProcessor(player_t *player)
|
||||||
HWD.pfnMakeScreenTexture();
|
HWD.pfnMakeScreenTexture();
|
||||||
}
|
}
|
||||||
// Flipping of the screen isn't done here anymore
|
// Flipping of the screen isn't done here anymore
|
||||||
#endif // SHUFFLE
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HWR_StartScreenWipe(void)
|
void HWR_StartScreenWipe(void)
|
||||||
|
@ -6891,7 +6884,7 @@ void HWR_DoWipe(UINT8 wipenum, UINT8 scrnnum)
|
||||||
|
|
||||||
HWR_GetFadeMask(lumpnum);
|
HWR_GetFadeMask(lumpnum);
|
||||||
|
|
||||||
HWD.pfnDoScreenWipe(HWRWipeCounter); // Still send in wipecounter since old stuff might not support multitexturing
|
HWD.pfnDoScreenWipe();
|
||||||
|
|
||||||
HWRWipeCounter += 0.05f; // increase opacity of end screen
|
HWRWipeCounter += 0.05f; // increase opacity of end screen
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,6 @@ void HWR_AddCommands(void);
|
||||||
void HWR_CorrectSWTricks(void);
|
void HWR_CorrectSWTricks(void);
|
||||||
void transform(float *cx, float *cy, float *cz);
|
void transform(float *cx, float *cy, float *cz);
|
||||||
FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf);
|
FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf);
|
||||||
void HWR_SetPaletteColor(INT32 palcolor);
|
|
||||||
INT32 HWR_GetTextureUsed(void);
|
INT32 HWR_GetTextureUsed(void);
|
||||||
void HWR_DoPostProcessor(player_t *player);
|
void HWR_DoPostProcessor(player_t *player);
|
||||||
void HWR_StartScreenWipe(void);
|
void HWR_StartScreenWipe(void);
|
||||||
|
@ -80,7 +79,7 @@ extern consvar_t cv_grstaticlighting;
|
||||||
extern consvar_t cv_grcoronas;
|
extern consvar_t cv_grcoronas;
|
||||||
extern consvar_t cv_grcoronasize;
|
extern consvar_t cv_grcoronasize;
|
||||||
#endif
|
#endif
|
||||||
extern consvar_t cv_grmd2;
|
extern consvar_t cv_grmdls;
|
||||||
extern consvar_t cv_grfallbackplayermodel;
|
extern consvar_t cv_grfallbackplayermodel;
|
||||||
extern consvar_t cv_grfog;
|
extern consvar_t cv_grfog;
|
||||||
extern consvar_t cv_grfogcolor;
|
extern consvar_t cv_grfogcolor;
|
||||||
|
@ -92,7 +91,6 @@ extern consvar_t cv_grgammablue;
|
||||||
extern consvar_t cv_grfiltermode;
|
extern consvar_t cv_grfiltermode;
|
||||||
extern consvar_t cv_granisotropicmode;
|
extern consvar_t cv_granisotropicmode;
|
||||||
extern consvar_t cv_grcorrecttricks;
|
extern consvar_t cv_grcorrecttricks;
|
||||||
extern consvar_t cv_voodoocompatibility;
|
|
||||||
extern consvar_t cv_grfovchange;
|
extern consvar_t cv_grfovchange;
|
||||||
extern consvar_t cv_grsolvetjoin;
|
extern consvar_t cv_grsolvetjoin;
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
#include "../r_draw.h"
|
#include "../r_draw.h"
|
||||||
#include "../p_tick.h"
|
#include "../p_tick.h"
|
||||||
#include "../k_kart.h" // colortranslations
|
#include "../k_kart.h" // colortranslations
|
||||||
|
#include "hw_model.h"
|
||||||
|
|
||||||
#include "hw_main.h"
|
#include "hw_main.h"
|
||||||
#include "../v_video.h"
|
#include "../v_video.h"
|
||||||
|
@ -75,172 +76,6 @@
|
||||||
#include "errno.h"
|
#include "errno.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define NUMVERTEXNORMALS 162
|
|
||||||
float avertexnormals[NUMVERTEXNORMALS][3] = {
|
|
||||||
{-0.525731f, 0.000000f, 0.850651f},
|
|
||||||
{-0.442863f, 0.238856f, 0.864188f},
|
|
||||||
{-0.295242f, 0.000000f, 0.955423f},
|
|
||||||
{-0.309017f, 0.500000f, 0.809017f},
|
|
||||||
{-0.162460f, 0.262866f, 0.951056f},
|
|
||||||
{0.000000f, 0.000000f, 1.000000f},
|
|
||||||
{0.000000f, 0.850651f, 0.525731f},
|
|
||||||
{-0.147621f, 0.716567f, 0.681718f},
|
|
||||||
{0.147621f, 0.716567f, 0.681718f},
|
|
||||||
{0.000000f, 0.525731f, 0.850651f},
|
|
||||||
{0.309017f, 0.500000f, 0.809017f},
|
|
||||||
{0.525731f, 0.000000f, 0.850651f},
|
|
||||||
{0.295242f, 0.000000f, 0.955423f},
|
|
||||||
{0.442863f, 0.238856f, 0.864188f},
|
|
||||||
{0.162460f, 0.262866f, 0.951056f},
|
|
||||||
{-0.681718f, 0.147621f, 0.716567f},
|
|
||||||
{-0.809017f, 0.309017f, 0.500000f},
|
|
||||||
{-0.587785f, 0.425325f, 0.688191f},
|
|
||||||
{-0.850651f, 0.525731f, 0.000000f},
|
|
||||||
{-0.864188f, 0.442863f, 0.238856f},
|
|
||||||
{-0.716567f, 0.681718f, 0.147621f},
|
|
||||||
{-0.688191f, 0.587785f, 0.425325f},
|
|
||||||
{-0.500000f, 0.809017f, 0.309017f},
|
|
||||||
{-0.238856f, 0.864188f, 0.442863f},
|
|
||||||
{-0.425325f, 0.688191f, 0.587785f},
|
|
||||||
{-0.716567f, 0.681718f, -0.147621f},
|
|
||||||
{-0.500000f, 0.809017f, -0.309017f},
|
|
||||||
{-0.525731f, 0.850651f, 0.000000f},
|
|
||||||
{0.000000f, 0.850651f, -0.525731f},
|
|
||||||
{-0.238856f, 0.864188f, -0.442863f},
|
|
||||||
{0.000000f, 0.955423f, -0.295242f},
|
|
||||||
{-0.262866f, 0.951056f, -0.162460f},
|
|
||||||
{0.000000f, 1.000000f, 0.000000f},
|
|
||||||
{0.000000f, 0.955423f, 0.295242f},
|
|
||||||
{-0.262866f, 0.951056f, 0.162460f},
|
|
||||||
{0.238856f, 0.864188f, 0.442863f},
|
|
||||||
{0.262866f, 0.951056f, 0.162460f},
|
|
||||||
{0.500000f, 0.809017f, 0.309017f},
|
|
||||||
{0.238856f, 0.864188f, -0.442863f},
|
|
||||||
{0.262866f, 0.951056f, -0.162460f},
|
|
||||||
{0.500000f, 0.809017f, -0.309017f},
|
|
||||||
{0.850651f, 0.525731f, 0.000000f},
|
|
||||||
{0.716567f, 0.681718f, 0.147621f},
|
|
||||||
{0.716567f, 0.681718f, -0.147621f},
|
|
||||||
{0.525731f, 0.850651f, 0.000000f},
|
|
||||||
{0.425325f, 0.688191f, 0.587785f},
|
|
||||||
{0.864188f, 0.442863f, 0.238856f},
|
|
||||||
{0.688191f, 0.587785f, 0.425325f},
|
|
||||||
{0.809017f, 0.309017f, 0.500000f},
|
|
||||||
{0.681718f, 0.147621f, 0.716567f},
|
|
||||||
{0.587785f, 0.425325f, 0.688191f},
|
|
||||||
{0.955423f, 0.295242f, 0.000000f},
|
|
||||||
{1.000000f, 0.000000f, 0.000000f},
|
|
||||||
{0.951056f, 0.162460f, 0.262866f},
|
|
||||||
{0.850651f, -0.525731f, 0.000000f},
|
|
||||||
{0.955423f, -0.295242f, 0.000000f},
|
|
||||||
{0.864188f, -0.442863f, 0.238856f},
|
|
||||||
{0.951056f, -0.162460f, 0.262866f},
|
|
||||||
{0.809017f, -0.309017f, 0.500000f},
|
|
||||||
{0.681718f, -0.147621f, 0.716567f},
|
|
||||||
{0.850651f, 0.000000f, 0.525731f},
|
|
||||||
{0.864188f, 0.442863f, -0.238856f},
|
|
||||||
{0.809017f, 0.309017f, -0.500000f},
|
|
||||||
{0.951056f, 0.162460f, -0.262866f},
|
|
||||||
{0.525731f, 0.000000f, -0.850651f},
|
|
||||||
{0.681718f, 0.147621f, -0.716567f},
|
|
||||||
{0.681718f, -0.147621f, -0.716567f},
|
|
||||||
{0.850651f, 0.000000f, -0.525731f},
|
|
||||||
{0.809017f, -0.309017f, -0.500000f},
|
|
||||||
{0.864188f, -0.442863f, -0.238856f},
|
|
||||||
{0.951056f, -0.162460f, -0.262866f},
|
|
||||||
{0.147621f, 0.716567f, -0.681718f},
|
|
||||||
{0.309017f, 0.500000f, -0.809017f},
|
|
||||||
{0.425325f, 0.688191f, -0.587785f},
|
|
||||||
{0.442863f, 0.238856f, -0.864188f},
|
|
||||||
{0.587785f, 0.425325f, -0.688191f},
|
|
||||||
{0.688191f, 0.587785f, -0.425325f},
|
|
||||||
{-0.147621f, 0.716567f, -0.681718f},
|
|
||||||
{-0.309017f, 0.500000f, -0.809017f},
|
|
||||||
{0.000000f, 0.525731f, -0.850651f},
|
|
||||||
{-0.525731f, 0.000000f, -0.850651f},
|
|
||||||
{-0.442863f, 0.238856f, -0.864188f},
|
|
||||||
{-0.295242f, 0.000000f, -0.955423f},
|
|
||||||
{-0.162460f, 0.262866f, -0.951056f},
|
|
||||||
{0.000000f, 0.000000f, -1.000000f},
|
|
||||||
{0.295242f, 0.000000f, -0.955423f},
|
|
||||||
{0.162460f, 0.262866f, -0.951056f},
|
|
||||||
{-0.442863f, -0.238856f, -0.864188f},
|
|
||||||
{-0.309017f, -0.500000f, -0.809017f},
|
|
||||||
{-0.162460f, -0.262866f, -0.951056f},
|
|
||||||
{0.000000f, -0.850651f, -0.525731f},
|
|
||||||
{-0.147621f, -0.716567f, -0.681718f},
|
|
||||||
{0.147621f, -0.716567f, -0.681718f},
|
|
||||||
{0.000000f, -0.525731f, -0.850651f},
|
|
||||||
{0.309017f, -0.500000f, -0.809017f},
|
|
||||||
{0.442863f, -0.238856f, -0.864188f},
|
|
||||||
{0.162460f, -0.262866f, -0.951056f},
|
|
||||||
{0.238856f, -0.864188f, -0.442863f},
|
|
||||||
{0.500000f, -0.809017f, -0.309017f},
|
|
||||||
{0.425325f, -0.688191f, -0.587785f},
|
|
||||||
{0.716567f, -0.681718f, -0.147621f},
|
|
||||||
{0.688191f, -0.587785f, -0.425325f},
|
|
||||||
{0.587785f, -0.425325f, -0.688191f},
|
|
||||||
{0.000000f, -0.955423f, -0.295242f},
|
|
||||||
{0.000000f, -1.000000f, 0.000000f},
|
|
||||||
{0.262866f, -0.951056f, -0.162460f},
|
|
||||||
{0.000000f, -0.850651f, 0.525731f},
|
|
||||||
{0.000000f, -0.955423f, 0.295242f},
|
|
||||||
{0.238856f, -0.864188f, 0.442863f},
|
|
||||||
{0.262866f, -0.951056f, 0.162460f},
|
|
||||||
{0.500000f, -0.809017f, 0.309017f},
|
|
||||||
{0.716567f, -0.681718f, 0.147621f},
|
|
||||||
{0.525731f, -0.850651f, 0.000000f},
|
|
||||||
{-0.238856f, -0.864188f, -0.442863f},
|
|
||||||
{-0.500000f, -0.809017f, -0.309017f},
|
|
||||||
{-0.262866f, -0.951056f, -0.162460f},
|
|
||||||
{-0.850651f, -0.525731f, 0.000000f},
|
|
||||||
{-0.716567f, -0.681718f, -0.147621f},
|
|
||||||
{-0.716567f, -0.681718f, 0.147621f},
|
|
||||||
{-0.525731f, -0.850651f, 0.000000f},
|
|
||||||
{-0.500000f, -0.809017f, 0.309017f},
|
|
||||||
{-0.238856f, -0.864188f, 0.442863f},
|
|
||||||
{-0.262866f, -0.951056f, 0.162460f},
|
|
||||||
{-0.864188f, -0.442863f, 0.238856f},
|
|
||||||
{-0.809017f, -0.309017f, 0.500000f},
|
|
||||||
{-0.688191f, -0.587785f, 0.425325f},
|
|
||||||
{-0.681718f, -0.147621f, 0.716567f},
|
|
||||||
{-0.442863f, -0.238856f, 0.864188f},
|
|
||||||
{-0.587785f, -0.425325f, 0.688191f},
|
|
||||||
{-0.309017f, -0.500000f, 0.809017f},
|
|
||||||
{-0.147621f, -0.716567f, 0.681718f},
|
|
||||||
{-0.425325f, -0.688191f, 0.587785f},
|
|
||||||
{-0.162460f, -0.262866f, 0.951056f},
|
|
||||||
{0.442863f, -0.238856f, 0.864188f},
|
|
||||||
{0.162460f, -0.262866f, 0.951056f},
|
|
||||||
{0.309017f, -0.500000f, 0.809017f},
|
|
||||||
{0.147621f, -0.716567f, 0.681718f},
|
|
||||||
{0.000000f, -0.525731f, 0.850651f},
|
|
||||||
{0.425325f, -0.688191f, 0.587785f},
|
|
||||||
{0.587785f, -0.425325f, 0.688191f},
|
|
||||||
{0.688191f, -0.587785f, 0.425325f},
|
|
||||||
{-0.955423f, 0.295242f, 0.000000f},
|
|
||||||
{-0.951056f, 0.162460f, 0.262866f},
|
|
||||||
{-1.000000f, 0.000000f, 0.000000f},
|
|
||||||
{-0.850651f, 0.000000f, 0.525731f},
|
|
||||||
{-0.955423f, -0.295242f, 0.000000f},
|
|
||||||
{-0.951056f, -0.162460f, 0.262866f},
|
|
||||||
{-0.864188f, 0.442863f, -0.238856f},
|
|
||||||
{-0.951056f, 0.162460f, -0.262866f},
|
|
||||||
{-0.809017f, 0.309017f, -0.500000f},
|
|
||||||
{-0.864188f, -0.442863f, -0.238856f},
|
|
||||||
{-0.951056f, -0.162460f, -0.262866f},
|
|
||||||
{-0.809017f, -0.309017f, -0.500000f},
|
|
||||||
{-0.681718f, 0.147621f, -0.716567f},
|
|
||||||
{-0.681718f, -0.147621f, -0.716567f},
|
|
||||||
{-0.850651f, 0.000000f, -0.525731f},
|
|
||||||
{-0.688191f, 0.587785f, -0.425325f},
|
|
||||||
{-0.587785f, 0.425325f, -0.688191f},
|
|
||||||
{-0.425325f, 0.688191f, -0.587785f},
|
|
||||||
{-0.425325f, -0.688191f, -0.587785f},
|
|
||||||
{-0.587785f, -0.425325f, -0.688191f},
|
|
||||||
{-0.688191f, -0.587785f, -0.425325f},
|
|
||||||
};
|
|
||||||
|
|
||||||
md2_t md2_models[NUMSPRITES];
|
md2_t md2_models[NUMSPRITES];
|
||||||
md2_t md2_playermodels[MAXSKINS];
|
md2_t md2_playermodels[MAXSKINS];
|
||||||
|
|
||||||
|
@ -248,198 +83,29 @@ md2_t md2_playermodels[MAXSKINS];
|
||||||
/*
|
/*
|
||||||
* free model
|
* free model
|
||||||
*/
|
*/
|
||||||
static void md2_freeModel (md2_model_t *model)
|
#if 0
|
||||||
|
static void md2_freeModel (model_t *model)
|
||||||
{
|
{
|
||||||
if (model)
|
UnloadModel(model);
|
||||||
{
|
|
||||||
if (model->skins)
|
|
||||||
free(model->skins);
|
|
||||||
|
|
||||||
if (model->texCoords)
|
|
||||||
free(model->texCoords);
|
|
||||||
|
|
||||||
if (model->triangles)
|
|
||||||
free(model->triangles);
|
|
||||||
|
|
||||||
if (model->frames)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < model->header.numFrames; i++)
|
|
||||||
{
|
|
||||||
if (model->frames[i].vertices)
|
|
||||||
free(model->frames[i].vertices);
|
|
||||||
}
|
|
||||||
free(model->frames);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (model->glCommandBuffer)
|
|
||||||
free(model->glCommandBuffer);
|
|
||||||
|
|
||||||
free(model);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// load model
|
// load model
|
||||||
//
|
//
|
||||||
// Hurdler: the current path is the Legacy.exe path
|
// Hurdler: the current path is the Legacy.exe path
|
||||||
static md2_model_t *md2_readModel(const char *filename)
|
static model_t *md2_readModel(const char *filename)
|
||||||
{
|
{
|
||||||
FILE *file;
|
|
||||||
md2_model_t *model;
|
|
||||||
UINT8 buffer[MD2_MAX_FRAMESIZE];
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
model = calloc(1, sizeof (*model));
|
|
||||||
if (model == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
//Filename checking fixed ~Monster Iestyn and Golden
|
//Filename checking fixed ~Monster Iestyn and Golden
|
||||||
file = fopen(va("%s"PATHSEP"%s", srb2home, filename), "rb");
|
if (FIL_FileExists(va("%s"PATHSEP"%s", srb2home, filename)))
|
||||||
if (!file)
|
return LoadModel(va("%s"PATHSEP"%s", srb2home, filename), PU_STATIC);
|
||||||
{
|
else if (FIL_FileExists(va("%s"PATHSEP"%s", srb2path, filename)))
|
||||||
file = fopen(va("%s"PATHSEP"%s", srb2path, filename), "rb");
|
return LoadModel(va("%s"PATHSEP"%s", srb2path, filename), PU_STATIC);
|
||||||
if (!file)
|
return NULL;
|
||||||
{
|
|
||||||
free(model);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// initialize model and read header
|
|
||||||
|
|
||||||
if (fread(&model->header, sizeof (model->header), 1, file) != 1
|
|
||||||
|| model->header.magic != MD2_IDENT
|
|
||||||
|| model->header.version != MD2_VERSION)
|
|
||||||
{
|
|
||||||
fclose(file);
|
|
||||||
free(model);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
model->header.numSkins = 1;
|
|
||||||
|
|
||||||
#define MD2LIMITCHECK(field, max, msgname) \
|
|
||||||
if (field > max) \
|
|
||||||
{ \
|
|
||||||
CONS_Alert(CONS_ERROR, "md2_readModel: %s has too many " msgname " (# found: %d, maximum: %d)\n", filename, field, max); \
|
|
||||||
md2_freeModel (model); \
|
|
||||||
fclose(file); \
|
|
||||||
return 0; \
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uncomment if these are actually needed
|
|
||||||
// MD2LIMITCHECK(model->header.numSkins, MD2_MAX_SKINS, "skins")
|
|
||||||
// MD2LIMITCHECK(model->header.numTexCoords, MD2_MAX_TEXCOORDS, "texture coordinates")
|
|
||||||
MD2LIMITCHECK(model->header.numTriangles, MD2_MAX_TRIANGLES, "triangles")
|
|
||||||
MD2LIMITCHECK(model->header.numFrames, MD2_MAX_FRAMES, "frames")
|
|
||||||
MD2LIMITCHECK(model->header.numVertices, MD2_MAX_VERTICES, "vertices")
|
|
||||||
|
|
||||||
#undef MD2LIMITCHECK
|
|
||||||
|
|
||||||
// read skins
|
|
||||||
fseek(file, model->header.offsetSkins, SEEK_SET);
|
|
||||||
if (model->header.numSkins > 0)
|
|
||||||
{
|
|
||||||
model->skins = calloc(sizeof (md2_skin_t), model->header.numSkins);
|
|
||||||
if (!model->skins || model->header.numSkins !=
|
|
||||||
fread(model->skins, sizeof (md2_skin_t), model->header.numSkins, file))
|
|
||||||
{
|
|
||||||
md2_freeModel (model);
|
|
||||||
fclose(file);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// read texture coordinates
|
|
||||||
fseek(file, model->header.offsetTexCoords, SEEK_SET);
|
|
||||||
if (model->header.numTexCoords > 0)
|
|
||||||
{
|
|
||||||
model->texCoords = calloc(sizeof (md2_textureCoordinate_t), model->header.numTexCoords);
|
|
||||||
if (!model->texCoords || model->header.numTexCoords !=
|
|
||||||
fread(model->texCoords, sizeof (md2_textureCoordinate_t), model->header.numTexCoords, file))
|
|
||||||
{
|
|
||||||
md2_freeModel (model);
|
|
||||||
fclose(file);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// read triangles
|
|
||||||
fseek(file, model->header.offsetTriangles, SEEK_SET);
|
|
||||||
if (model->header.numTriangles > 0)
|
|
||||||
{
|
|
||||||
model->triangles = calloc(sizeof (md2_triangle_t), model->header.numTriangles);
|
|
||||||
if (!model->triangles || model->header.numTriangles !=
|
|
||||||
fread(model->triangles, sizeof (md2_triangle_t), model->header.numTriangles, file))
|
|
||||||
{
|
|
||||||
md2_freeModel (model);
|
|
||||||
fclose(file);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// read alias frames
|
|
||||||
fseek(file, model->header.offsetFrames, SEEK_SET);
|
|
||||||
if (model->header.numFrames > 0)
|
|
||||||
{
|
|
||||||
model->frames = calloc(sizeof (md2_frame_t), model->header.numFrames);
|
|
||||||
if (!model->frames)
|
|
||||||
{
|
|
||||||
md2_freeModel (model);
|
|
||||||
fclose(file);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < model->header.numFrames; i++)
|
|
||||||
{
|
|
||||||
md2_alias_frame_t *frame = (md2_alias_frame_t *)(void *)buffer;
|
|
||||||
size_t j;
|
|
||||||
|
|
||||||
model->frames[i].vertices = calloc(sizeof (md2_triangleVertex_t), model->header.numVertices);
|
|
||||||
if (!model->frames[i].vertices || model->header.frameSize !=
|
|
||||||
fread(frame, 1, model->header.frameSize, file))
|
|
||||||
{
|
|
||||||
md2_freeModel (model);
|
|
||||||
fclose(file);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(model->frames[i].name, frame->name);
|
|
||||||
for (j = 0; j < model->header.numVertices; j++)
|
|
||||||
{
|
|
||||||
model->frames[i].vertices[j].vertex[0] = (float) ((INT32) frame->alias_vertices[j].vertex[0]) * frame->scale[0] + frame->translate[0];
|
|
||||||
model->frames[i].vertices[j].vertex[2] = -1* ((float) ((INT32) frame->alias_vertices[j].vertex[1]) * frame->scale[1] + frame->translate[1]);
|
|
||||||
model->frames[i].vertices[j].vertex[1] = (float) ((INT32) frame->alias_vertices[j].vertex[2]) * frame->scale[2] + frame->translate[2];
|
|
||||||
model->frames[i].vertices[j].normal[0] = avertexnormals[frame->alias_vertices[j].lightNormalIndex][0];
|
|
||||||
model->frames[i].vertices[j].normal[1] = avertexnormals[frame->alias_vertices[j].lightNormalIndex][1];
|
|
||||||
model->frames[i].vertices[j].normal[2] = avertexnormals[frame->alias_vertices[j].lightNormalIndex][2];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// read gl commands
|
|
||||||
fseek(file, model->header.offsetGlCommands, SEEK_SET);
|
|
||||||
if (model->header.numGlCommands)
|
|
||||||
{
|
|
||||||
model->glCommandBuffer = calloc(sizeof (INT32), model->header.numGlCommands);
|
|
||||||
if (!model->glCommandBuffer || model->header.numGlCommands !=
|
|
||||||
fread(model->glCommandBuffer, sizeof (INT32), model->header.numGlCommands, file))
|
|
||||||
{
|
|
||||||
md2_freeModel (model);
|
|
||||||
fclose(file);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(file);
|
|
||||||
|
|
||||||
return model;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void md2_printModelInfo (md2_model_t *model)
|
static inline void md2_printModelInfo (model_t *model)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
INT32 i;
|
INT32 i;
|
||||||
|
@ -498,13 +164,13 @@ static GrTextureFormat_t PNG_Load(const char *filename, int *w, int *h, GLPatch_
|
||||||
#endif
|
#endif
|
||||||
volatile png_FILE_p png_FILE;
|
volatile png_FILE_p png_FILE;
|
||||||
//Filename checking fixed ~Monster Iestyn and Golden
|
//Filename checking fixed ~Monster Iestyn and Golden
|
||||||
char *pngfilename = va("%s"PATHSEP"md2"PATHSEP"%s", srb2home, filename);
|
char *pngfilename = va("%s"PATHSEP"mdls"PATHSEP"%s", srb2home, filename);
|
||||||
|
|
||||||
FIL_ForceExtension(pngfilename, ".png");
|
FIL_ForceExtension(pngfilename, ".png");
|
||||||
png_FILE = fopen(pngfilename, "rb");
|
png_FILE = fopen(pngfilename, "rb");
|
||||||
if (!png_FILE)
|
if (!png_FILE)
|
||||||
{
|
{
|
||||||
pngfilename = va("%s"PATHSEP"md2"PATHSEP"%s", srb2path, filename);
|
pngfilename = va("%s"PATHSEP"mdls"PATHSEP"%s", srb2path, filename);
|
||||||
FIL_ForceExtension(pngfilename, ".png");
|
FIL_ForceExtension(pngfilename, ".png");
|
||||||
png_FILE = fopen(pngfilename, "rb");
|
png_FILE = fopen(pngfilename, "rb");
|
||||||
//CONS_Debug(DBG_RENDER, "M_SavePNG: Error on opening %s for loading\n", filename);
|
//CONS_Debug(DBG_RENDER, "M_SavePNG: Error on opening %s for loading\n", filename);
|
||||||
|
@ -631,13 +297,13 @@ static GrTextureFormat_t PCX_Load(const char *filename, int *w, int *h,
|
||||||
INT32 ch, rep;
|
INT32 ch, rep;
|
||||||
FILE *file;
|
FILE *file;
|
||||||
//Filename checking fixed ~Monster Iestyn and Golden
|
//Filename checking fixed ~Monster Iestyn and Golden
|
||||||
char *pcxfilename = va("%s"PATHSEP"md2"PATHSEP"%s", srb2home, filename);
|
char *pcxfilename = va("%s"PATHSEP"mdls"PATHSEP"%s", srb2home, filename);
|
||||||
|
|
||||||
FIL_ForceExtension(pcxfilename, ".pcx");
|
FIL_ForceExtension(pcxfilename, ".pcx");
|
||||||
file = fopen(pcxfilename, "rb");
|
file = fopen(pcxfilename, "rb");
|
||||||
if (!file)
|
if (!file)
|
||||||
{
|
{
|
||||||
pcxfilename = va("%s"PATHSEP"md2"PATHSEP"%s", srb2path, filename);
|
pcxfilename = va("%s"PATHSEP"mdls"PATHSEP"%s", srb2path, filename);
|
||||||
FIL_ForceExtension(pcxfilename, ".pcx");
|
FIL_ForceExtension(pcxfilename, ".pcx");
|
||||||
file = fopen(pcxfilename, "rb");
|
file = fopen(pcxfilename, "rb");
|
||||||
if (!file)
|
if (!file)
|
||||||
|
@ -826,16 +492,16 @@ void HWR_InitMD2(void)
|
||||||
md2_models[i].error = false;
|
md2_models[i].error = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// read the md2.dat file
|
// read the mdls.dat file
|
||||||
//Filename checking fixed ~Monster Iestyn and Golden
|
//Filename checking fixed ~Monster Iestyn and Golden
|
||||||
f = fopen(va("%s"PATHSEP"%s", srb2home, "kmd2.dat"), "rt");
|
f = fopen(va("%s"PATHSEP"%s", srb2home, "mdls.dat"), "rt");
|
||||||
|
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
f = fopen(va("%s"PATHSEP"%s", srb2path, "kmd2.dat"), "rt");
|
f = fopen(va("%s"PATHSEP"%s", srb2path, "mdls.dat"), "rt");
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
CONS_Printf("%s %s\n", M_GetText("Error while loading kmd2.dat:"), strerror(errno));
|
CONS_Printf("%s %s\n", M_GetText("Error while loading mdls.dat:"), strerror(errno));
|
||||||
nomd2s = true;
|
nomd2s = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -844,7 +510,7 @@ void HWR_InitMD2(void)
|
||||||
{
|
{
|
||||||
/*if (stricmp(name, "PLAY") == 0)
|
/*if (stricmp(name, "PLAY") == 0)
|
||||||
{
|
{
|
||||||
CONS_Printf("MD2 for sprite PLAY detected in kmd2.dat, use a player skin instead!\n");
|
CONS_Printf("MD2 for sprite PLAY detected in mdls.dat, use a player skin instead!\n");
|
||||||
continue;
|
continue;
|
||||||
}*/
|
}*/
|
||||||
// 8/1/19: Allow PLAY to load for default MD2.
|
// 8/1/19: Allow PLAY to load for default MD2.
|
||||||
|
@ -879,7 +545,7 @@ void HWR_InitMD2(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// no sprite/player skin name found?!?
|
// no sprite/player skin name found?!?
|
||||||
CONS_Printf("Unknown sprite/player skin %s detected in kmd2.dat\n", name);
|
CONS_Printf("Unknown sprite/player skin %s detected in mdls.dat\n", name);
|
||||||
md2found:
|
md2found:
|
||||||
// move on to next line...
|
// move on to next line...
|
||||||
continue;
|
continue;
|
||||||
|
@ -898,16 +564,16 @@ void HWR_AddPlayerMD2(int skin) // For MD2's that were added after startup
|
||||||
|
|
||||||
CONS_Printf("AddPlayerMD2()...\n");
|
CONS_Printf("AddPlayerMD2()...\n");
|
||||||
|
|
||||||
// read the md2.dat file
|
// read the mdls.dat file
|
||||||
//Filename checking fixed ~Monster Iestyn and Golden
|
//Filename checking fixed ~Monster Iestyn and Golden
|
||||||
f = fopen(va("%s"PATHSEP"%s", srb2home, "kmd2.dat"), "rt");
|
f = fopen(va("%s"PATHSEP"%s", srb2home, "mdls.dat"), "rt");
|
||||||
|
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
f = fopen(va("%s"PATHSEP"%s", srb2path, "kmd2.dat"), "rt");
|
f = fopen(va("%s"PATHSEP"%s", srb2path, "mdls.dat"), "rt");
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
CONS_Printf("%s %s\n", M_GetText("Error while loading kmd2.dat:"), strerror(errno));
|
CONS_Printf("%s %s\n", M_GetText("Error while loading mdls.dat:"), strerror(errno));
|
||||||
nomd2s = true;
|
nomd2s = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -937,7 +603,7 @@ playermd2found:
|
||||||
void HWR_AddSpriteMD2(size_t spritenum) // For MD2s that were added after startup
|
void HWR_AddSpriteMD2(size_t spritenum) // For MD2s that were added after startup
|
||||||
{
|
{
|
||||||
FILE *f;
|
FILE *f;
|
||||||
// name[18] is used to check for names in the kmd2.dat file that match with sprites or player skins
|
// name[18] is used to check for names in the mdls.dat file that match with sprites or player skins
|
||||||
// sprite names are always 4 characters long, and names is for player skins can be up to 19 characters long
|
// sprite names are always 4 characters long, and names is for player skins can be up to 19 characters long
|
||||||
char name[18], filename[32];
|
char name[18], filename[32];
|
||||||
float scale, offset;
|
float scale, offset;
|
||||||
|
@ -950,20 +616,20 @@ void HWR_AddSpriteMD2(size_t spritenum) // For MD2s that were added after startu
|
||||||
|
|
||||||
// Read the md2.dat file
|
// Read the md2.dat file
|
||||||
//Filename checking fixed ~Monster Iestyn and Golden
|
//Filename checking fixed ~Monster Iestyn and Golden
|
||||||
f = fopen(va("%s"PATHSEP"%s", srb2home, "kmd2.dat"), "rt");
|
f = fopen(va("%s"PATHSEP"%s", srb2home, "mdls.dat"), "rt");
|
||||||
|
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
f = fopen(va("%s"PATHSEP"%s", srb2path, "kmd2.dat"), "rt");
|
f = fopen(va("%s"PATHSEP"%s", srb2path, "mdls.dat"), "rt");
|
||||||
if (!f)
|
if (!f)
|
||||||
{
|
{
|
||||||
CONS_Printf("%s %s\n", M_GetText("Error while loading kmd2.dat:"), strerror(errno));
|
CONS_Printf("%s %s\n", M_GetText("Error while loading mdls.dat:"), strerror(errno));
|
||||||
nomd2s = true;
|
nomd2s = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for any MD2s that match the names of player skins!
|
// Check for any MD2s that match the names of sprite names!
|
||||||
while (fscanf(f, "%19s %31s %f %f", name, filename, &scale, &offset) == 4)
|
while (fscanf(f, "%19s %31s %f %f", name, filename, &scale, &offset) == 4)
|
||||||
{
|
{
|
||||||
if (stricmp(name, sprnames[spritenum]) == 0)
|
if (stricmp(name, sprnames[spritenum]) == 0)
|
||||||
|
@ -1195,12 +861,13 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
|
||||||
FSurfaceInfo Surf;
|
FSurfaceInfo Surf;
|
||||||
|
|
||||||
char filename[64];
|
char filename[64];
|
||||||
INT32 frame;
|
INT32 frame = 0;
|
||||||
|
INT32 nextFrame = -1;
|
||||||
FTransform p;
|
FTransform p;
|
||||||
md2_t *md2;
|
md2_t *md2;
|
||||||
UINT8 color[4];
|
UINT8 color[4];
|
||||||
|
|
||||||
if (!cv_grmd2.value)
|
if (!cv_grmdls.value)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (spr->precip)
|
if (spr->precip)
|
||||||
|
@ -1248,10 +915,9 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
|
||||||
// Look at HWR_ProjectSprite for more
|
// Look at HWR_ProjectSprite for more
|
||||||
{
|
{
|
||||||
GLPatch_t *gpatch;
|
GLPatch_t *gpatch;
|
||||||
INT32 *buff;
|
|
||||||
INT32 durs = spr->mobj->state->tics;
|
INT32 durs = spr->mobj->state->tics;
|
||||||
INT32 tics = spr->mobj->tics;
|
INT32 tics = spr->mobj->tics;
|
||||||
md2_frame_t *curr, *next = NULL;
|
//mdlframe_t *next = NULL;
|
||||||
const UINT8 flip = (UINT8)((spr->mobj->eflags & MFE_VERTICALFLIP) == MFE_VERTICALFLIP);
|
const UINT8 flip = (UINT8)((spr->mobj->eflags & MFE_VERTICALFLIP) == MFE_VERTICALFLIP);
|
||||||
spritedef_t *sprdef;
|
spritedef_t *sprdef;
|
||||||
spriteframe_t *sprframe;
|
spriteframe_t *sprframe;
|
||||||
|
@ -1285,13 +951,14 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
|
||||||
return; // we already failed loading this before :(
|
return; // we already failed loading this before :(
|
||||||
if (!md2->model)
|
if (!md2->model)
|
||||||
{
|
{
|
||||||
CONS_Debug(DBG_RENDER, "Loading MD2... (%s, %s)", sprnames[spr->mobj->sprite], md2->filename);
|
CONS_Debug(DBG_RENDER, "Loading model... (%s, %s)", sprnames[spr->mobj->sprite], md2->filename);
|
||||||
sprintf(filename, "md2/%s", md2->filename);
|
sprintf(filename, "mdls/%s", md2->filename);
|
||||||
md2->model = md2_readModel(filename);
|
md2->model = md2_readModel(filename);
|
||||||
|
|
||||||
if (md2->model)
|
if (md2->model)
|
||||||
{
|
{
|
||||||
md2_printModelInfo(md2->model);
|
md2_printModelInfo(md2->model);
|
||||||
|
HWD.pfnCreateModelVBOs(md2->model);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1364,27 +1031,27 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME: this is not yet correct
|
//FIXME: this is not yet correct
|
||||||
frame = (spr->mobj->frame & FF_FRAMEMASK) % md2->model->header.numFrames;
|
frame = (spr->mobj->frame & FF_FRAMEMASK) % md2->model->meshes[0].numFrames;
|
||||||
buff = md2->model->glCommandBuffer;
|
|
||||||
curr = &md2->model->frames[frame];
|
#ifdef USE_MODEL_NEXTFRAME
|
||||||
#if 0
|
if (cv_grmdls.value == 1 && tics <= durs)
|
||||||
if (cv_grmd2.value == 1 && tics <= durs)
|
|
||||||
{
|
{
|
||||||
// frames are handled differently for states with FF_ANIMATE, so get the next frame differently for the interpolation
|
// frames are handled differently for states with FF_ANIMATE, so get the next frame differently for the interpolation
|
||||||
if (spr->mobj->frame & FF_ANIMATE)
|
if (spr->mobj->frame & FF_ANIMATE)
|
||||||
{
|
{
|
||||||
UINT32 nextframe = (spr->mobj->frame & FF_FRAMEMASK) + 1;
|
nextFrame = (spr->mobj->frame & FF_FRAMEMASK) + 1;
|
||||||
if (nextframe >= (UINT32)spr->mobj->state->var1)
|
if (nextFrame >= spr->mobj->state->var1)
|
||||||
nextframe = (spr->mobj->state->frame & FF_FRAMEMASK);
|
nextFrame = (spr->mobj->state->frame & FF_FRAMEMASK);
|
||||||
nextframe %= md2->model->header.numFrames;
|
nextFrame %= md2->model->meshes[0].numFrames;
|
||||||
next = &md2->model->frames[nextframe];
|
//next = &md2->model->meshes[0].frames[nextFrame];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (spr->mobj->state->nextstate != S_NULL && states[spr->mobj->state->nextstate].sprite != SPR_NULL)
|
if (spr->mobj->state->nextstate != S_NULL && states[spr->mobj->state->nextstate].sprite != SPR_NULL
|
||||||
|
&& !(spr->mobj->player && (spr->mobj->state->nextstate == S_PLAY_TAP1 || spr->mobj->state->nextstate == S_PLAY_TAP2) && spr->mobj->state == &states[S_PLAY_STND]))
|
||||||
{
|
{
|
||||||
const UINT32 nextframe = (states[spr->mobj->state->nextstate].frame & FF_FRAMEMASK) % md2->model->header.numFrames;
|
nextFrame = (states[spr->mobj->state->nextstate].frame & FF_FRAMEMASK) % md2->model->meshes[0].numFrames;
|
||||||
next = &md2->model->frames[nextframe];
|
//next = &md2->model->meshes[0].frames[nextFrame];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1421,6 +1088,8 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
|
||||||
p.angley = FIXED_TO_FLOAT(anglef);
|
p.angley = FIXED_TO_FLOAT(anglef);
|
||||||
}
|
}
|
||||||
p.anglex = 0.0f;
|
p.anglex = 0.0f;
|
||||||
|
#ifdef USE_FTRANSFORM_ANGLEZ
|
||||||
|
// Slope rotation from Kart
|
||||||
p.anglez = 0.0f;
|
p.anglez = 0.0f;
|
||||||
if (spr->mobj->standingslope)
|
if (spr->mobj->standingslope)
|
||||||
{
|
{
|
||||||
|
@ -1432,7 +1101,7 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
|
||||||
tempangle = -AngleFixed(R_PointToAngle2(0, 0, tempz, tempy));
|
tempangle = -AngleFixed(R_PointToAngle2(0, 0, tempz, tempy));
|
||||||
p.anglex = FIXED_TO_FLOAT(tempangle);
|
p.anglex = FIXED_TO_FLOAT(tempangle);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
color[0] = Surf.FlatColor.s.red;
|
color[0] = Surf.FlatColor.s.red;
|
||||||
color[1] = Surf.FlatColor.s.green;
|
color[1] = Surf.FlatColor.s.green;
|
||||||
|
@ -1443,9 +1112,11 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
|
||||||
finalscale *= FIXED_TO_FLOAT(spr->mobj->scale);
|
finalscale *= FIXED_TO_FLOAT(spr->mobj->scale);
|
||||||
|
|
||||||
p.flip = atransform.flip;
|
p.flip = atransform.flip;
|
||||||
p.mirror = atransform.mirror;
|
#ifdef USE_FTRANSFORM_MIRROR
|
||||||
|
p.mirror = atransform.mirror; // from Kart
|
||||||
|
#endif
|
||||||
|
|
||||||
HWD.pfnDrawMD2i(buff, curr, durs, tics, next, &p, finalscale, flip, color);
|
HWD.pfnDrawModel(md2->model, frame, durs, tics, nextFrame, &p, finalscale, flip, color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,97 +22,7 @@
|
||||||
#define _HW_MD2_H_
|
#define _HW_MD2_H_
|
||||||
|
|
||||||
#include "hw_glob.h"
|
#include "hw_glob.h"
|
||||||
|
#include "hw_model.h"
|
||||||
// magic number "IDP2" or 844121161
|
|
||||||
#define MD2_IDENT (INT32)(('2' << 24) + ('P' << 16) + ('D' << 8) + 'I')
|
|
||||||
// model version
|
|
||||||
#define MD2_VERSION 8
|
|
||||||
|
|
||||||
#define MD2_MAX_TRIANGLES 16384
|
|
||||||
#define MD2_MAX_VERTICES 4096
|
|
||||||
#define MD2_MAX_TEXCOORDS 4096
|
|
||||||
#define MD2_MAX_FRAMES 512
|
|
||||||
#define MD2_MAX_SKINS 32
|
|
||||||
#define MD2_MAX_FRAMESIZE (MD2_MAX_VERTICES * 4 + 128)
|
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#pragma pack(1)
|
|
||||||
#endif
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
UINT32 magic;
|
|
||||||
UINT32 version;
|
|
||||||
UINT32 skinWidth;
|
|
||||||
UINT32 skinHeight;
|
|
||||||
UINT32 frameSize;
|
|
||||||
UINT32 numSkins;
|
|
||||||
UINT32 numVertices;
|
|
||||||
UINT32 numTexCoords;
|
|
||||||
UINT32 numTriangles;
|
|
||||||
UINT32 numGlCommands;
|
|
||||||
UINT32 numFrames;
|
|
||||||
UINT32 offsetSkins;
|
|
||||||
UINT32 offsetTexCoords;
|
|
||||||
UINT32 offsetTriangles;
|
|
||||||
UINT32 offsetFrames;
|
|
||||||
UINT32 offsetGlCommands;
|
|
||||||
UINT32 offsetEnd;
|
|
||||||
} ATTRPACK md2_header_t; //NOTE: each of md2_header's members are 4 unsigned bytes
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
UINT8 vertex[3];
|
|
||||||
UINT8 lightNormalIndex;
|
|
||||||
} ATTRPACK md2_alias_triangleVertex_t;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
float vertex[3];
|
|
||||||
float normal[3];
|
|
||||||
} ATTRPACK md2_triangleVertex_t;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
INT16 vertexIndices[3];
|
|
||||||
INT16 textureIndices[3];
|
|
||||||
} ATTRPACK md2_triangle_t;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
INT16 s, t;
|
|
||||||
} ATTRPACK md2_textureCoordinate_t;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
float scale[3];
|
|
||||||
float translate[3];
|
|
||||||
char name[16];
|
|
||||||
md2_alias_triangleVertex_t alias_vertices[1];
|
|
||||||
} ATTRPACK md2_alias_frame_t;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
char name[16];
|
|
||||||
md2_triangleVertex_t *vertices;
|
|
||||||
} ATTRPACK md2_frame_t;
|
|
||||||
|
|
||||||
typedef char md2_skin_t[64];
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
float s, t;
|
|
||||||
INT32 vertexIndex;
|
|
||||||
} ATTRPACK md2_glCommandVertex_t;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
md2_header_t header;
|
|
||||||
md2_skin_t *skins;
|
|
||||||
md2_textureCoordinate_t *texCoords;
|
|
||||||
md2_triangle_t *triangles;
|
|
||||||
md2_frame_t *frames;
|
|
||||||
INT32 *glCommandBuffer;
|
|
||||||
} ATTRPACK md2_model_t;
|
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
@ -123,7 +33,7 @@ typedef struct
|
||||||
char filename[32];
|
char filename[32];
|
||||||
float scale;
|
float scale;
|
||||||
float offset;
|
float offset;
|
||||||
md2_model_t *model;
|
model_t *model;
|
||||||
void *grpatch;
|
void *grpatch;
|
||||||
void *blendgrpatch;
|
void *blendgrpatch;
|
||||||
boolean notfound;
|
boolean notfound;
|
||||||
|
|
564
src/hardware/hw_md2load.c
Normal file
564
src/hardware/hw_md2load.c
Normal file
|
@ -0,0 +1,564 @@
|
||||||
|
/*
|
||||||
|
From the 'Wizard2' engine by Spaddlewit Inc. ( http://www.spaddlewit.com )
|
||||||
|
An experimental work-in-progress.
|
||||||
|
|
||||||
|
Donated to Sonic Team Junior and adapted to work with
|
||||||
|
Sonic Robo Blast 2. The license of this code matches whatever
|
||||||
|
the licensing is for Sonic Robo Blast 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "../doomdef.h"
|
||||||
|
#include "hw_md2load.h"
|
||||||
|
#include "hw_model.h"
|
||||||
|
#include "../z_zone.h"
|
||||||
|
|
||||||
|
#define NUMVERTEXNORMALS 162
|
||||||
|
|
||||||
|
// Quake 2 normals are indexed. Use avertexnormals[normalindex][x/y/z] and
|
||||||
|
// you'll have your normals.
|
||||||
|
float avertexnormals[NUMVERTEXNORMALS][3] = {
|
||||||
|
{-0.525731f, 0.000000f, 0.850651f},
|
||||||
|
{-0.442863f, 0.238856f, 0.864188f},
|
||||||
|
{-0.295242f, 0.000000f, 0.955423f},
|
||||||
|
{-0.309017f, 0.500000f, 0.809017f},
|
||||||
|
{-0.162460f, 0.262866f, 0.951056f},
|
||||||
|
{0.000000f, 0.000000f, 1.000000f},
|
||||||
|
{0.000000f, 0.850651f, 0.525731f},
|
||||||
|
{-0.147621f, 0.716567f, 0.681718f},
|
||||||
|
{0.147621f, 0.716567f, 0.681718f},
|
||||||
|
{0.000000f, 0.525731f, 0.850651f},
|
||||||
|
{0.309017f, 0.500000f, 0.809017f},
|
||||||
|
{0.525731f, 0.000000f, 0.850651f},
|
||||||
|
{0.295242f, 0.000000f, 0.955423f},
|
||||||
|
{0.442863f, 0.238856f, 0.864188f},
|
||||||
|
{0.162460f, 0.262866f, 0.951056f},
|
||||||
|
{-0.681718f, 0.147621f, 0.716567f},
|
||||||
|
{-0.809017f, 0.309017f, 0.500000f},
|
||||||
|
{-0.587785f, 0.425325f, 0.688191f},
|
||||||
|
{-0.850651f, 0.525731f, 0.000000f},
|
||||||
|
{-0.864188f, 0.442863f, 0.238856f},
|
||||||
|
{-0.716567f, 0.681718f, 0.147621f},
|
||||||
|
{-0.688191f, 0.587785f, 0.425325f},
|
||||||
|
{-0.500000f, 0.809017f, 0.309017f},
|
||||||
|
{-0.238856f, 0.864188f, 0.442863f},
|
||||||
|
{-0.425325f, 0.688191f, 0.587785f},
|
||||||
|
{-0.716567f, 0.681718f, -0.147621f},
|
||||||
|
{-0.500000f, 0.809017f, -0.309017f},
|
||||||
|
{-0.525731f, 0.850651f, 0.000000f},
|
||||||
|
{0.000000f, 0.850651f, -0.525731f},
|
||||||
|
{-0.238856f, 0.864188f, -0.442863f},
|
||||||
|
{0.000000f, 0.955423f, -0.295242f},
|
||||||
|
{-0.262866f, 0.951056f, -0.162460f},
|
||||||
|
{0.000000f, 1.000000f, 0.000000f},
|
||||||
|
{0.000000f, 0.955423f, 0.295242f},
|
||||||
|
{-0.262866f, 0.951056f, 0.162460f},
|
||||||
|
{0.238856f, 0.864188f, 0.442863f},
|
||||||
|
{0.262866f, 0.951056f, 0.162460f},
|
||||||
|
{0.500000f, 0.809017f, 0.309017f},
|
||||||
|
{0.238856f, 0.864188f, -0.442863f},
|
||||||
|
{0.262866f, 0.951056f, -0.162460f},
|
||||||
|
{0.500000f, 0.809017f, -0.309017f},
|
||||||
|
{0.850651f, 0.525731f, 0.000000f},
|
||||||
|
{0.716567f, 0.681718f, 0.147621f},
|
||||||
|
{0.716567f, 0.681718f, -0.147621f},
|
||||||
|
{0.525731f, 0.850651f, 0.000000f},
|
||||||
|
{0.425325f, 0.688191f, 0.587785f},
|
||||||
|
{0.864188f, 0.442863f, 0.238856f},
|
||||||
|
{0.688191f, 0.587785f, 0.425325f},
|
||||||
|
{0.809017f, 0.309017f, 0.500000f},
|
||||||
|
{0.681718f, 0.147621f, 0.716567f},
|
||||||
|
{0.587785f, 0.425325f, 0.688191f},
|
||||||
|
{0.955423f, 0.295242f, 0.000000f},
|
||||||
|
{1.000000f, 0.000000f, 0.000000f},
|
||||||
|
{0.951056f, 0.162460f, 0.262866f},
|
||||||
|
{0.850651f, -0.525731f, 0.000000f},
|
||||||
|
{0.955423f, -0.295242f, 0.000000f},
|
||||||
|
{0.864188f, -0.442863f, 0.238856f},
|
||||||
|
{0.951056f, -0.162460f, 0.262866f},
|
||||||
|
{0.809017f, -0.309017f, 0.500000f},
|
||||||
|
{0.681718f, -0.147621f, 0.716567f},
|
||||||
|
{0.850651f, 0.000000f, 0.525731f},
|
||||||
|
{0.864188f, 0.442863f, -0.238856f},
|
||||||
|
{0.809017f, 0.309017f, -0.500000f},
|
||||||
|
{0.951056f, 0.162460f, -0.262866f},
|
||||||
|
{0.525731f, 0.000000f, -0.850651f},
|
||||||
|
{0.681718f, 0.147621f, -0.716567f},
|
||||||
|
{0.681718f, -0.147621f, -0.716567f},
|
||||||
|
{0.850651f, 0.000000f, -0.525731f},
|
||||||
|
{0.809017f, -0.309017f, -0.500000f},
|
||||||
|
{0.864188f, -0.442863f, -0.238856f},
|
||||||
|
{0.951056f, -0.162460f, -0.262866f},
|
||||||
|
{0.147621f, 0.716567f, -0.681718f},
|
||||||
|
{0.309017f, 0.500000f, -0.809017f},
|
||||||
|
{0.425325f, 0.688191f, -0.587785f},
|
||||||
|
{0.442863f, 0.238856f, -0.864188f},
|
||||||
|
{0.587785f, 0.425325f, -0.688191f},
|
||||||
|
{0.688191f, 0.587785f, -0.425325f},
|
||||||
|
{-0.147621f, 0.716567f, -0.681718f},
|
||||||
|
{-0.309017f, 0.500000f, -0.809017f},
|
||||||
|
{0.000000f, 0.525731f, -0.850651f},
|
||||||
|
{-0.525731f, 0.000000f, -0.850651f},
|
||||||
|
{-0.442863f, 0.238856f, -0.864188f},
|
||||||
|
{-0.295242f, 0.000000f, -0.955423f},
|
||||||
|
{-0.162460f, 0.262866f, -0.951056f},
|
||||||
|
{0.000000f, 0.000000f, -1.000000f},
|
||||||
|
{0.295242f, 0.000000f, -0.955423f},
|
||||||
|
{0.162460f, 0.262866f, -0.951056f},
|
||||||
|
{-0.442863f, -0.238856f, -0.864188f},
|
||||||
|
{-0.309017f, -0.500000f, -0.809017f},
|
||||||
|
{-0.162460f, -0.262866f, -0.951056f},
|
||||||
|
{0.000000f, -0.850651f, -0.525731f},
|
||||||
|
{-0.147621f, -0.716567f, -0.681718f},
|
||||||
|
{0.147621f, -0.716567f, -0.681718f},
|
||||||
|
{0.000000f, -0.525731f, -0.850651f},
|
||||||
|
{0.309017f, -0.500000f, -0.809017f},
|
||||||
|
{0.442863f, -0.238856f, -0.864188f},
|
||||||
|
{0.162460f, -0.262866f, -0.951056f},
|
||||||
|
{0.238856f, -0.864188f, -0.442863f},
|
||||||
|
{0.500000f, -0.809017f, -0.309017f},
|
||||||
|
{0.425325f, -0.688191f, -0.587785f},
|
||||||
|
{0.716567f, -0.681718f, -0.147621f},
|
||||||
|
{0.688191f, -0.587785f, -0.425325f},
|
||||||
|
{0.587785f, -0.425325f, -0.688191f},
|
||||||
|
{0.000000f, -0.955423f, -0.295242f},
|
||||||
|
{0.000000f, -1.000000f, 0.000000f},
|
||||||
|
{0.262866f, -0.951056f, -0.162460f},
|
||||||
|
{0.000000f, -0.850651f, 0.525731f},
|
||||||
|
{0.000000f, -0.955423f, 0.295242f},
|
||||||
|
{0.238856f, -0.864188f, 0.442863f},
|
||||||
|
{0.262866f, -0.951056f, 0.162460f},
|
||||||
|
{0.500000f, -0.809017f, 0.309017f},
|
||||||
|
{0.716567f, -0.681718f, 0.147621f},
|
||||||
|
{0.525731f, -0.850651f, 0.000000f},
|
||||||
|
{-0.238856f, -0.864188f, -0.442863f},
|
||||||
|
{-0.500000f, -0.809017f, -0.309017f},
|
||||||
|
{-0.262866f, -0.951056f, -0.162460f},
|
||||||
|
{-0.850651f, -0.525731f, 0.000000f},
|
||||||
|
{-0.716567f, -0.681718f, -0.147621f},
|
||||||
|
{-0.716567f, -0.681718f, 0.147621f},
|
||||||
|
{-0.525731f, -0.850651f, 0.000000f},
|
||||||
|
{-0.500000f, -0.809017f, 0.309017f},
|
||||||
|
{-0.238856f, -0.864188f, 0.442863f},
|
||||||
|
{-0.262866f, -0.951056f, 0.162460f},
|
||||||
|
{-0.864188f, -0.442863f, 0.238856f},
|
||||||
|
{-0.809017f, -0.309017f, 0.500000f},
|
||||||
|
{-0.688191f, -0.587785f, 0.425325f},
|
||||||
|
{-0.681718f, -0.147621f, 0.716567f},
|
||||||
|
{-0.442863f, -0.238856f, 0.864188f},
|
||||||
|
{-0.587785f, -0.425325f, 0.688191f},
|
||||||
|
{-0.309017f, -0.500000f, 0.809017f},
|
||||||
|
{-0.147621f, -0.716567f, 0.681718f},
|
||||||
|
{-0.425325f, -0.688191f, 0.587785f},
|
||||||
|
{-0.162460f, -0.262866f, 0.951056f},
|
||||||
|
{0.442863f, -0.238856f, 0.864188f},
|
||||||
|
{0.162460f, -0.262866f, 0.951056f},
|
||||||
|
{0.309017f, -0.500000f, 0.809017f},
|
||||||
|
{0.147621f, -0.716567f, 0.681718f},
|
||||||
|
{0.000000f, -0.525731f, 0.850651f},
|
||||||
|
{0.425325f, -0.688191f, 0.587785f},
|
||||||
|
{0.587785f, -0.425325f, 0.688191f},
|
||||||
|
{0.688191f, -0.587785f, 0.425325f},
|
||||||
|
{-0.955423f, 0.295242f, 0.000000f},
|
||||||
|
{-0.951056f, 0.162460f, 0.262866f},
|
||||||
|
{-1.000000f, 0.000000f, 0.000000f},
|
||||||
|
{-0.850651f, 0.000000f, 0.525731f},
|
||||||
|
{-0.955423f, -0.295242f, 0.000000f},
|
||||||
|
{-0.951056f, -0.162460f, 0.262866f},
|
||||||
|
{-0.864188f, 0.442863f, -0.238856f},
|
||||||
|
{-0.951056f, 0.162460f, -0.262866f},
|
||||||
|
{-0.809017f, 0.309017f, -0.500000f},
|
||||||
|
{-0.864188f, -0.442863f, -0.238856f},
|
||||||
|
{-0.951056f, -0.162460f, -0.262866f},
|
||||||
|
{-0.809017f, -0.309017f, -0.500000f},
|
||||||
|
{-0.681718f, 0.147621f, -0.716567f},
|
||||||
|
{-0.681718f, -0.147621f, -0.716567f},
|
||||||
|
{-0.850651f, 0.000000f, -0.525731f},
|
||||||
|
{-0.688191f, 0.587785f, -0.425325f},
|
||||||
|
{-0.587785f, 0.425325f, -0.688191f},
|
||||||
|
{-0.425325f, 0.688191f, -0.587785f},
|
||||||
|
{-0.425325f, -0.688191f, -0.587785f},
|
||||||
|
{-0.587785f, -0.425325f, -0.688191f},
|
||||||
|
{-0.688191f, -0.587785f, -0.425325f},
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int ident; // A "magic number" that's used to identify the .md2 file
|
||||||
|
int version; // The version of the file, always 8
|
||||||
|
int skinwidth; // Width of the skin(s) in pixels
|
||||||
|
int skinheight; // Height of the skin(s) in pixels
|
||||||
|
int framesize; // Size of each frame in bytes
|
||||||
|
int numSkins; // Number of skins with the model
|
||||||
|
int numXYZ; // Number of vertices in each frame
|
||||||
|
int numST; // Number of texture coordinates in each frame.
|
||||||
|
int numTris; // Number of triangles in each frame
|
||||||
|
int numGLcmds; // Number of dwords (4 bytes) in the gl command list.
|
||||||
|
int numFrames; // Number of frames
|
||||||
|
int offsetSkins; // Offset, in bytes from the start of the file, to the list of skin names.
|
||||||
|
int offsetST; // Offset, in bytes from the start of the file, to the list of texture coordinates
|
||||||
|
int offsetTris; // Offset, in bytes from the start of the file, to the list of triangles
|
||||||
|
int offsetFrames; // Offset, in bytes from the start of the file, to the list of frames
|
||||||
|
int offsetGLcmds; // Offset, in bytes from the start of the file, to the list of gl commands
|
||||||
|
int offsetEnd; // Offset, in bytes from the start of the file, to the end of the file (filesize)
|
||||||
|
} md2header_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned short meshIndex[3]; // indices into the array of vertices in each frames
|
||||||
|
unsigned short stIndex[3]; // indices into the array of texture coordinates
|
||||||
|
} md2triangle_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
short s;
|
||||||
|
short t;
|
||||||
|
} md2texcoord_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned char v[3]; // Scaled vertices. You'll need to multiply them with scale[x] to make them normal.
|
||||||
|
unsigned char lightNormalIndex; // Index to the array of normals
|
||||||
|
} md2vertex_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float scale[3]; // Used by the v member in the md2framePoint structure
|
||||||
|
float translate[3]; // Used by the v member in the md2framePoint structure
|
||||||
|
char name[16]; // Name of the frame
|
||||||
|
} md2frame_t;
|
||||||
|
|
||||||
|
// Load the model
|
||||||
|
model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
||||||
|
{
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
model_t *retModel = NULL;
|
||||||
|
md2header_t *header;
|
||||||
|
|
||||||
|
size_t fileLen;
|
||||||
|
int i, j;
|
||||||
|
size_t namelen;
|
||||||
|
char *texturefilename;
|
||||||
|
const char *texPos;
|
||||||
|
|
||||||
|
char *buffer;
|
||||||
|
|
||||||
|
const float WUNITS = 1.0f;
|
||||||
|
float dataScale = WUNITS;
|
||||||
|
|
||||||
|
md2triangle_t *tris;
|
||||||
|
md2texcoord_t *texcoords;
|
||||||
|
md2frame_t *frames;
|
||||||
|
|
||||||
|
int t;
|
||||||
|
|
||||||
|
// MD2 currently does not work with tinyframes, so force useFloat = true
|
||||||
|
//
|
||||||
|
// <SSNTails>
|
||||||
|
// the UV coordinates in MD2 are not compatible with glDrawElements like MD3 is. So they need to be loaded as full float.
|
||||||
|
//
|
||||||
|
// MD2 is intended to be draw in triangle strips and fans
|
||||||
|
// not very compatible with a modern GL implementation, either
|
||||||
|
// so the idea would be to full float expand it, and put it in a vertex buffer object
|
||||||
|
// I'm sure there's a way to convert the UVs to 'tinyframes', but maybe that's a job for someone else.
|
||||||
|
// You'd have to decompress the model, then recompress, reindexing the triangles and weeding out duplicate coordinates
|
||||||
|
// I already have the decompression work done
|
||||||
|
|
||||||
|
useFloat = true;
|
||||||
|
|
||||||
|
f = fopen(fileName, "rb");
|
||||||
|
|
||||||
|
if (!f)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
retModel = (model_t*)Z_Calloc(sizeof(model_t), ztag, 0);
|
||||||
|
|
||||||
|
//size_t fileLen;
|
||||||
|
|
||||||
|
//int i, j;
|
||||||
|
|
||||||
|
//size_t namelen;
|
||||||
|
//char *texturefilename;
|
||||||
|
texPos = strchr(fileName, '/');
|
||||||
|
|
||||||
|
if (texPos)
|
||||||
|
{
|
||||||
|
texPos++;
|
||||||
|
namelen = strlen(texPos) + 1;
|
||||||
|
texturefilename = (char*)Z_Malloc(namelen, PU_CACHE, 0);
|
||||||
|
strcpy(texturefilename, texPos);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
namelen = strlen(fileName) + 1;
|
||||||
|
texturefilename = (char*)Z_Malloc(namelen, PU_CACHE, 0);
|
||||||
|
strcpy(texturefilename, fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
texturefilename[namelen - 2] = 'z';
|
||||||
|
texturefilename[namelen - 3] = 'u';
|
||||||
|
texturefilename[namelen - 4] = 'b';
|
||||||
|
|
||||||
|
// find length of file
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
fileLen = ftell(f);
|
||||||
|
fseek(f, 0, SEEK_SET);
|
||||||
|
|
||||||
|
// read in file
|
||||||
|
buffer = malloc(fileLen);
|
||||||
|
if (fread(buffer, fileLen, 1, f)) { } // squash ignored fread error
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
// get pointer to file header
|
||||||
|
header = (md2header_t*)buffer;
|
||||||
|
|
||||||
|
retModel->numMeshes = 1; // MD2 only has one mesh
|
||||||
|
retModel->meshes = (mesh_t*)Z_Calloc(sizeof(mesh_t) * retModel->numMeshes, ztag, 0);
|
||||||
|
retModel->meshes[0].numFrames = header->numFrames;
|
||||||
|
// const float WUNITS = 1.0f;
|
||||||
|
// float dataScale = WUNITS;
|
||||||
|
|
||||||
|
// Tris and ST are simple structures that can be straight-copied
|
||||||
|
tris = (md2triangle_t*)&buffer[header->offsetTris];
|
||||||
|
texcoords = (md2texcoord_t*)&buffer[header->offsetST];
|
||||||
|
frames = (md2frame_t*)&buffer[header->offsetFrames];
|
||||||
|
|
||||||
|
// Read in textures
|
||||||
|
retModel->numMaterials = header->numSkins;
|
||||||
|
|
||||||
|
if (retModel->numMaterials <= 0) // Always at least one skin, duh
|
||||||
|
retModel->numMaterials = 1;
|
||||||
|
|
||||||
|
retModel->materials = (material_t*)Z_Calloc(sizeof(material_t)*retModel->numMaterials, ztag, 0);
|
||||||
|
|
||||||
|
// int t;
|
||||||
|
for (t = 0; t < retModel->numMaterials; t++)
|
||||||
|
{
|
||||||
|
retModel->materials[t].ambient[0] = 0.8f;
|
||||||
|
retModel->materials[t].ambient[1] = 0.8f;
|
||||||
|
retModel->materials[t].ambient[2] = 0.8f;
|
||||||
|
retModel->materials[t].ambient[3] = 1.0f;
|
||||||
|
retModel->materials[t].diffuse[0] = 0.8f;
|
||||||
|
retModel->materials[t].diffuse[1] = 0.8f;
|
||||||
|
retModel->materials[t].diffuse[2] = 0.8f;
|
||||||
|
retModel->materials[t].diffuse[3] = 1.0f;
|
||||||
|
retModel->materials[t].emissive[0] = 0.0f;
|
||||||
|
retModel->materials[t].emissive[1] = 0.0f;
|
||||||
|
retModel->materials[t].emissive[2] = 0.0f;
|
||||||
|
retModel->materials[t].emissive[3] = 1.0f;
|
||||||
|
retModel->materials[t].specular[0] = 0.0f;
|
||||||
|
retModel->materials[t].specular[1] = 0.0f;
|
||||||
|
retModel->materials[t].specular[2] = 0.0f;
|
||||||
|
retModel->materials[t].specular[3] = 1.0f;
|
||||||
|
retModel->materials[t].shininess = 0.0f;
|
||||||
|
retModel->materials[t].spheremap = false;
|
||||||
|
|
||||||
|
/* retModel->materials[t].texture = Texture::ReadTexture((char*)texturefilename, ZT_TEXTURE);
|
||||||
|
|
||||||
|
if (!systemSucks)
|
||||||
|
{
|
||||||
|
// Check for a normal map...??
|
||||||
|
char openfilename[1024];
|
||||||
|
char normalMapName[1024];
|
||||||
|
strcpy(normalMapName, texturefilename);
|
||||||
|
size_t len = strlen(normalMapName);
|
||||||
|
char *ptr = &normalMapName[len];
|
||||||
|
ptr--; // z
|
||||||
|
ptr--; // u
|
||||||
|
ptr--; // b
|
||||||
|
ptr--; // .
|
||||||
|
*ptr++ = '_';
|
||||||
|
*ptr++ = 'n';
|
||||||
|
*ptr++ = '.';
|
||||||
|
*ptr++ = 'b';
|
||||||
|
*ptr++ = 'u';
|
||||||
|
*ptr++ = 'z';
|
||||||
|
*ptr++ = '\0';
|
||||||
|
|
||||||
|
sprintf(openfilename, "%s/%s", "textures", normalMapName);
|
||||||
|
// Convert backslashes to forward slashes
|
||||||
|
for (int k = 0; k < 1024; k++)
|
||||||
|
{
|
||||||
|
if (openfilename[k] == '\0')
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (openfilename[k] == '\\')
|
||||||
|
openfilename[k] = '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
Resource::resource_t *res = Resource::Open(openfilename);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
Resource::Close(res);
|
||||||
|
retModel->materials[t].lightmap = Texture::ReadTexture(normalMapName, ZT_TEXTURE);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
retModel->meshes[0].numTriangles = header->numTris;
|
||||||
|
|
||||||
|
if (!useFloat) // Decompress to MD3 'tinyframe' space
|
||||||
|
{
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
|
md2triangle_t *trisPtr;
|
||||||
|
unsigned short *indexptr;
|
||||||
|
float *uvptr;
|
||||||
|
|
||||||
|
dataScale = 0.015624f; // 1 / 64.0f
|
||||||
|
retModel->meshes[0].tinyframes = (tinyframe_t*)Z_Calloc(sizeof(tinyframe_t)*header->numFrames, ztag, 0);
|
||||||
|
retModel->meshes[0].numVertices = header->numXYZ;
|
||||||
|
retModel->meshes[0].uvs = (float*)Z_Malloc(sizeof(float) * 2 * retModel->meshes[0].numVertices, ztag, 0);
|
||||||
|
|
||||||
|
ptr = (char*)frames;
|
||||||
|
for (i = 0; i < header->numFrames; i++, ptr += header->framesize)
|
||||||
|
{
|
||||||
|
short *vertptr;
|
||||||
|
char *normptr;
|
||||||
|
// char *tanptr;
|
||||||
|
|
||||||
|
md2vertex_t *vertex;
|
||||||
|
|
||||||
|
md2frame_t *framePtr = (md2frame_t*)ptr;
|
||||||
|
retModel->meshes[0].tinyframes[i].vertices = (short*)Z_Malloc(sizeof(short) * 3 * header->numXYZ, ztag, 0);
|
||||||
|
retModel->meshes[0].tinyframes[i].normals = (char*)Z_Malloc(sizeof(char) * 3 * header->numXYZ, ztag, 0);
|
||||||
|
|
||||||
|
// if (retModel->materials[0].lightmap)
|
||||||
|
// retModel->meshes[0].tinyframes[i].tangents = (char*)malloc(sizeof(char));//(char*)Z_Malloc(sizeof(char)*3*header->numVerts, ztag);
|
||||||
|
retModel->meshes[0].indices = (unsigned short*)Z_Malloc(sizeof(unsigned short) * 3 * header->numTris, ztag, 0);
|
||||||
|
|
||||||
|
vertptr = retModel->meshes[0].tinyframes[i].vertices;
|
||||||
|
normptr = retModel->meshes[0].tinyframes[i].normals;
|
||||||
|
|
||||||
|
// tanptr = retModel->meshes[0].tinyframes[i].tangents;
|
||||||
|
retModel->meshes[0].tinyframes[i].material = &retModel->materials[0];
|
||||||
|
|
||||||
|
framePtr++; // Advance to vertex list
|
||||||
|
vertex = (md2vertex_t*)framePtr;
|
||||||
|
framePtr--;
|
||||||
|
for (j = 0; j < header->numXYZ; j++, vertex++)
|
||||||
|
{
|
||||||
|
*vertptr = (short)(((vertex->v[0] * framePtr->scale[0]) + framePtr->translate[0]) / dataScale);
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = (short)(((vertex->v[2] * framePtr->scale[2]) + framePtr->translate[2]) / dataScale);
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = -1.0f * (short)(((vertex->v[1] * framePtr->scale[1]) + framePtr->translate[1]) / dataScale);
|
||||||
|
vertptr++;
|
||||||
|
|
||||||
|
// Normal
|
||||||
|
*normptr++ = (char)(avertexnormals[vertex->lightNormalIndex][0] * 127);
|
||||||
|
*normptr++ = (char)(avertexnormals[vertex->lightNormalIndex][2] * 127);
|
||||||
|
*normptr++ = (char)(avertexnormals[vertex->lightNormalIndex][1] * 127);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This doesn't need to be done every frame!
|
||||||
|
trisPtr = tris;
|
||||||
|
indexptr = retModel->meshes[0].indices;
|
||||||
|
uvptr = (float*)retModel->meshes[0].uvs;
|
||||||
|
for (j = 0; j < header->numTris; j++, trisPtr++)
|
||||||
|
{
|
||||||
|
*indexptr = trisPtr->meshIndex[0];
|
||||||
|
indexptr++;
|
||||||
|
*indexptr = trisPtr->meshIndex[1];
|
||||||
|
indexptr++;
|
||||||
|
*indexptr = trisPtr->meshIndex[2];
|
||||||
|
indexptr++;
|
||||||
|
|
||||||
|
uvptr[trisPtr->meshIndex[0] * 2] = texcoords[trisPtr->stIndex[0]].s / (float)header->skinwidth;
|
||||||
|
uvptr[trisPtr->meshIndex[0] * 2 + 1] = (texcoords[trisPtr->stIndex[0]].t / (float)header->skinheight);
|
||||||
|
uvptr[trisPtr->meshIndex[1] * 2] = texcoords[trisPtr->stIndex[1]].s / (float)header->skinwidth;
|
||||||
|
uvptr[trisPtr->meshIndex[1] * 2 + 1] = (texcoords[trisPtr->stIndex[1]].t / (float)header->skinheight);
|
||||||
|
uvptr[trisPtr->meshIndex[2] * 2] = texcoords[trisPtr->stIndex[2]].s / (float)header->skinwidth;
|
||||||
|
uvptr[trisPtr->meshIndex[2] * 2 + 1] = (texcoords[trisPtr->stIndex[2]].t / (float)header->skinheight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // Full float loading method
|
||||||
|
{
|
||||||
|
md2triangle_t *trisPtr;
|
||||||
|
float *uvptr;
|
||||||
|
|
||||||
|
char *ptr;
|
||||||
|
|
||||||
|
retModel->meshes[0].numVertices = header->numTris * 3;
|
||||||
|
retModel->meshes[0].frames = (mdlframe_t*)Z_Calloc(sizeof(mdlframe_t)*header->numFrames, ztag, 0);
|
||||||
|
retModel->meshes[0].uvs = (float*)Z_Malloc(sizeof(float) * 2 * retModel->meshes[0].numVertices, ztag, 0);
|
||||||
|
|
||||||
|
trisPtr = tris;
|
||||||
|
uvptr = retModel->meshes[0].uvs;
|
||||||
|
for (i = 0; i < retModel->meshes[0].numTriangles; i++, trisPtr++)
|
||||||
|
{
|
||||||
|
*uvptr++ = texcoords[trisPtr->stIndex[0]].s / (float)header->skinwidth;
|
||||||
|
*uvptr++ = (texcoords[trisPtr->stIndex[0]].t / (float)header->skinheight);
|
||||||
|
*uvptr++ = texcoords[trisPtr->stIndex[1]].s / (float)header->skinwidth;
|
||||||
|
*uvptr++ = (texcoords[trisPtr->stIndex[1]].t / (float)header->skinheight);
|
||||||
|
*uvptr++ = texcoords[trisPtr->stIndex[2]].s / (float)header->skinwidth;
|
||||||
|
*uvptr++ = (texcoords[trisPtr->stIndex[2]].t / (float)header->skinheight);
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = (char*)frames;
|
||||||
|
for (i = 0; i < header->numFrames; i++, ptr += header->framesize)
|
||||||
|
{
|
||||||
|
float *vertptr, *normptr;
|
||||||
|
|
||||||
|
md2vertex_t *vertex;
|
||||||
|
|
||||||
|
md2frame_t *framePtr = (md2frame_t*)ptr;
|
||||||
|
retModel->meshes[0].frames[i].normals = (float*)Z_Malloc(sizeof(float) * 3 * header->numTris * 3, ztag, 0);
|
||||||
|
retModel->meshes[0].frames[i].vertices = (float*)Z_Malloc(sizeof(float) * 3 * header->numTris * 3, ztag, 0);
|
||||||
|
// if (retModel->materials[0].lightmap)
|
||||||
|
// retModel->meshes[0].frames[i].tangents = (float*)malloc(sizeof(float));//(float*)Z_Malloc(sizeof(float)*3*header->numTris*3, ztag);
|
||||||
|
//float *vertptr, *normptr;
|
||||||
|
normptr = (float*)retModel->meshes[0].frames[i].normals;
|
||||||
|
vertptr = (float*)retModel->meshes[0].frames[i].vertices;
|
||||||
|
trisPtr = tris;
|
||||||
|
|
||||||
|
retModel->meshes[0].frames[i].material = &retModel->materials[0];
|
||||||
|
|
||||||
|
framePtr++; // Advance to vertex list
|
||||||
|
vertex = (md2vertex_t*)framePtr;
|
||||||
|
framePtr--;
|
||||||
|
for (j = 0; j < header->numTris; j++, trisPtr++)
|
||||||
|
{
|
||||||
|
*vertptr = ((vertex[trisPtr->meshIndex[0]].v[0] * framePtr->scale[0]) + framePtr->translate[0]) * WUNITS;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = ((vertex[trisPtr->meshIndex[0]].v[2] * framePtr->scale[2]) + framePtr->translate[2]) * WUNITS;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = -1.0f * ((vertex[trisPtr->meshIndex[0]].v[1] * framePtr->scale[1]) + framePtr->translate[1]) * WUNITS;
|
||||||
|
vertptr++;
|
||||||
|
|
||||||
|
*vertptr = ((vertex[trisPtr->meshIndex[1]].v[0] * framePtr->scale[0]) + framePtr->translate[0]) * WUNITS;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = ((vertex[trisPtr->meshIndex[1]].v[2] * framePtr->scale[2]) + framePtr->translate[2]) * WUNITS;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = -1.0f * ((vertex[trisPtr->meshIndex[1]].v[1] * framePtr->scale[1]) + framePtr->translate[1]) * WUNITS;
|
||||||
|
vertptr++;
|
||||||
|
|
||||||
|
*vertptr = ((vertex[trisPtr->meshIndex[2]].v[0] * framePtr->scale[0]) + framePtr->translate[0]) * WUNITS;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = ((vertex[trisPtr->meshIndex[2]].v[2] * framePtr->scale[2]) + framePtr->translate[2]) * WUNITS;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = -1.0f * ((vertex[trisPtr->meshIndex[2]].v[1] * framePtr->scale[1]) + framePtr->translate[1]) * WUNITS;
|
||||||
|
vertptr++;
|
||||||
|
|
||||||
|
*normptr++ = avertexnormals[vertex[trisPtr->meshIndex[0]].lightNormalIndex][0];
|
||||||
|
*normptr++ = avertexnormals[vertex[trisPtr->meshIndex[0]].lightNormalIndex][2];
|
||||||
|
*normptr++ = avertexnormals[vertex[trisPtr->meshIndex[0]].lightNormalIndex][1];
|
||||||
|
|
||||||
|
*normptr++ = avertexnormals[vertex[trisPtr->meshIndex[1]].lightNormalIndex][0];
|
||||||
|
*normptr++ = avertexnormals[vertex[trisPtr->meshIndex[1]].lightNormalIndex][2];
|
||||||
|
*normptr++ = avertexnormals[vertex[trisPtr->meshIndex[1]].lightNormalIndex][1];
|
||||||
|
|
||||||
|
*normptr++ = avertexnormals[vertex[trisPtr->meshIndex[2]].lightNormalIndex][0];
|
||||||
|
*normptr++ = avertexnormals[vertex[trisPtr->meshIndex[2]].lightNormalIndex][2];
|
||||||
|
*normptr++ = avertexnormals[vertex[trisPtr->meshIndex[2]].lightNormalIndex][1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
return retModel;
|
||||||
|
}
|
19
src/hardware/hw_md2load.h
Normal file
19
src/hardware/hw_md2load.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
From the 'Wizard2' engine by Spaddlewit Inc. ( http://www.spaddlewit.com )
|
||||||
|
An experimental work-in-progress.
|
||||||
|
|
||||||
|
Donated to Sonic Team Junior and adapted to work with
|
||||||
|
Sonic Robo Blast 2. The license of this code matches whatever
|
||||||
|
the licensing is for Sonic Robo Blast 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HW_MD2LOAD_H_
|
||||||
|
#define _HW_MD2LOAD_H_
|
||||||
|
|
||||||
|
#include "hw_model.h"
|
||||||
|
#include "../doomtype.h"
|
||||||
|
|
||||||
|
// Load the Model
|
||||||
|
model_t *MD2_LoadModel(const char *fileName, int ztag, boolean useFloat);
|
||||||
|
|
||||||
|
#endif
|
510
src/hardware/hw_md3load.c
Normal file
510
src/hardware/hw_md3load.c
Normal file
|
@ -0,0 +1,510 @@
|
||||||
|
/*
|
||||||
|
From the 'Wizard2' engine by Spaddlewit Inc. ( http://www.spaddlewit.com )
|
||||||
|
An experimental work-in-progress.
|
||||||
|
|
||||||
|
Donated to Sonic Team Junior and adapted to work with
|
||||||
|
Sonic Robo Blast 2. The license of this code matches whatever
|
||||||
|
the licensing is for Sonic Robo Blast 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "../doomdef.h"
|
||||||
|
#include "hw_md3load.h"
|
||||||
|
#include "hw_model.h"
|
||||||
|
#include "../z_zone.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int ident; // A "magic number" that's used to identify the .md3 file
|
||||||
|
int version; // The version of the file, always 15
|
||||||
|
char name[64];
|
||||||
|
int flags;
|
||||||
|
int numFrames; // Number of frames
|
||||||
|
int numTags;
|
||||||
|
int numSurfaces;
|
||||||
|
int numSkins; // Number of skins with the model
|
||||||
|
int offsetFrames;
|
||||||
|
int offsetTags;
|
||||||
|
int offsetSurfaces;
|
||||||
|
int offsetEnd; // Offset, in bytes from the start of the file, to the end of the file (filesize)
|
||||||
|
} md3modelHeader;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float minBounds[3]; // First corner of the bounding box
|
||||||
|
float maxBounds[3]; // Second corner of the bounding box
|
||||||
|
float localOrigin[3]; // Local origin, usually (0, 0, 0)
|
||||||
|
float radius; // Radius of bounding sphere
|
||||||
|
char name[16]; // Name of frame
|
||||||
|
} md3Frame;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char name[64]; // Name of tag
|
||||||
|
float origin[3]; // Coordinates of tag
|
||||||
|
float axis[9]; // Orientation of tag object
|
||||||
|
} md3Tag;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int ident;
|
||||||
|
char name[64]; // Name of this surface
|
||||||
|
int flags;
|
||||||
|
int numFrames; // # of keyframes
|
||||||
|
int numShaders; // # of shaders
|
||||||
|
int numVerts; // # of vertices
|
||||||
|
int numTriangles; // # of triangles
|
||||||
|
int offsetTriangles; // Relative offset from start of this struct to where the list of Triangles start
|
||||||
|
int offsetShaders; // Relative offset from start of this struct to where the list of Shaders start
|
||||||
|
int offsetST; // Relative offset from start of this struct to where the list of tex coords start
|
||||||
|
int offsetXYZNormal; // Relative offset from start of this struct to where the list of vertices start
|
||||||
|
int offsetEnd; // Relative offset from start of this struct to where this surface ends
|
||||||
|
} md3Surface;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char name[64]; // Name of this shader
|
||||||
|
int shaderIndex; // Shader index number
|
||||||
|
} md3Shader;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int index[3]; // List of offset values into the list of Vertex objects that constitute the corners of the Triangle object.
|
||||||
|
} md3Triangle;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float st[2];
|
||||||
|
} md3TexCoord;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
short x, y, z, n;
|
||||||
|
} md3Vertex;
|
||||||
|
|
||||||
|
static float latlnglookup[256][256][3];
|
||||||
|
|
||||||
|
static void GetNormalFromLatLong(short latlng, float *out)
|
||||||
|
{
|
||||||
|
float *lookup = latlnglookup[(unsigned char)(latlng >> 8)][(unsigned char)(latlng & 255)];
|
||||||
|
|
||||||
|
out[0] = *lookup++;
|
||||||
|
out[1] = *lookup++;
|
||||||
|
out[2] = *lookup++;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static void NormalToLatLng(float *n, short *out)
|
||||||
|
{
|
||||||
|
// Special cases
|
||||||
|
if (0.0f == n[0] && 0.0f == n[1])
|
||||||
|
{
|
||||||
|
if (n[2] > 0.0f)
|
||||||
|
*out = 0;
|
||||||
|
else
|
||||||
|
*out = 128;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char x, y;
|
||||||
|
|
||||||
|
x = (char)(57.2957795f * (atan2(n[1], n[0])) * (255.0f / 360.0f));
|
||||||
|
y = (char)(57.2957795f * (acos(n[2])) * (255.0f / 360.0f));
|
||||||
|
|
||||||
|
*out = (x << 8) + y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static inline void LatLngToNormal(short n, float *out)
|
||||||
|
{
|
||||||
|
const float PI = (3.1415926535897932384626433832795f);
|
||||||
|
float lat = (float)(n >> 8);
|
||||||
|
float lng = (float)(n & 255);
|
||||||
|
|
||||||
|
lat *= PI / 128.0f;
|
||||||
|
lng *= PI / 128.0f;
|
||||||
|
|
||||||
|
out[0] = cosf(lat) * sinf(lng);
|
||||||
|
out[1] = sinf(lat) * sinf(lng);
|
||||||
|
out[2] = cosf(lng);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void LatLngInit(void)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < 256; j++)
|
||||||
|
LatLngToNormal((short)((i << 8) + j), latlnglookup[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean latlnginit = false;
|
||||||
|
|
||||||
|
model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat)
|
||||||
|
{
|
||||||
|
const float WUNITS = 1.0f;
|
||||||
|
model_t *retModel = NULL;
|
||||||
|
md3modelHeader *mdh;
|
||||||
|
long fileLen;
|
||||||
|
long fileReadLen;
|
||||||
|
char *buffer;
|
||||||
|
int surfEnd;
|
||||||
|
int i, t;
|
||||||
|
int matCount;
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
if (!latlnginit)
|
||||||
|
{
|
||||||
|
LatLngInit();
|
||||||
|
latlnginit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
f = fopen(fileName, "rb");
|
||||||
|
|
||||||
|
if (!f)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
retModel = (model_t*)Z_Calloc(sizeof(model_t), ztag, 0);
|
||||||
|
|
||||||
|
// find length of file
|
||||||
|
fseek(f, 0, SEEK_END);
|
||||||
|
fileLen = ftell(f);
|
||||||
|
fseek(f, 0, SEEK_SET);
|
||||||
|
|
||||||
|
// read in file
|
||||||
|
buffer = malloc(fileLen);
|
||||||
|
fileReadLen = fread(buffer, fileLen, 1, f);
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
(void)fileReadLen; // intentionally ignore return value, per buildbot
|
||||||
|
|
||||||
|
// get pointer to file header
|
||||||
|
mdh = (md3modelHeader*)buffer;
|
||||||
|
|
||||||
|
retModel->numMeshes = mdh->numSurfaces;
|
||||||
|
|
||||||
|
retModel->numMaterials = 0;
|
||||||
|
surfEnd = 0;
|
||||||
|
for (i = 0; i < mdh->numSurfaces; i++)
|
||||||
|
{
|
||||||
|
md3Surface *mdS = (md3Surface*)&buffer[mdh->offsetSurfaces];
|
||||||
|
surfEnd += mdS->offsetEnd;
|
||||||
|
|
||||||
|
retModel->numMaterials += mdS->numShaders;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize materials
|
||||||
|
if (retModel->numMaterials <= 0) // Always at least one skin, duh
|
||||||
|
retModel->numMaterials = 1;
|
||||||
|
|
||||||
|
retModel->materials = (material_t*)Z_Calloc(sizeof(material_t)*retModel->numMaterials, ztag, 0);
|
||||||
|
|
||||||
|
for (t = 0; t < retModel->numMaterials; t++)
|
||||||
|
{
|
||||||
|
retModel->materials[t].ambient[0] = 0.3686f;
|
||||||
|
retModel->materials[t].ambient[1] = 0.3684f;
|
||||||
|
retModel->materials[t].ambient[2] = 0.3684f;
|
||||||
|
retModel->materials[t].ambient[3] = 1.0f;
|
||||||
|
retModel->materials[t].diffuse[0] = 0.8863f;
|
||||||
|
retModel->materials[t].diffuse[1] = 0.8850f;
|
||||||
|
retModel->materials[t].diffuse[2] = 0.8850f;
|
||||||
|
retModel->materials[t].diffuse[3] = 1.0f;
|
||||||
|
retModel->materials[t].emissive[0] = 0.0f;
|
||||||
|
retModel->materials[t].emissive[1] = 0.0f;
|
||||||
|
retModel->materials[t].emissive[2] = 0.0f;
|
||||||
|
retModel->materials[t].emissive[3] = 1.0f;
|
||||||
|
retModel->materials[t].specular[0] = 0.4902f;
|
||||||
|
retModel->materials[t].specular[1] = 0.4887f;
|
||||||
|
retModel->materials[t].specular[2] = 0.4887f;
|
||||||
|
retModel->materials[t].specular[3] = 1.0f;
|
||||||
|
retModel->materials[t].shininess = 25.0f;
|
||||||
|
retModel->materials[t].spheremap = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
retModel->meshes = (mesh_t*)Z_Calloc(sizeof(mesh_t)*retModel->numMeshes, ztag, 0);
|
||||||
|
|
||||||
|
matCount = 0;
|
||||||
|
for (i = 0, surfEnd = 0; i < mdh->numSurfaces; i++)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
md3Shader *mdShader;
|
||||||
|
md3Surface *mdS = (md3Surface*)&buffer[mdh->offsetSurfaces + surfEnd];
|
||||||
|
surfEnd += mdS->offsetEnd;
|
||||||
|
|
||||||
|
mdShader = (md3Shader*)((char*)mdS + mdS->offsetShaders);
|
||||||
|
|
||||||
|
for (j = 0; j < mdS->numShaders; j++, matCount++)
|
||||||
|
{
|
||||||
|
size_t len = strlen(mdShader[j].name);
|
||||||
|
mdShader[j].name[len-1] = 'z';
|
||||||
|
mdShader[j].name[len-2] = 'u';
|
||||||
|
mdShader[j].name[len-3] = 'b';
|
||||||
|
|
||||||
|
// Load material
|
||||||
|
/* retModel->materials[matCount].texture = Texture::ReadTexture(mdShader[j].name, ZT_TEXTURE);
|
||||||
|
|
||||||
|
if (!systemSucks)
|
||||||
|
{
|
||||||
|
// Check for a normal map...??
|
||||||
|
char openfilename[1024];
|
||||||
|
char normalMapName[1024];
|
||||||
|
strcpy(normalMapName, mdShader[j].name);
|
||||||
|
len = strlen(normalMapName);
|
||||||
|
char *ptr = &normalMapName[len];
|
||||||
|
ptr--; // z
|
||||||
|
ptr--; // u
|
||||||
|
ptr--; // b
|
||||||
|
ptr--; // .
|
||||||
|
*ptr++ = '_';
|
||||||
|
*ptr++ = 'n';
|
||||||
|
*ptr++ = '.';
|
||||||
|
*ptr++ = 'b';
|
||||||
|
*ptr++ = 'u';
|
||||||
|
*ptr++ = 'z';
|
||||||
|
*ptr++ = '\0';
|
||||||
|
|
||||||
|
sprintf(openfilename, "%s/%s", "textures", normalMapName);
|
||||||
|
// Convert backslashes to forward slashes
|
||||||
|
for (int k = 0; k < 1024; k++)
|
||||||
|
{
|
||||||
|
if (openfilename[k] == '\0')
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (openfilename[k] == '\\')
|
||||||
|
openfilename[k] = '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
Resource::resource_t *res = Resource::Open(openfilename);
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
Resource::Close(res);
|
||||||
|
retModel->materials[matCount].lightmap = Texture::ReadTexture(normalMapName, ZT_TEXTURE);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
retModel->meshes[i].numFrames = mdS->numFrames;
|
||||||
|
retModel->meshes[i].numTriangles = mdS->numTriangles;
|
||||||
|
|
||||||
|
if (!useFloat) // 'tinyframe' mode with indices
|
||||||
|
{
|
||||||
|
float tempNormal[3];
|
||||||
|
float *uvptr;
|
||||||
|
md3TexCoord *mdST;
|
||||||
|
unsigned short *indexptr;
|
||||||
|
md3Triangle *mdT;
|
||||||
|
|
||||||
|
retModel->meshes[i].tinyframes = (tinyframe_t*)Z_Calloc(sizeof(tinyframe_t)*mdS->numFrames, ztag, 0);
|
||||||
|
retModel->meshes[i].numVertices = mdS->numVerts;
|
||||||
|
retModel->meshes[i].uvs = (float*)Z_Malloc(sizeof(float)*2*mdS->numVerts, ztag, 0);
|
||||||
|
for (j = 0; j < mdS->numFrames; j++)
|
||||||
|
{
|
||||||
|
short *vertptr;
|
||||||
|
char *normptr;
|
||||||
|
// char *tanptr;
|
||||||
|
int k;
|
||||||
|
md3Vertex *mdV = (md3Vertex*)((char*)mdS + mdS->offsetXYZNormal + (mdS->numVerts*j*sizeof(md3Vertex)));
|
||||||
|
retModel->meshes[i].tinyframes[j].vertices = (short*)Z_Malloc(sizeof(short)*3*mdS->numVerts, ztag, 0);
|
||||||
|
retModel->meshes[i].tinyframes[j].normals = (char*)Z_Malloc(sizeof(char)*3*mdS->numVerts, ztag, 0);
|
||||||
|
|
||||||
|
// if (retModel->materials[0].lightmap)
|
||||||
|
// retModel->meshes[i].tinyframes[j].tangents = (char*)malloc(sizeof(char));//(char*)Z_Malloc(sizeof(char)*3*mdS->numVerts, ztag);
|
||||||
|
retModel->meshes[i].indices = (unsigned short*)Z_Malloc(sizeof(unsigned short) * 3 * mdS->numTriangles, ztag, 0);
|
||||||
|
vertptr = retModel->meshes[i].tinyframes[j].vertices;
|
||||||
|
normptr = retModel->meshes[i].tinyframes[j].normals;
|
||||||
|
|
||||||
|
// tanptr = retModel->meshes[i].tinyframes[j].tangents;
|
||||||
|
retModel->meshes[i].tinyframes[j].material = &retModel->materials[i];
|
||||||
|
|
||||||
|
for (k = 0; k < mdS->numVerts; k++)
|
||||||
|
{
|
||||||
|
// Vertex
|
||||||
|
*vertptr = mdV[k].x;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = mdV[k].z;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = 1.0f - mdV[k].y;
|
||||||
|
vertptr++;
|
||||||
|
|
||||||
|
// Normal
|
||||||
|
GetNormalFromLatLong(mdV[k].n, tempNormal);
|
||||||
|
*normptr = (char)(tempNormal[0] * 127);
|
||||||
|
normptr++;
|
||||||
|
*normptr = (char)(tempNormal[2] * 127);
|
||||||
|
normptr++;
|
||||||
|
*normptr = (char)(tempNormal[1] * 127);
|
||||||
|
normptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uvptr = (float*)retModel->meshes[i].uvs;
|
||||||
|
mdST = (md3TexCoord*)((char*)mdS + mdS->offsetST);
|
||||||
|
for (j = 0; j < mdS->numVerts; j++)
|
||||||
|
{
|
||||||
|
*uvptr = mdST[j].st[0];
|
||||||
|
uvptr++;
|
||||||
|
*uvptr = mdST[j].st[1];
|
||||||
|
uvptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
indexptr = retModel->meshes[i].indices;
|
||||||
|
mdT = (md3Triangle*)((char*)mdS + mdS->offsetTriangles);
|
||||||
|
for (j = 0; j < mdS->numTriangles; j++, mdT++)
|
||||||
|
{
|
||||||
|
// Indices
|
||||||
|
*indexptr = (unsigned short)mdT->index[0];
|
||||||
|
indexptr++;
|
||||||
|
*indexptr = (unsigned short)mdT->index[1];
|
||||||
|
indexptr++;
|
||||||
|
*indexptr = (unsigned short)mdT->index[2];
|
||||||
|
indexptr++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // Traditional full-float loading method
|
||||||
|
{
|
||||||
|
float dataScale = 0.015624f * WUNITS;
|
||||||
|
float tempNormal[3];
|
||||||
|
md3TexCoord *mdST;
|
||||||
|
md3Triangle *mdT;
|
||||||
|
float *uvptr;
|
||||||
|
int k;
|
||||||
|
|
||||||
|
retModel->meshes[i].numVertices = mdS->numTriangles * 3;//mdS->numVerts;
|
||||||
|
retModel->meshes[i].frames = (mdlframe_t*)Z_Calloc(sizeof(mdlframe_t)*mdS->numFrames, ztag, 0);
|
||||||
|
retModel->meshes[i].uvs = (float*)Z_Malloc(sizeof(float)*2*mdS->numTriangles*3, ztag, 0);
|
||||||
|
|
||||||
|
for (j = 0; j < mdS->numFrames; j++)
|
||||||
|
{
|
||||||
|
float *vertptr;
|
||||||
|
float *normptr;
|
||||||
|
md3Vertex *mdV = (md3Vertex*)((char*)mdS + mdS->offsetXYZNormal + (mdS->numVerts*j*sizeof(md3Vertex)));
|
||||||
|
retModel->meshes[i].frames[j].vertices = (float*)Z_Malloc(sizeof(float)*3*mdS->numTriangles*3, ztag, 0);
|
||||||
|
retModel->meshes[i].frames[j].normals = (float*)Z_Malloc(sizeof(float)*3*mdS->numTriangles*3, ztag, 0);
|
||||||
|
// if (retModel->materials[i].lightmap)
|
||||||
|
// retModel->meshes[i].frames[j].tangents = (float*)malloc(sizeof(float));//(float*)Z_Malloc(sizeof(float)*3*mdS->numTriangles*3, ztag);
|
||||||
|
vertptr = retModel->meshes[i].frames[j].vertices;
|
||||||
|
normptr = retModel->meshes[i].frames[j].normals;
|
||||||
|
retModel->meshes[i].frames[j].material = &retModel->materials[i];
|
||||||
|
|
||||||
|
mdT = (md3Triangle*)((char*)mdS + mdS->offsetTriangles);
|
||||||
|
|
||||||
|
for (k = 0; k < mdS->numTriangles; k++)
|
||||||
|
{
|
||||||
|
// Vertex 1
|
||||||
|
*vertptr = mdV[mdT->index[0]].x * dataScale;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = mdV[mdT->index[0]].z * dataScale;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = 1.0f - mdV[mdT->index[0]].y * dataScale;
|
||||||
|
vertptr++;
|
||||||
|
|
||||||
|
GetNormalFromLatLong(mdV[mdT->index[0]].n, tempNormal);
|
||||||
|
*normptr = tempNormal[0];
|
||||||
|
normptr++;
|
||||||
|
*normptr = tempNormal[2];
|
||||||
|
normptr++;
|
||||||
|
*normptr = tempNormal[1];
|
||||||
|
normptr++;
|
||||||
|
|
||||||
|
// Vertex 2
|
||||||
|
*vertptr = mdV[mdT->index[1]].x * dataScale;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = mdV[mdT->index[1]].z * dataScale;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = 1.0f - mdV[mdT->index[1]].y * dataScale;
|
||||||
|
vertptr++;
|
||||||
|
|
||||||
|
GetNormalFromLatLong(mdV[mdT->index[1]].n, tempNormal);
|
||||||
|
*normptr = tempNormal[0];
|
||||||
|
normptr++;
|
||||||
|
*normptr = tempNormal[2];
|
||||||
|
normptr++;
|
||||||
|
*normptr = tempNormal[1];
|
||||||
|
normptr++;
|
||||||
|
|
||||||
|
// Vertex 3
|
||||||
|
*vertptr = mdV[mdT->index[2]].x * dataScale;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = mdV[mdT->index[2]].z * dataScale;
|
||||||
|
vertptr++;
|
||||||
|
*vertptr = 1.0f - mdV[mdT->index[2]].y * dataScale;
|
||||||
|
vertptr++;
|
||||||
|
|
||||||
|
GetNormalFromLatLong(mdV[mdT->index[2]].n, tempNormal);
|
||||||
|
*normptr = tempNormal[0];
|
||||||
|
normptr++;
|
||||||
|
*normptr = tempNormal[2];
|
||||||
|
normptr++;
|
||||||
|
*normptr = tempNormal[1];
|
||||||
|
normptr++;
|
||||||
|
|
||||||
|
mdT++; // Advance to next triangle
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mdST = (md3TexCoord*)((char*)mdS + mdS->offsetST);
|
||||||
|
uvptr = (float*)retModel->meshes[i].uvs;
|
||||||
|
mdT = (md3Triangle*)((char*)mdS + mdS->offsetTriangles);
|
||||||
|
|
||||||
|
for (k = 0; k < mdS->numTriangles; k++)
|
||||||
|
{
|
||||||
|
*uvptr = mdST[mdT->index[0]].st[0];
|
||||||
|
uvptr++;
|
||||||
|
*uvptr = mdST[mdT->index[0]].st[1];
|
||||||
|
uvptr++;
|
||||||
|
|
||||||
|
*uvptr = mdST[mdT->index[1]].st[0];
|
||||||
|
uvptr++;
|
||||||
|
*uvptr = mdST[mdT->index[1]].st[1];
|
||||||
|
uvptr++;
|
||||||
|
|
||||||
|
*uvptr = mdST[mdT->index[2]].st[0];
|
||||||
|
uvptr++;
|
||||||
|
*uvptr = mdST[mdT->index[2]].st[1];
|
||||||
|
uvptr++;
|
||||||
|
|
||||||
|
mdT++; // Advance to next triangle
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
// Tags?
|
||||||
|
retModel->numTags = mdh->numTags;
|
||||||
|
retModel->maxNumFrames = mdh->numFrames;
|
||||||
|
retModel->tags = (tag_t*)Z_Calloc(sizeof(tag_t) * retModel->numTags * mdh->numFrames, ztag);
|
||||||
|
md3Tag *mdTag = (md3Tag*)&buffer[mdh->offsetTags];
|
||||||
|
tag_t *curTag = retModel->tags;
|
||||||
|
for (i = 0; i < mdh->numFrames; i++)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
for (j = 0; j < retModel->numTags; j++, mdTag++)
|
||||||
|
{
|
||||||
|
strcpys(curTag->name, mdTag->name, sizeof(curTag->name) / sizeof(char));
|
||||||
|
curTag->transform.m[0][0] = mdTag->axis[0];
|
||||||
|
curTag->transform.m[0][1] = mdTag->axis[1];
|
||||||
|
curTag->transform.m[0][2] = mdTag->axis[2];
|
||||||
|
curTag->transform.m[1][0] = mdTag->axis[3];
|
||||||
|
curTag->transform.m[1][1] = mdTag->axis[4];
|
||||||
|
curTag->transform.m[1][2] = mdTag->axis[5];
|
||||||
|
curTag->transform.m[2][0] = mdTag->axis[6];
|
||||||
|
curTag->transform.m[2][1] = mdTag->axis[7];
|
||||||
|
curTag->transform.m[2][2] = mdTag->axis[8];
|
||||||
|
curTag->transform.m[3][0] = mdTag->origin[0] * WUNITS;
|
||||||
|
curTag->transform.m[3][1] = mdTag->origin[1] * WUNITS;
|
||||||
|
curTag->transform.m[3][2] = mdTag->origin[2] * WUNITS;
|
||||||
|
curTag->transform.m[3][3] = 1.0f;
|
||||||
|
|
||||||
|
Matrix::Rotate(&curTag->transform, 90.0f, &Vector::Xaxis);
|
||||||
|
curTag++;
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
free(buffer);
|
||||||
|
|
||||||
|
return retModel;
|
||||||
|
}
|
19
src/hardware/hw_md3load.h
Normal file
19
src/hardware/hw_md3load.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
From the 'Wizard2' engine by Spaddlewit Inc. ( http://www.spaddlewit.com )
|
||||||
|
An experimental work-in-progress.
|
||||||
|
|
||||||
|
Donated to Sonic Team Junior and adapted to work with
|
||||||
|
Sonic Robo Blast 2. The license of this code matches whatever
|
||||||
|
the licensing is for Sonic Robo Blast 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HW_MD3LOAD_H_
|
||||||
|
#define _HW_MD3LOAD_H_
|
||||||
|
|
||||||
|
#include "hw_model.h"
|
||||||
|
#include "../doomtype.h"
|
||||||
|
|
||||||
|
// Load the Model
|
||||||
|
model_t *MD3_LoadModel(const char *fileName, int ztag, boolean useFloat);
|
||||||
|
|
||||||
|
#endif
|
593
src/hardware/hw_model.c
Normal file
593
src/hardware/hw_model.c
Normal file
|
@ -0,0 +1,593 @@
|
||||||
|
/*
|
||||||
|
From the 'Wizard2' engine by Spaddlewit Inc. ( http://www.spaddlewit.com )
|
||||||
|
An experimental work-in-progress.
|
||||||
|
|
||||||
|
Donated to Sonic Team Junior and adapted to work with
|
||||||
|
Sonic Robo Blast 2. The license of this code matches whatever
|
||||||
|
the licensing is for Sonic Robo Blast 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../z_zone.h"
|
||||||
|
#include "../doomdef.h"
|
||||||
|
#include "hw_model.h"
|
||||||
|
#include "hw_md2load.h"
|
||||||
|
#include "hw_md3load.h"
|
||||||
|
#include "u_list.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
static float PI = (3.1415926535897932384626433832795f);
|
||||||
|
static float U_Deg2Rad(float deg)
|
||||||
|
{
|
||||||
|
return deg * ((float)PI / 180.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
vector_t vectorXaxis = { 1.0f, 0.0f, 0.0f };
|
||||||
|
vector_t vectorYaxis = { 0.0f, 1.0f, 0.0f };
|
||||||
|
vector_t vectorZaxis = { 0.0f, 0.0f, 1.0f };
|
||||||
|
|
||||||
|
void VectorRotate(vector_t *rotVec, const vector_t *axisVec, float angle)
|
||||||
|
{
|
||||||
|
float ux, uy, uz, vx, vy, vz, wx, wy, wz, sa, ca;
|
||||||
|
|
||||||
|
angle = U_Deg2Rad(angle);
|
||||||
|
|
||||||
|
// Rotate the point (x,y,z) around the vector (u,v,w)
|
||||||
|
ux = axisVec->x * rotVec->x;
|
||||||
|
uy = axisVec->x * rotVec->y;
|
||||||
|
uz = axisVec->x * rotVec->z;
|
||||||
|
vx = axisVec->y * rotVec->x;
|
||||||
|
vy = axisVec->y * rotVec->y;
|
||||||
|
vz = axisVec->y * rotVec->z;
|
||||||
|
wx = axisVec->z * rotVec->x;
|
||||||
|
wy = axisVec->z * rotVec->y;
|
||||||
|
wz = axisVec->z * rotVec->z;
|
||||||
|
sa = sinf(angle);
|
||||||
|
ca = cosf(angle);
|
||||||
|
|
||||||
|
rotVec->x = axisVec->x*(ux + vy + wz) + (rotVec->x*(axisVec->y*axisVec->y + axisVec->z*axisVec->z) - axisVec->x*(vy + wz))*ca + (-wy + vz)*sa;
|
||||||
|
rotVec->y = axisVec->y*(ux + vy + wz) + (rotVec->y*(axisVec->x*axisVec->x + axisVec->z*axisVec->z) - axisVec->y*(ux + wz))*ca + (wx - uz)*sa;
|
||||||
|
rotVec->z = axisVec->z*(ux + vy + wz) + (rotVec->z*(axisVec->x*axisVec->x + axisVec->y*axisVec->y) - axisVec->z*(ux + vy))*ca + (-vx + uy)*sa;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UnloadModel(model_t *model)
|
||||||
|
{
|
||||||
|
// Wouldn't it be great if C just had destructors?
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < model->numMeshes; i++)
|
||||||
|
{
|
||||||
|
mesh_t *mesh = &model->meshes[i];
|
||||||
|
|
||||||
|
if (mesh->frames)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
for (j = 0; j < mesh->numFrames; j++)
|
||||||
|
{
|
||||||
|
if (mesh->frames[j].normals)
|
||||||
|
Z_Free(mesh->frames[j].normals);
|
||||||
|
|
||||||
|
if (mesh->frames[j].tangents)
|
||||||
|
Z_Free(mesh->frames[j].tangents);
|
||||||
|
|
||||||
|
if (mesh->frames[j].vertices)
|
||||||
|
Z_Free(mesh->frames[j].vertices);
|
||||||
|
|
||||||
|
if (mesh->frames[j].colors)
|
||||||
|
Z_Free(mesh->frames[j].colors);
|
||||||
|
}
|
||||||
|
|
||||||
|
Z_Free(mesh->frames);
|
||||||
|
}
|
||||||
|
else if (mesh->tinyframes)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
for (j = 0; j < mesh->numFrames; j++)
|
||||||
|
{
|
||||||
|
if (mesh->tinyframes[j].normals)
|
||||||
|
Z_Free(mesh->tinyframes[j].normals);
|
||||||
|
|
||||||
|
if (mesh->tinyframes[j].tangents)
|
||||||
|
Z_Free(mesh->tinyframes[j].tangents);
|
||||||
|
|
||||||
|
if (mesh->tinyframes[j].vertices)
|
||||||
|
Z_Free(mesh->tinyframes[j].vertices);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mesh->indices)
|
||||||
|
Z_Free(mesh->indices);
|
||||||
|
|
||||||
|
Z_Free(mesh->tinyframes);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mesh->uvs)
|
||||||
|
Z_Free(mesh->uvs);
|
||||||
|
|
||||||
|
if (mesh->lightuvs)
|
||||||
|
Z_Free(mesh->lightuvs);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (model->meshes)
|
||||||
|
Z_Free(model->meshes);
|
||||||
|
|
||||||
|
if (model->tags)
|
||||||
|
Z_Free(model->tags);
|
||||||
|
|
||||||
|
if (model->materials)
|
||||||
|
Z_Free(model->materials);
|
||||||
|
|
||||||
|
DeleteVBOs(model);
|
||||||
|
Z_Free(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
tag_t *GetTagByName(model_t *model, char *name, int frame)
|
||||||
|
{
|
||||||
|
if (frame < model->maxNumFrames)
|
||||||
|
{
|
||||||
|
tag_t *iterator = &model->tags[frame * model->numTags];
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < model->numTags; i++)
|
||||||
|
{
|
||||||
|
if (!stricmp(iterator[i].name, name))
|
||||||
|
return &iterator[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// LoadModel
|
||||||
|
//
|
||||||
|
// Load a model and
|
||||||
|
// convert it to the
|
||||||
|
// internal format.
|
||||||
|
//
|
||||||
|
model_t *LoadModel(const char *filename, int ztag)
|
||||||
|
{
|
||||||
|
model_t *model;
|
||||||
|
|
||||||
|
// What type of file?
|
||||||
|
const char *extension = NULL;
|
||||||
|
int i;
|
||||||
|
for (i = (int)strlen(filename)-1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (filename[i] != '.')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
extension = &filename[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!extension)
|
||||||
|
{
|
||||||
|
CONS_Printf("Model %s is lacking a file extension, unable to determine type!\n", filename);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(extension, ".md3"))
|
||||||
|
{
|
||||||
|
if (!(model = MD3_LoadModel(filename, ztag, false)))
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else if (!strcmp(extension, ".md3s")) // MD3 that will be converted in memory to use full floats
|
||||||
|
{
|
||||||
|
if (!(model = MD3_LoadModel(filename, ztag, true)))
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else if (!strcmp(extension, ".md2"))
|
||||||
|
{
|
||||||
|
if (!(model = MD2_LoadModel(filename, ztag, false)))
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else if (!strcmp(extension, ".md2s"))
|
||||||
|
{
|
||||||
|
if (!(model = MD2_LoadModel(filename, ztag, true)))
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CONS_Printf("Unknown model format: %s\n", extension);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
model->mdlFilename = (char*)Z_Malloc(strlen(filename)+1, ztag, 0);
|
||||||
|
strcpy(model->mdlFilename, filename);
|
||||||
|
|
||||||
|
Optimize(model);
|
||||||
|
GeneratePolygonNormals(model, ztag);
|
||||||
|
|
||||||
|
// Default material properties
|
||||||
|
for (i = 0 ; i < model->numMaterials; i++)
|
||||||
|
{
|
||||||
|
material_t *material = &model->materials[i];
|
||||||
|
material->ambient[0] = 0.7686f;
|
||||||
|
material->ambient[1] = 0.7686f;
|
||||||
|
material->ambient[2] = 0.7686f;
|
||||||
|
material->ambient[3] = 1.0f;
|
||||||
|
material->diffuse[0] = 0.5863f;
|
||||||
|
material->diffuse[1] = 0.5863f;
|
||||||
|
material->diffuse[2] = 0.5863f;
|
||||||
|
material->diffuse[3] = 1.0f;
|
||||||
|
material->specular[0] = 0.4902f;
|
||||||
|
material->specular[1] = 0.4902f;
|
||||||
|
material->specular[2] = 0.4902f;
|
||||||
|
material->specular[3] = 1.0f;
|
||||||
|
material->shininess = 25.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// GenerateVertexNormals
|
||||||
|
//
|
||||||
|
// Creates a new normal for a vertex using the average of all of the polygons it belongs to.
|
||||||
|
//
|
||||||
|
void GenerateVertexNormals(model_t *model)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < model->numMeshes; i++)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
|
||||||
|
mesh_t *mesh = &model->meshes[i];
|
||||||
|
|
||||||
|
if (!mesh->frames)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (j = 0; j < mesh->numFrames; j++)
|
||||||
|
{
|
||||||
|
mdlframe_t *frame = &mesh->frames[j];
|
||||||
|
int memTag = PU_STATIC;
|
||||||
|
float *newNormals = (float*)Z_Malloc(sizeof(float)*3*mesh->numTriangles*3, memTag, 0);
|
||||||
|
int k;
|
||||||
|
float *vertPtr = frame->vertices;
|
||||||
|
float *oldNormals;
|
||||||
|
|
||||||
|
M_Memcpy(newNormals, frame->normals, sizeof(float)*3*mesh->numTriangles*3);
|
||||||
|
|
||||||
|
/* if (!systemSucks)
|
||||||
|
{
|
||||||
|
memTag = Z_GetTag(frame->tangents);
|
||||||
|
float *newTangents = (float*)Z_Malloc(sizeof(float)*3*mesh->numTriangles*3, memTag);
|
||||||
|
M_Memcpy(newTangents, frame->tangents, sizeof(float)*3*mesh->numTriangles*3);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
for (k = 0; k < mesh->numVertices; k++)
|
||||||
|
{
|
||||||
|
float x, y, z;
|
||||||
|
int vCount = 0;
|
||||||
|
vector_t normal;
|
||||||
|
int l;
|
||||||
|
float *testPtr = frame->vertices;
|
||||||
|
|
||||||
|
x = *vertPtr++;
|
||||||
|
y = *vertPtr++;
|
||||||
|
z = *vertPtr++;
|
||||||
|
|
||||||
|
normal.x = normal.y = normal.z = 0;
|
||||||
|
|
||||||
|
for (l = 0; l < mesh->numVertices; l++)
|
||||||
|
{
|
||||||
|
float testX, testY, testZ;
|
||||||
|
testX = *testPtr++;
|
||||||
|
testY = *testPtr++;
|
||||||
|
testZ = *testPtr++;
|
||||||
|
|
||||||
|
if (fabsf(x - testX) > FLT_EPSILON
|
||||||
|
|| fabsf(y - testY) > FLT_EPSILON
|
||||||
|
|| fabsf(z - testZ) > FLT_EPSILON)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Found a vertex match! Add it...
|
||||||
|
normal.x += frame->normals[3 * l + 0];
|
||||||
|
normal.y += frame->normals[3 * l + 1];
|
||||||
|
normal.z += frame->normals[3 * l + 2];
|
||||||
|
vCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vCount > 1)
|
||||||
|
{
|
||||||
|
// Vector::Normalize(&normal);
|
||||||
|
newNormals[3 * k + 0] = (float)normal.x;
|
||||||
|
newNormals[3 * k + 1] = (float)normal.y;
|
||||||
|
newNormals[3 * k + 2] = (float)normal.z;
|
||||||
|
|
||||||
|
/* if (!systemSucks)
|
||||||
|
{
|
||||||
|
Vector::vector_t tangent;
|
||||||
|
Vector::Tangent(&normal, &tangent);
|
||||||
|
newTangents[3 * k + 0] = tangent.x;
|
||||||
|
newTangents[3 * k + 1] = tangent.y;
|
||||||
|
newTangents[3 * k + 2] = tangent.z;
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
oldNormals = frame->normals;
|
||||||
|
frame->normals = newNormals;
|
||||||
|
Z_Free(oldNormals);
|
||||||
|
|
||||||
|
/* if (!systemSucks)
|
||||||
|
{
|
||||||
|
float *oldTangents = frame->tangents;
|
||||||
|
frame->tangents = newTangents;
|
||||||
|
Z_Free(oldTangents);
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct materiallist_s
|
||||||
|
{
|
||||||
|
struct materiallist_s *next;
|
||||||
|
struct materiallist_s *prev;
|
||||||
|
material_t *material;
|
||||||
|
} materiallist_t;
|
||||||
|
|
||||||
|
static boolean AddMaterialToList(materiallist_t **head, material_t *material)
|
||||||
|
{
|
||||||
|
materiallist_t *node, *newMatNode;
|
||||||
|
for (node = *head; node; node = node->next)
|
||||||
|
{
|
||||||
|
if (node->material == material)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Didn't find it, so add to the list
|
||||||
|
newMatNode = (materiallist_t*)Z_Malloc(sizeof(materiallist_t), PU_CACHE, 0);
|
||||||
|
newMatNode->material = material;
|
||||||
|
ListAdd(newMatNode, (listitem_t**)head);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Optimize
|
||||||
|
//
|
||||||
|
// Groups triangles from meshes in the model
|
||||||
|
// Only works for models with 1 frame
|
||||||
|
//
|
||||||
|
void Optimize(model_t *model)
|
||||||
|
{
|
||||||
|
int numMeshes = 0;
|
||||||
|
int i;
|
||||||
|
materiallist_t *matListHead = NULL;
|
||||||
|
int memTag;
|
||||||
|
mesh_t *newMeshes;
|
||||||
|
materiallist_t *node;
|
||||||
|
|
||||||
|
if (model->numMeshes <= 1)
|
||||||
|
return; // No need
|
||||||
|
|
||||||
|
for (i = 0; i < model->numMeshes; i++)
|
||||||
|
{
|
||||||
|
mesh_t *curMesh = &model->meshes[i];
|
||||||
|
|
||||||
|
if (curMesh->numFrames > 1)
|
||||||
|
return; // Can't optimize models with > 1 frame
|
||||||
|
|
||||||
|
if (!curMesh->frames)
|
||||||
|
return; // Don't optimize tinyframe models (no need)
|
||||||
|
|
||||||
|
// We are condensing to 1 mesh per material, so
|
||||||
|
// the # of materials we use will be the new
|
||||||
|
// # of meshes
|
||||||
|
if (AddMaterialToList(&matListHead, curMesh->frames[0].material))
|
||||||
|
numMeshes++;
|
||||||
|
}
|
||||||
|
|
||||||
|
memTag = PU_STATIC;
|
||||||
|
newMeshes = (mesh_t*)Z_Calloc(sizeof(mesh_t) * numMeshes, memTag, 0);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
for (node = matListHead; node; node = node->next)
|
||||||
|
{
|
||||||
|
material_t *curMat = node->material;
|
||||||
|
mesh_t *newMesh = &newMeshes[i];
|
||||||
|
mdlframe_t *curFrame;
|
||||||
|
int uvCount;
|
||||||
|
int vertCount;
|
||||||
|
int colorCount;
|
||||||
|
|
||||||
|
// Find all triangles with this material and count them
|
||||||
|
int numTriangles = 0;
|
||||||
|
int j;
|
||||||
|
for (j = 0; j < model->numMeshes; j++)
|
||||||
|
{
|
||||||
|
mesh_t *curMesh = &model->meshes[j];
|
||||||
|
|
||||||
|
if (curMesh->frames[0].material == curMat)
|
||||||
|
numTriangles += curMesh->numTriangles;
|
||||||
|
}
|
||||||
|
|
||||||
|
newMesh->numFrames = 1;
|
||||||
|
newMesh->numTriangles = numTriangles;
|
||||||
|
newMesh->numVertices = numTriangles * 3;
|
||||||
|
newMesh->uvs = (float*)Z_Malloc(sizeof(float)*2*numTriangles*3, memTag, 0);
|
||||||
|
// if (node->material->lightmap)
|
||||||
|
// newMesh->lightuvs = (float*)Z_Malloc(sizeof(float)*2*numTriangles*3, memTag, 0);
|
||||||
|
newMesh->frames = (mdlframe_t*)Z_Calloc(sizeof(mdlframe_t), memTag, 0);
|
||||||
|
curFrame = &newMesh->frames[0];
|
||||||
|
|
||||||
|
curFrame->material = curMat;
|
||||||
|
curFrame->normals = (float*)Z_Malloc(sizeof(float)*3*numTriangles*3, memTag, 0);
|
||||||
|
// if (!systemSucks)
|
||||||
|
// curFrame->tangents = (float*)Z_Malloc(sizeof(float)*3*numTriangles*3, memTag, 0);
|
||||||
|
curFrame->vertices = (float*)Z_Malloc(sizeof(float)*3*numTriangles*3, memTag, 0);
|
||||||
|
curFrame->colors = (char*)Z_Malloc(sizeof(char)*4*numTriangles*3, memTag, 0);
|
||||||
|
|
||||||
|
// Now traverse the meshes of the model, adding in
|
||||||
|
// vertices/normals/uvs that match the current material
|
||||||
|
uvCount = 0;
|
||||||
|
vertCount = 0;
|
||||||
|
colorCount = 0;
|
||||||
|
for (j = 0; j < model->numMeshes; j++)
|
||||||
|
{
|
||||||
|
mesh_t *curMesh = &model->meshes[j];
|
||||||
|
|
||||||
|
if (curMesh->frames[0].material == curMat)
|
||||||
|
{
|
||||||
|
float *dest;
|
||||||
|
float *src;
|
||||||
|
char *destByte;
|
||||||
|
char *srcByte;
|
||||||
|
|
||||||
|
M_Memcpy(&newMesh->uvs[uvCount],
|
||||||
|
curMesh->uvs,
|
||||||
|
sizeof(float)*2*curMesh->numTriangles*3);
|
||||||
|
|
||||||
|
/* if (node->material->lightmap)
|
||||||
|
{
|
||||||
|
M_Memcpy(&newMesh->lightuvs[uvCount],
|
||||||
|
curMesh->lightuvs,
|
||||||
|
sizeof(float)*2*curMesh->numTriangles*3);
|
||||||
|
}*/
|
||||||
|
uvCount += 2*curMesh->numTriangles*3;
|
||||||
|
|
||||||
|
dest = (float*)newMesh->frames[0].vertices;
|
||||||
|
src = (float*)curMesh->frames[0].vertices;
|
||||||
|
M_Memcpy(&dest[vertCount],
|
||||||
|
src,
|
||||||
|
sizeof(float)*3*curMesh->numTriangles*3);
|
||||||
|
|
||||||
|
dest = (float*)newMesh->frames[0].normals;
|
||||||
|
src = (float*)curMesh->frames[0].normals;
|
||||||
|
M_Memcpy(&dest[vertCount],
|
||||||
|
src,
|
||||||
|
sizeof(float)*3*curMesh->numTriangles*3);
|
||||||
|
|
||||||
|
/* if (!systemSucks)
|
||||||
|
{
|
||||||
|
dest = (float*)newMesh->frames[0].tangents;
|
||||||
|
src = (float*)curMesh->frames[0].tangents;
|
||||||
|
M_Memcpy(&dest[vertCount],
|
||||||
|
src,
|
||||||
|
sizeof(float)*3*curMesh->numTriangles*3);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
vertCount += 3 * curMesh->numTriangles * 3;
|
||||||
|
|
||||||
|
destByte = (char*)newMesh->frames[0].colors;
|
||||||
|
srcByte = (char*)curMesh->frames[0].colors;
|
||||||
|
|
||||||
|
if (srcByte)
|
||||||
|
{
|
||||||
|
M_Memcpy(&destByte[colorCount],
|
||||||
|
srcByte,
|
||||||
|
sizeof(char)*4*curMesh->numTriangles*3);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memset(&destByte[colorCount],
|
||||||
|
255,
|
||||||
|
sizeof(char)*4*curMesh->numTriangles*3);
|
||||||
|
}
|
||||||
|
|
||||||
|
colorCount += 4 * curMesh->numTriangles * 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
CONS_Printf("Model::Optimize(): Model reduced from %d to %d meshes.\n", model->numMeshes, numMeshes);
|
||||||
|
model->meshes = newMeshes;
|
||||||
|
model->numMeshes = numMeshes;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GeneratePolygonNormals(model_t *model, int ztag)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < model->numMeshes; i++)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
mesh_t *mesh = &model->meshes[i];
|
||||||
|
|
||||||
|
if (!mesh->frames)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (j = 0; j < mesh->numFrames; j++)
|
||||||
|
{
|
||||||
|
int k;
|
||||||
|
mdlframe_t *frame = &mesh->frames[j];
|
||||||
|
const float *vertices = frame->vertices;
|
||||||
|
vector_t *polyNormals;
|
||||||
|
|
||||||
|
frame->polyNormals = (vector_t*)Z_Malloc(sizeof(vector_t) * mesh->numTriangles, ztag, 0);
|
||||||
|
|
||||||
|
polyNormals = frame->polyNormals;
|
||||||
|
|
||||||
|
for (k = 0; k < mesh->numTriangles; k++)
|
||||||
|
{
|
||||||
|
// Vector::Normal(vertices, polyNormals);
|
||||||
|
vertices += 3 * 3;
|
||||||
|
polyNormals++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Reload
|
||||||
|
//
|
||||||
|
// Reload VBOs
|
||||||
|
//
|
||||||
|
#if 0
|
||||||
|
static void Reload(void)
|
||||||
|
{
|
||||||
|
/* model_t *node;
|
||||||
|
for (node = modelHead; node; node = node->next)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < node->numMeshes; i++)
|
||||||
|
{
|
||||||
|
mesh_t *mesh = &node->meshes[i];
|
||||||
|
|
||||||
|
if (mesh->frames)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
for (j = 0; j < mesh->numFrames; j++)
|
||||||
|
CreateVBO(mesh, &mesh->frames[j]);
|
||||||
|
}
|
||||||
|
else if (mesh->tinyframes)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
for (j = 0; j < mesh->numFrames; j++)
|
||||||
|
CreateVBO(mesh, &mesh->tinyframes[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void DeleteVBOs(model_t *model)
|
||||||
|
{
|
||||||
|
(void)model;
|
||||||
|
/* for (int i = 0; i < model->numMeshes; i++)
|
||||||
|
{
|
||||||
|
mesh_t *mesh = &model->meshes[i];
|
||||||
|
|
||||||
|
if (mesh->frames)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < mesh->numFrames; j++)
|
||||||
|
{
|
||||||
|
mdlframe_t *frame = &mesh->frames[j];
|
||||||
|
if (!frame->vboID)
|
||||||
|
continue;
|
||||||
|
bglDeleteBuffers(1, &frame->vboID);
|
||||||
|
frame->vboID = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (mesh->tinyframes)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < mesh->numFrames; j++)
|
||||||
|
{
|
||||||
|
tinyframe_t *frame = &mesh->tinyframes[j];
|
||||||
|
if (!frame->vboID)
|
||||||
|
continue;
|
||||||
|
bglDeleteBuffers(1, &frame->vboID);
|
||||||
|
frame->vboID = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
}
|
104
src/hardware/hw_model.h
Normal file
104
src/hardware/hw_model.h
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
/*
|
||||||
|
From the 'Wizard2' engine by Spaddlewit Inc. ( http://www.spaddlewit.com )
|
||||||
|
An experimental work-in-progress.
|
||||||
|
|
||||||
|
Donated to Sonic Team Junior and adapted to work with
|
||||||
|
Sonic Robo Blast 2. The license of this code matches whatever
|
||||||
|
the licensing is for Sonic Robo Blast 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HW_MODEL_H_
|
||||||
|
#define _HW_MODEL_H_
|
||||||
|
|
||||||
|
#include "../doomtype.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float x, y, z;
|
||||||
|
} vector_t;
|
||||||
|
|
||||||
|
extern vector_t vectorXaxis;
|
||||||
|
extern vector_t vectorYaxis;
|
||||||
|
extern vector_t vectorZaxis;
|
||||||
|
|
||||||
|
void VectorRotate(vector_t *rotVec, const vector_t *axisVec, float angle);
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float ambient[4], diffuse[4], specular[4], emissive[4];
|
||||||
|
float shininess;
|
||||||
|
boolean spheremap;
|
||||||
|
// Texture::texture_t *texture;
|
||||||
|
// Texture::texture_t *lightmap;
|
||||||
|
} material_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
material_t *material; // Pointer to the allocated 'materials' list in model_t
|
||||||
|
float *vertices;
|
||||||
|
float *normals;
|
||||||
|
float *tangents;
|
||||||
|
char *colors;
|
||||||
|
unsigned int vboID;
|
||||||
|
vector_t *polyNormals;
|
||||||
|
} mdlframe_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
material_t *material;
|
||||||
|
short *vertices;
|
||||||
|
char *normals;
|
||||||
|
char *tangents;
|
||||||
|
unsigned int vboID;
|
||||||
|
} tinyframe_t;
|
||||||
|
|
||||||
|
// Equivalent to MD3's many 'surfaces'
|
||||||
|
typedef struct mesh_s
|
||||||
|
{
|
||||||
|
int numVertices;
|
||||||
|
int numTriangles;
|
||||||
|
|
||||||
|
float *uvs;
|
||||||
|
float *lightuvs;
|
||||||
|
|
||||||
|
int numFrames;
|
||||||
|
mdlframe_t *frames;
|
||||||
|
tinyframe_t *tinyframes;
|
||||||
|
unsigned short *indices;
|
||||||
|
} mesh_t;
|
||||||
|
|
||||||
|
typedef struct tag_s
|
||||||
|
{
|
||||||
|
char name[64];
|
||||||
|
// matrix_t transform;
|
||||||
|
} tag_t;
|
||||||
|
|
||||||
|
typedef struct model_s
|
||||||
|
{
|
||||||
|
int maxNumFrames;
|
||||||
|
|
||||||
|
int numMaterials;
|
||||||
|
material_t *materials;
|
||||||
|
int numMeshes;
|
||||||
|
mesh_t *meshes;
|
||||||
|
int numTags;
|
||||||
|
tag_t *tags;
|
||||||
|
|
||||||
|
char *mdlFilename;
|
||||||
|
boolean unloaded;
|
||||||
|
} model_t;
|
||||||
|
|
||||||
|
extern int numModels;
|
||||||
|
extern model_t *modelHead;
|
||||||
|
|
||||||
|
tag_t *GetTagByName(model_t *model, char *name, int frame);
|
||||||
|
model_t *LoadModel(const char *filename, int ztag);
|
||||||
|
void UnloadModel(model_t *model);
|
||||||
|
void Optimize(model_t *model);
|
||||||
|
void GenerateVertexNormals(model_t *model);
|
||||||
|
void GeneratePolygonNormals(model_t *model, int ztag);
|
||||||
|
void CreateVBOTiny(mesh_t *mesh, tinyframe_t *frame);
|
||||||
|
void CreateVBO(mesh_t *mesh, mdlframe_t *frame);
|
||||||
|
void DeleteVBOs(model_t *model);
|
||||||
|
|
||||||
|
#endif
|
|
@ -347,13 +347,6 @@ static INT32 WINAPI SetRes(viddef_t *lvid, vmode_t *pcurrentmode)
|
||||||
if (strstr(renderer, "810")) oglflags |= GLF_NOZBUFREAD;
|
if (strstr(renderer, "810")) oglflags |= GLF_NOZBUFREAD;
|
||||||
DBG_Printf("oglflags : 0x%X\n", oglflags);
|
DBG_Printf("oglflags : 0x%X\n", oglflags);
|
||||||
|
|
||||||
#ifdef USE_PALETTED_TEXTURE
|
|
||||||
if (isExtAvailable("GL_EXT_paletted_texture",gl_extensions))
|
|
||||||
glColorTableEXT = GetGLFunc("glColorTableEXT");
|
|
||||||
else
|
|
||||||
glColorTableEXT = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_WGL_SWAP
|
#ifdef USE_WGL_SWAP
|
||||||
if (isExtAvailable("WGL_EXT_swap_control",gl_extensions))
|
if (isExtAvailable("WGL_EXT_swap_control",gl_extensions))
|
||||||
wglSwapIntervalEXT = GetGLFunc("wglSwapIntervalEXT");
|
wglSwapIntervalEXT = GetGLFunc("wglSwapIntervalEXT");
|
||||||
|
@ -582,19 +575,8 @@ EXPORT void HWRAPI(SetPalette) (RGBA_t *pal, RGBA_t *gamma)
|
||||||
myPaletteData[i].s.blue = (UINT8)MIN((pal[i].s.blue*gamma->s.blue)/127, 255);
|
myPaletteData[i].s.blue = (UINT8)MIN((pal[i].s.blue*gamma->s.blue)/127, 255);
|
||||||
myPaletteData[i].s.alpha = pal[i].s.alpha;
|
myPaletteData[i].s.alpha = pal[i].s.alpha;
|
||||||
}
|
}
|
||||||
#ifdef USE_PALETTED_TEXTURE
|
|
||||||
if (glColorTableEXT)
|
// on a palette change, you have to reload all of the textures
|
||||||
{
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
{
|
|
||||||
palette_tex[3*i+0] = pal[i].s.red;
|
|
||||||
palette_tex[3*i+1] = pal[i].s.green;
|
|
||||||
palette_tex[3*i+2] = pal[i].s.blue;
|
|
||||||
}
|
|
||||||
glColorTableEXT(GL_TEXTURE_2D, GL_RGB8, 256, GL_RGB, GL_UNSIGNED_BYTE, palette_tex);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// on a chang<6E> de palette, il faut recharger toutes les textures
|
|
||||||
Flush();
|
Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -37,13 +37,11 @@
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
#include <GL/glu.h>
|
#include <GL/glu.h>
|
||||||
|
|
||||||
#ifndef MINI_GL_COMPATIBILITY
|
|
||||||
#ifdef STATIC_OPENGL // Because of the 1.3 functions, you'll need GLext to compile it if static
|
#ifdef STATIC_OPENGL // Because of the 1.3 functions, you'll need GLext to compile it if static
|
||||||
#define GL_GLEXT_PROTOTYPES
|
#define GL_GLEXT_PROTOTYPES
|
||||||
#include <GL/glext.h>
|
#include <GL/glext.h>
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
#define _CREATE_DLL_ // necessary for Unix AND Windows
|
#define _CREATE_DLL_ // necessary for Unix AND Windows
|
||||||
#include "../../doomdef.h"
|
#include "../../doomdef.h"
|
||||||
|
@ -73,7 +71,6 @@ extern FILE *gllogstream;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DRIVER_STRING
|
#ifndef DRIVER_STRING
|
||||||
// #define USE_PALETTED_TEXTURE
|
|
||||||
#define DRIVER_STRING "HWRAPI Init(): SRB2Kart OpenGL renderer" // Tails
|
#define DRIVER_STRING "HWRAPI Init(): SRB2Kart OpenGL renderer" // Tails
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -91,10 +88,6 @@ int SetupPixelFormat(INT32 WantColorBits, INT32 WantStencilBits, INT32 WantDepth
|
||||||
void SetModelView(GLint w, GLint h);
|
void SetModelView(GLint w, GLint h);
|
||||||
void SetStates(void);
|
void SetStates(void);
|
||||||
FUNCMATH float byteasfloat(UINT8 fbyte);
|
FUNCMATH float byteasfloat(UINT8 fbyte);
|
||||||
#ifdef USE_PALETTED_TEXTURE
|
|
||||||
extern PFNGLCOLORTABLEEXTPROC glColorTableEXT;
|
|
||||||
extern GLubyte palette_tex[256*3];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef GL_EXT_texture_filter_anisotropic
|
#ifndef GL_EXT_texture_filter_anisotropic
|
||||||
#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
|
#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
|
||||||
|
@ -120,6 +113,10 @@ typedef void (APIENTRY * PFNglGetIntegerv) (GLenum pname, GLint *params);
|
||||||
extern PFNglGetIntegerv pglGetIntegerv;
|
extern PFNglGetIntegerv pglGetIntegerv;
|
||||||
typedef const GLubyte* (APIENTRY * PFNglGetString) (GLenum name);
|
typedef const GLubyte* (APIENTRY * PFNglGetString) (GLenum name);
|
||||||
extern PFNglGetString pglGetString;
|
extern PFNglGetString pglGetString;
|
||||||
|
#if 0
|
||||||
|
typedef void (APIENTRY * PFNglEnableClientState) (GLenum cap); // redefined in r_opengl.c
|
||||||
|
static PFNglEnableClientState pglEnableClientState;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
52
src/hardware/r_opengl/r_vbo.h
Normal file
52
src/hardware/r_opengl/r_vbo.h
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
From the 'Wizard2' engine by Spaddlewit Inc. ( http://www.spaddlewit.com )
|
||||||
|
An experimental work-in-progress.
|
||||||
|
|
||||||
|
Donated to Sonic Team Junior and adapted to work with
|
||||||
|
Sonic Robo Blast 2. The license of this code matches whatever
|
||||||
|
the licensing is for Sonic Robo Blast 2.
|
||||||
|
*/
|
||||||
|
#ifndef _R_VBO_H_
|
||||||
|
#define _R_VBO_H_
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float x, y, z; // Vertex
|
||||||
|
float nx, ny, nz; // Normal
|
||||||
|
float s0, t0; // Texcoord0
|
||||||
|
} vbo32_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float x, y, z; // Vertex
|
||||||
|
float s0, t0; // Texcoord0
|
||||||
|
unsigned char r, g, b, a; // Color
|
||||||
|
float pad[2]; // Pad
|
||||||
|
} vbo2d32_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float x, y; // Vertex
|
||||||
|
float s0, t0; // Texcoord0
|
||||||
|
} vbofont_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
short x, y, z; // Vertex
|
||||||
|
char nx, ny, nz; // Normal
|
||||||
|
char tanx, tany, tanz; // Tangent
|
||||||
|
float s0, t0; // Texcoord0
|
||||||
|
} vbotiny_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float x, y, z; // Vertex
|
||||||
|
float nx, ny, nz; // Normal
|
||||||
|
float s0, t0; // Texcoord0
|
||||||
|
float s1, t1; // Texcoord1
|
||||||
|
float s2, t2; // Texcoord2
|
||||||
|
float tan0, tan1, tan2; // Tangent
|
||||||
|
unsigned char r, g, b, a; // Color
|
||||||
|
} vbo64_t;
|
||||||
|
|
||||||
|
#endif
|
230
src/hardware/u_list.c
Normal file
230
src/hardware/u_list.c
Normal file
|
@ -0,0 +1,230 @@
|
||||||
|
/*
|
||||||
|
From the 'Wizard2' engine by Spaddlewit Inc. ( http://www.spaddlewit.com )
|
||||||
|
An experimental work-in-progress.
|
||||||
|
|
||||||
|
Donated to Sonic Team Junior and adapted to work with
|
||||||
|
Sonic Robo Blast 2. The license of this code matches whatever
|
||||||
|
the licensing is for Sonic Robo Blast 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "u_list.h"
|
||||||
|
#include "../z_zone.h"
|
||||||
|
|
||||||
|
// Utility for managing
|
||||||
|
// structures in a linked
|
||||||
|
// list.
|
||||||
|
//
|
||||||
|
// Struct must have "next" and "prev" pointers
|
||||||
|
// as its first two variables.
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// ListAdd
|
||||||
|
//
|
||||||
|
// Adds an item to the list
|
||||||
|
//
|
||||||
|
void ListAdd(void *pItem, listitem_t **itemHead)
|
||||||
|
{
|
||||||
|
listitem_t *item = (listitem_t*)pItem;
|
||||||
|
|
||||||
|
if (*itemHead == NULL)
|
||||||
|
{
|
||||||
|
*itemHead = item;
|
||||||
|
(*itemHead)->prev = (*itemHead)->next = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
listitem_t *tail;
|
||||||
|
tail = *itemHead;
|
||||||
|
|
||||||
|
while (tail->next != NULL)
|
||||||
|
tail = tail->next;
|
||||||
|
|
||||||
|
tail->next = item;
|
||||||
|
|
||||||
|
tail->next->prev = tail;
|
||||||
|
|
||||||
|
item->next = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ListAddFront
|
||||||
|
//
|
||||||
|
// Adds an item to the front of the list
|
||||||
|
// (This is much faster)
|
||||||
|
//
|
||||||
|
void ListAddFront(void *pItem, listitem_t **itemHead)
|
||||||
|
{
|
||||||
|
listitem_t *item = (listitem_t*)pItem;
|
||||||
|
|
||||||
|
if (*itemHead == NULL)
|
||||||
|
{
|
||||||
|
*itemHead = item;
|
||||||
|
(*itemHead)->prev = (*itemHead)->next = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
(*itemHead)->prev = item;
|
||||||
|
item->next = (*itemHead);
|
||||||
|
item->prev = NULL;
|
||||||
|
*itemHead = item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ListAddBefore
|
||||||
|
//
|
||||||
|
// Adds an item before the item specified in the list
|
||||||
|
//
|
||||||
|
void ListAddBefore(void *pItem, void *pSpot, listitem_t **itemHead)
|
||||||
|
{
|
||||||
|
listitem_t *item = (listitem_t*)pItem;
|
||||||
|
listitem_t *spot = (listitem_t*)pSpot;
|
||||||
|
|
||||||
|
listitem_t *prev = spot->prev;
|
||||||
|
|
||||||
|
if (!prev)
|
||||||
|
ListAddFront(pItem, itemHead);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item->next = spot;
|
||||||
|
spot->prev = item;
|
||||||
|
item->prev = prev;
|
||||||
|
prev->next = item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ListAddAfter
|
||||||
|
//
|
||||||
|
// Adds an item after the item specified in the list
|
||||||
|
//
|
||||||
|
void ListAddAfter(void *pItem, void *pSpot, listitem_t **itemHead)
|
||||||
|
{
|
||||||
|
listitem_t *item = (listitem_t*)pItem;
|
||||||
|
listitem_t *spot = (listitem_t*)pSpot;
|
||||||
|
|
||||||
|
listitem_t *next = spot->next;
|
||||||
|
|
||||||
|
if (!next)
|
||||||
|
ListAdd(pItem, itemHead);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
item->prev = spot;
|
||||||
|
spot->next = item;
|
||||||
|
item->next = next;
|
||||||
|
next->prev = item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ListRemove
|
||||||
|
//
|
||||||
|
// Take an item out of the list and free its memory.
|
||||||
|
//
|
||||||
|
void ListRemove(void *pItem, listitem_t **itemHead)
|
||||||
|
{
|
||||||
|
listitem_t *item = (listitem_t*)pItem;
|
||||||
|
|
||||||
|
if (item == *itemHead) // Start of list
|
||||||
|
{
|
||||||
|
*itemHead = item->next;
|
||||||
|
|
||||||
|
if (*itemHead)
|
||||||
|
(*itemHead)->prev = NULL;
|
||||||
|
}
|
||||||
|
else if (item->next == NULL) // end of list
|
||||||
|
{
|
||||||
|
item->prev->next = NULL;
|
||||||
|
}
|
||||||
|
else // Somewhere in between
|
||||||
|
{
|
||||||
|
item->prev->next = item->next;
|
||||||
|
item->next->prev = item->prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
Z_Free (item);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ListRemoveAll
|
||||||
|
//
|
||||||
|
// Removes all items from the list, freeing their memory.
|
||||||
|
//
|
||||||
|
void ListRemoveAll(listitem_t **itemHead)
|
||||||
|
{
|
||||||
|
listitem_t *item;
|
||||||
|
listitem_t *next;
|
||||||
|
for (item = *itemHead; item; item = next)
|
||||||
|
{
|
||||||
|
next = item->next;
|
||||||
|
ListRemove(item, itemHead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ListRemoveNoFree
|
||||||
|
//
|
||||||
|
// Take an item out of the list, but don't free its memory.
|
||||||
|
//
|
||||||
|
void ListRemoveNoFree(void *pItem, listitem_t **itemHead)
|
||||||
|
{
|
||||||
|
listitem_t *item = (listitem_t*)pItem;
|
||||||
|
|
||||||
|
if (item == *itemHead) // Start of list
|
||||||
|
{
|
||||||
|
*itemHead = item->next;
|
||||||
|
|
||||||
|
if (*itemHead)
|
||||||
|
(*itemHead)->prev = NULL;
|
||||||
|
}
|
||||||
|
else if (item->next == NULL) // end of list
|
||||||
|
{
|
||||||
|
item->prev->next = NULL;
|
||||||
|
}
|
||||||
|
else // Somewhere in between
|
||||||
|
{
|
||||||
|
item->prev->next = item->next;
|
||||||
|
item->next->prev = item->prev;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ListGetCount
|
||||||
|
//
|
||||||
|
// Counts the # of items in a list
|
||||||
|
// Should not be used in performance-minded code
|
||||||
|
//
|
||||||
|
unsigned int ListGetCount(void *itemHead)
|
||||||
|
{
|
||||||
|
listitem_t *item = (listitem_t*)itemHead;
|
||||||
|
|
||||||
|
unsigned int count = 0;
|
||||||
|
for (; item; item = item->next)
|
||||||
|
count++;
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ListGetByIndex
|
||||||
|
//
|
||||||
|
// Gets an item in the list by its index
|
||||||
|
// Should not be used in performance-minded code
|
||||||
|
//
|
||||||
|
listitem_t *ListGetByIndex(void *itemHead, unsigned int index)
|
||||||
|
{
|
||||||
|
listitem_t *head = (listitem_t*)itemHead;
|
||||||
|
unsigned int count = 0;
|
||||||
|
listitem_t *node;
|
||||||
|
for (node = head; node; node = node->next)
|
||||||
|
{
|
||||||
|
if (count == index)
|
||||||
|
return node;
|
||||||
|
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
29
src/hardware/u_list.h
Normal file
29
src/hardware/u_list.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
From the 'Wizard2' engine by Spaddlewit Inc. ( http://www.spaddlewit.com )
|
||||||
|
An experimental work-in-progress.
|
||||||
|
|
||||||
|
Donated to Sonic Team Junior and adapted to work with
|
||||||
|
Sonic Robo Blast 2. The license of this code matches whatever
|
||||||
|
the licensing is for Sonic Robo Blast 2.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _U_LIST_H_
|
||||||
|
#define _U_LIST_H_
|
||||||
|
|
||||||
|
typedef struct listitem_s
|
||||||
|
{
|
||||||
|
struct listitem_s *next;
|
||||||
|
struct listitem_s *prev;
|
||||||
|
} listitem_t;
|
||||||
|
|
||||||
|
void ListAdd(void *pItem, listitem_t **itemHead);
|
||||||
|
void ListAddFront(void *pItem, listitem_t **itemHead);
|
||||||
|
void ListAddBefore(void *pItem, void *pSpot, listitem_t **itemHead);
|
||||||
|
void ListAddAfter(void *pItem, void *pSpot, listitem_t **itemHead);
|
||||||
|
void ListRemove(void *pItem, listitem_t **itemHead);
|
||||||
|
void ListRemoveAll(listitem_t **itemHead);
|
||||||
|
void ListRemoveNoFree(void *pItem, listitem_t **itemHead);
|
||||||
|
unsigned int ListGetCount(void *itemHead);
|
||||||
|
listitem_t *ListGetByIndex(void *itemHead, unsigned int index);
|
||||||
|
|
||||||
|
#endif
|
|
@ -793,14 +793,17 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
|
||||||
case SKINCOLOR_GREY:
|
case SKINCOLOR_GREY:
|
||||||
case SKINCOLOR_NICKEL:
|
case SKINCOLOR_NICKEL:
|
||||||
case SKINCOLOR_BLACK:
|
case SKINCOLOR_BLACK:
|
||||||
|
case SKINCOLOR_SKUNK:
|
||||||
case SKINCOLOR_JET:
|
case SKINCOLOR_JET:
|
||||||
cstart = "\x86"; // V_GRAYMAP
|
cstart = "\x86"; // V_GRAYMAP
|
||||||
break;
|
break;
|
||||||
case SKINCOLOR_SEPIA:
|
case SKINCOLOR_SEPIA:
|
||||||
case SKINCOLOR_BEIGE:
|
case SKINCOLOR_BEIGE:
|
||||||
|
case SKINCOLOR_WALNUT:
|
||||||
case SKINCOLOR_BROWN:
|
case SKINCOLOR_BROWN:
|
||||||
case SKINCOLOR_LEATHER:
|
case SKINCOLOR_LEATHER:
|
||||||
case SKINCOLOR_RUST:
|
case SKINCOLOR_RUST:
|
||||||
|
case SKINCOLOR_WRISTWATCH:
|
||||||
cstart = "\x8e"; // V_BROWNMAP
|
cstart = "\x8e"; // V_BROWNMAP
|
||||||
break;
|
break;
|
||||||
case SKINCOLOR_FAIRY:
|
case SKINCOLOR_FAIRY:
|
||||||
|
@ -808,10 +811,12 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
|
||||||
case SKINCOLOR_PINK:
|
case SKINCOLOR_PINK:
|
||||||
case SKINCOLOR_ROSE:
|
case SKINCOLOR_ROSE:
|
||||||
case SKINCOLOR_BRICK:
|
case SKINCOLOR_BRICK:
|
||||||
|
case SKINCOLOR_LEMONADE:
|
||||||
case SKINCOLOR_BUBBLEGUM:
|
case SKINCOLOR_BUBBLEGUM:
|
||||||
case SKINCOLOR_LILAC:
|
case SKINCOLOR_LILAC:
|
||||||
cstart = "\x8d"; // V_PINKMAP
|
cstart = "\x8d"; // V_PINKMAP
|
||||||
break;
|
break;
|
||||||
|
case SKINCOLOR_CINNAMON:
|
||||||
case SKINCOLOR_RUBY:
|
case SKINCOLOR_RUBY:
|
||||||
case SKINCOLOR_RASPBERRY:
|
case SKINCOLOR_RASPBERRY:
|
||||||
case SKINCOLOR_CHERRY:
|
case SKINCOLOR_CHERRY:
|
||||||
|
@ -842,14 +847,18 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
|
||||||
case SKINCOLOR_ROYAL:
|
case SKINCOLOR_ROYAL:
|
||||||
case SKINCOLOR_BRONZE:
|
case SKINCOLOR_BRONZE:
|
||||||
case SKINCOLOR_COPPER:
|
case SKINCOLOR_COPPER:
|
||||||
|
case SKINCOLOR_THUNDER:
|
||||||
cstart = "\x8A"; // V_GOLDMAP
|
cstart = "\x8A"; // V_GOLDMAP
|
||||||
break;
|
break;
|
||||||
case SKINCOLOR_POPCORN:
|
case SKINCOLOR_POPCORN:
|
||||||
|
case SKINCOLOR_QUARRY:
|
||||||
case SKINCOLOR_YELLOW:
|
case SKINCOLOR_YELLOW:
|
||||||
case SKINCOLOR_MUSTARD:
|
case SKINCOLOR_MUSTARD:
|
||||||
|
case SKINCOLOR_CROCODILE:
|
||||||
case SKINCOLOR_OLIVE:
|
case SKINCOLOR_OLIVE:
|
||||||
cstart = "\x82"; // V_YELLOWMAP
|
cstart = "\x82"; // V_YELLOWMAP
|
||||||
break;
|
break;
|
||||||
|
case SKINCOLOR_ARTICHOKE:
|
||||||
case SKINCOLOR_VOMIT:
|
case SKINCOLOR_VOMIT:
|
||||||
case SKINCOLOR_GARDEN:
|
case SKINCOLOR_GARDEN:
|
||||||
case SKINCOLOR_TEA:
|
case SKINCOLOR_TEA:
|
||||||
|
@ -872,6 +881,7 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
|
||||||
cstart = "\x83"; // V_GREENMAP
|
cstart = "\x83"; // V_GREENMAP
|
||||||
break;
|
break;
|
||||||
case SKINCOLOR_CARIBBEAN:
|
case SKINCOLOR_CARIBBEAN:
|
||||||
|
case SKINCOLOR_AZURE:
|
||||||
case SKINCOLOR_AQUA:
|
case SKINCOLOR_AQUA:
|
||||||
case SKINCOLOR_TEAL:
|
case SKINCOLOR_TEAL:
|
||||||
case SKINCOLOR_CYAN:
|
case SKINCOLOR_CYAN:
|
||||||
|
@ -881,6 +891,7 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
|
||||||
case SKINCOLOR_SAPPHIRE:
|
case SKINCOLOR_SAPPHIRE:
|
||||||
cstart = "\x88"; // V_SKYMAP
|
cstart = "\x88"; // V_SKYMAP
|
||||||
break;
|
break;
|
||||||
|
case SKINCOLOR_PIGEON:
|
||||||
case SKINCOLOR_PLATINUM:
|
case SKINCOLOR_PLATINUM:
|
||||||
case SKINCOLOR_STEEL:
|
case SKINCOLOR_STEEL:
|
||||||
cstart = "\x8c"; // V_STEELMAP
|
cstart = "\x8c"; // V_STEELMAP
|
||||||
|
|
34
src/i_tcp.c
34
src/i_tcp.c
|
@ -813,6 +813,8 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
mysockaddr_t straddr;
|
mysockaddr_t straddr;
|
||||||
|
struct sockaddr_in sin;
|
||||||
|
socklen_t len = sizeof(sin);
|
||||||
|
|
||||||
if (s == (SOCKET_TYPE)ERRSOCKET)
|
if (s == (SOCKET_TYPE)ERRSOCKET)
|
||||||
return (SOCKET_TYPE)ERRSOCKET;
|
return (SOCKET_TYPE)ERRSOCKET;
|
||||||
|
@ -906,12 +908,16 @@ static SOCKET_TYPE UDP_Bind(int family, struct sockaddr *addr, socklen_t addrlen
|
||||||
CONS_Printf(M_GetText("Network system buffer set to: %dKb\n"), opt>>10);
|
CONS_Printf(M_GetText("Network system buffer set to: %dKb\n"), opt>>10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getsockname(s, (struct sockaddr *)&sin, &len) == -1)
|
||||||
|
CONS_Alert(CONS_WARNING, M_GetText("Failed to get port number\n"));
|
||||||
|
else
|
||||||
|
current_port = (UINT16)ntohs(sin.sin_port);
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean UDP_Socket(void)
|
static boolean UDP_Socket(void)
|
||||||
{
|
{
|
||||||
const char *sock_port = NULL;
|
|
||||||
size_t s;
|
size_t s;
|
||||||
struct my_addrinfo *ai, *runp, hints;
|
struct my_addrinfo *ai, *runp, hints;
|
||||||
int gaie;
|
int gaie;
|
||||||
|
@ -933,20 +939,11 @@ static boolean UDP_Socket(void)
|
||||||
hints.ai_socktype = SOCK_DGRAM;
|
hints.ai_socktype = SOCK_DGRAM;
|
||||||
hints.ai_protocol = IPPROTO_UDP;
|
hints.ai_protocol = IPPROTO_UDP;
|
||||||
|
|
||||||
if (M_CheckParm("-clientport"))
|
|
||||||
{
|
|
||||||
if (!M_IsNextParm())
|
|
||||||
I_Error("syntax: -clientport <portnum>");
|
|
||||||
sock_port = M_GetNextParm();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
sock_port = port_name;
|
|
||||||
|
|
||||||
if (M_CheckParm("-bindaddr"))
|
if (M_CheckParm("-bindaddr"))
|
||||||
{
|
{
|
||||||
while (M_IsNextParm())
|
while (M_IsNextParm())
|
||||||
{
|
{
|
||||||
gaie = I_getaddrinfo(M_GetNextParm(), sock_port, &hints, &ai);
|
gaie = I_getaddrinfo(M_GetNextParm(), port_name, &hints, &ai);
|
||||||
if (gaie == 0)
|
if (gaie == 0)
|
||||||
{
|
{
|
||||||
runp = ai;
|
runp = ai;
|
||||||
|
@ -967,7 +964,7 @@ static boolean UDP_Socket(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gaie = I_getaddrinfo("0.0.0.0", sock_port, &hints, &ai);
|
gaie = I_getaddrinfo("0.0.0.0", port_name, &hints, &ai);
|
||||||
if (gaie == 0)
|
if (gaie == 0)
|
||||||
{
|
{
|
||||||
runp = ai;
|
runp = ai;
|
||||||
|
@ -982,8 +979,8 @@ static boolean UDP_Socket(void)
|
||||||
#ifdef HAVE_MINIUPNPC
|
#ifdef HAVE_MINIUPNPC
|
||||||
if (UPNP_support)
|
if (UPNP_support)
|
||||||
{
|
{
|
||||||
I_UPnP_rem(sock_port, "UDP");
|
I_UPnP_rem(port_name, "UDP");
|
||||||
I_UPnP_add(NULL, sock_port, "UDP");
|
I_UPnP_add(NULL, port_name, "UDP");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -1000,7 +997,7 @@ static boolean UDP_Socket(void)
|
||||||
{
|
{
|
||||||
while (M_IsNextParm())
|
while (M_IsNextParm())
|
||||||
{
|
{
|
||||||
gaie = I_getaddrinfo(M_GetNextParm(), sock_port, &hints, &ai);
|
gaie = I_getaddrinfo(M_GetNextParm(), port_name, &hints, &ai);
|
||||||
if (gaie == 0)
|
if (gaie == 0)
|
||||||
{
|
{
|
||||||
runp = ai;
|
runp = ai;
|
||||||
|
@ -1021,7 +1018,7 @@ static boolean UDP_Socket(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gaie = I_getaddrinfo("::", sock_port, &hints, &ai);
|
gaie = I_getaddrinfo("::", port_name, &hints, &ai);
|
||||||
if (gaie == 0)
|
if (gaie == 0)
|
||||||
{
|
{
|
||||||
runp = ai;
|
runp = ai;
|
||||||
|
@ -1478,14 +1475,15 @@ boolean I_InitTcpNetwork(void)
|
||||||
if (!I_InitTcpDriver())
|
if (!I_InitTcpDriver())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (M_CheckParm("-udpport"))
|
if (M_CheckParm("-port"))
|
||||||
|
// Combined -udpport and -clientport into -port
|
||||||
|
// As it was really redundant having two seperate parms that does the same thing
|
||||||
{
|
{
|
||||||
if (M_IsNextParm())
|
if (M_IsNextParm())
|
||||||
strcpy(port_name, M_GetNextParm());
|
strcpy(port_name, M_GetNextParm());
|
||||||
else
|
else
|
||||||
strcpy(port_name, "0");
|
strcpy(port_name, "0");
|
||||||
}
|
}
|
||||||
current_port = (UINT16)atoi(port_name);
|
|
||||||
|
|
||||||
// parse network game options,
|
// parse network game options,
|
||||||
if (M_CheckParm("-server") || dedicated)
|
if (M_CheckParm("-server") || dedicated)
|
||||||
|
|
70
src/k_kart.c
70
src/k_kart.c
|
@ -49,22 +49,28 @@ const char *KartColor_Names[MAXSKINCOLORS] =
|
||||||
"Grey", // SKINCOLOR_GREY
|
"Grey", // SKINCOLOR_GREY
|
||||||
"Nickel", // SKINCOLOR_NICKEL
|
"Nickel", // SKINCOLOR_NICKEL
|
||||||
"Black", // SKINCOLOR_BLACK
|
"Black", // SKINCOLOR_BLACK
|
||||||
|
"Skunk", // SKINCOLOR_SKUNK
|
||||||
"Fairy", // SKINCOLOR_FAIRY
|
"Fairy", // SKINCOLOR_FAIRY
|
||||||
"Popcorn", // SKINCOLOR_POPCORN
|
"Popcorn", // SKINCOLOR_POPCORN
|
||||||
|
"Artichoke", // SKINCOLOR_ARTICHOKE
|
||||||
|
"Pigeon", // SKINCOLOR_PIGEON
|
||||||
"Sepia", // SKINCOLOR_SEPIA
|
"Sepia", // SKINCOLOR_SEPIA
|
||||||
"Beige", // SKINCOLOR_BEIGE
|
"Beige", // SKINCOLOR_BEIGE
|
||||||
|
"Walnut", // SKINCOLOR_WALNUT
|
||||||
"Brown", // SKINCOLOR_BROWN
|
"Brown", // SKINCOLOR_BROWN
|
||||||
"Leather", // SKINCOLOR_LEATHER
|
"Leather", // SKINCOLOR_LEATHER
|
||||||
"Salmon", // SKINCOLOR_SALMON
|
"Salmon", // SKINCOLOR_SALMON
|
||||||
"Pink", // SKINCOLOR_PINK
|
"Pink", // SKINCOLOR_PINK
|
||||||
"Rose", // SKINCOLOR_ROSE
|
"Rose", // SKINCOLOR_ROSE
|
||||||
"Brick", // SKINCOLOR_BRICK
|
"Brick", // SKINCOLOR_BRICK
|
||||||
|
"Cinnamon", // SKINCOLOR_CINNAMON
|
||||||
"Ruby", // SKINCOLOR_RUBY
|
"Ruby", // SKINCOLOR_RUBY
|
||||||
"Raspberry", // SKINCOLOR_RASPBERRY
|
"Raspberry", // SKINCOLOR_RASPBERRY
|
||||||
"Cherry", // SKINCOLOR_CHERRY
|
"Cherry", // SKINCOLOR_CHERRY
|
||||||
"Red", // SKINCOLOR_RED
|
"Red", // SKINCOLOR_RED
|
||||||
"Crimson", // SKINCOLOR_CRIMSON
|
"Crimson", // SKINCOLOR_CRIMSON
|
||||||
"Maroon", // SKINCOLOR_MAROON
|
"Maroon", // SKINCOLOR_MAROON
|
||||||
|
"Lemonade", // SKINCOLOR_LEMONADE
|
||||||
"Flame", // SKINCOLOR_FLAME
|
"Flame", // SKINCOLOR_FLAME
|
||||||
"Scarlet", // SKINCOLOR_SCARLET
|
"Scarlet", // SKINCOLOR_SCARLET
|
||||||
"Ketchup", // SKINCOLOR_KETCHUP
|
"Ketchup", // SKINCOLOR_KETCHUP
|
||||||
|
@ -83,8 +89,10 @@ const char *KartColor_Names[MAXSKINCOLORS] =
|
||||||
"Royal", // SKINCOLOR_ROYAL
|
"Royal", // SKINCOLOR_ROYAL
|
||||||
"Bronze", // SKINCOLOR_BRONZE
|
"Bronze", // SKINCOLOR_BRONZE
|
||||||
"Copper", // SKINCOLOR_COPPER
|
"Copper", // SKINCOLOR_COPPER
|
||||||
|
"Quarry", // SKINCOLOR_QUARRY
|
||||||
"Yellow", // SKINCOLOR_YELLOW
|
"Yellow", // SKINCOLOR_YELLOW
|
||||||
"Mustard", // SKINCOLOR_MUSTARD
|
"Mustard", // SKINCOLOR_MUSTARD
|
||||||
|
"Crocodile", // SKINCOLOR_CROCODILE
|
||||||
"Olive", // SKINCOLOR_OLIVE
|
"Olive", // SKINCOLOR_OLIVE
|
||||||
"Vomit", // SKINCOLOR_VOMIT
|
"Vomit", // SKINCOLOR_VOMIT
|
||||||
"Garden", // SKINCOLOR_GARDEN
|
"Garden", // SKINCOLOR_GARDEN
|
||||||
|
@ -104,6 +112,7 @@ const char *KartColor_Names[MAXSKINCOLORS] =
|
||||||
"Plague", // SKINCOLOR_PLAGUE
|
"Plague", // SKINCOLOR_PLAGUE
|
||||||
"Algae", // SKINCOLOR_ALGAE
|
"Algae", // SKINCOLOR_ALGAE
|
||||||
"Caribbean", // SKINCOLOR_CARIBBEAN
|
"Caribbean", // SKINCOLOR_CARIBBEAN
|
||||||
|
"Azure", // SKINCOLOR_AZURE
|
||||||
"Aqua", // SKINCOLOR_AQUA
|
"Aqua", // SKINCOLOR_AQUA
|
||||||
"Teal", // SKINCOLOR_TEAL
|
"Teal", // SKINCOLOR_TEAL
|
||||||
"Cyan", // SKINCOLOR_CYAN
|
"Cyan", // SKINCOLOR_CYAN
|
||||||
|
@ -113,7 +122,9 @@ const char *KartColor_Names[MAXSKINCOLORS] =
|
||||||
"Platinum", // SKINCOLOR_PLATINUM
|
"Platinum", // SKINCOLOR_PLATINUM
|
||||||
"Slate", // SKINCOLOR_SLATE
|
"Slate", // SKINCOLOR_SLATE
|
||||||
"Steel", // SKINCOLOR_STEEL
|
"Steel", // SKINCOLOR_STEEL
|
||||||
|
"Thunder", // SKINCOLOR_THUNDER
|
||||||
"Rust", // SKINCOLOR_RUST
|
"Rust", // SKINCOLOR_RUST
|
||||||
|
"Wristwatch", // SKINCOLOR_WRISTWATCH
|
||||||
"Jet", // SKINCOLOR_JET
|
"Jet", // SKINCOLOR_JET
|
||||||
"Sapphire", // SKINCOLOR_SAPPHIRE
|
"Sapphire", // SKINCOLOR_SAPPHIRE
|
||||||
"Periwinkle", // SKINCOLOR_PERIWINKLE
|
"Periwinkle", // SKINCOLOR_PERIWINKLE
|
||||||
|
@ -144,22 +155,28 @@ const UINT8 KartColor_Opposite[MAXSKINCOLORS*2] =
|
||||||
SKINCOLOR_GREY,8, // SKINCOLOR_GREY
|
SKINCOLOR_GREY,8, // SKINCOLOR_GREY
|
||||||
SKINCOLOR_SILVER,8, // SKINCOLOR_NICKEL
|
SKINCOLOR_SILVER,8, // SKINCOLOR_NICKEL
|
||||||
SKINCOLOR_WHITE,8, // SKINCOLOR_BLACK
|
SKINCOLOR_WHITE,8, // SKINCOLOR_BLACK
|
||||||
SKINCOLOR_CAMOUFLAGE,8, // SKINCOLOR_FAIRY
|
SKINCOLOR_SKUNK,8, // SKINCOLOR_SKUNK
|
||||||
SKINCOLOR_BUBBLEGUM,8, // SKINCOLOR_POPCORN
|
SKINCOLOR_ARTICHOKE,12, // SKINCOLOR_FAIRY
|
||||||
|
SKINCOLOR_PIGEON,12, // SKINCOLOR_POPCORN
|
||||||
|
SKINCOLOR_FAIRY,12, // SKINCOLOR_ARTICHOKE
|
||||||
|
SKINCOLOR_POPCORN,12, // SKINCOLOR_PIGEON
|
||||||
SKINCOLOR_LEATHER,6, // SKINCOLOR_SEPIA
|
SKINCOLOR_LEATHER,6, // SKINCOLOR_SEPIA
|
||||||
SKINCOLOR_BROWN,2, // SKINCOLOR_BEIGE
|
SKINCOLOR_BROWN,2, // SKINCOLOR_BEIGE
|
||||||
|
SKINCOLOR_CAMOUFLAGE,8, // SKINCOLOR_WALNUT
|
||||||
SKINCOLOR_BEIGE,8, // SKINCOLOR_BROWN
|
SKINCOLOR_BEIGE,8, // SKINCOLOR_BROWN
|
||||||
SKINCOLOR_SEPIA,8, // SKINCOLOR_LEATHER
|
SKINCOLOR_SEPIA,8, // SKINCOLOR_LEATHER
|
||||||
SKINCOLOR_TEA,8, // SKINCOLOR_SALMON
|
SKINCOLOR_TEA,8, // SKINCOLOR_SALMON
|
||||||
SKINCOLOR_PISTACHIO,8, // SKINCOLOR_PINK
|
SKINCOLOR_PISTACHIO,8, // SKINCOLOR_PINK
|
||||||
SKINCOLOR_MOSS,8, // SKINCOLOR_ROSE
|
SKINCOLOR_MOSS,8, // SKINCOLOR_ROSE
|
||||||
SKINCOLOR_RUST,8, // SKINCOLOR_BRICK
|
SKINCOLOR_RUST,8, // SKINCOLOR_BRICK
|
||||||
|
SKINCOLOR_WRISTWATCH,6, // SKINCOLOR_CINNAMON
|
||||||
SKINCOLOR_SAPPHIRE,8, // SKINCOLOR_RUBY
|
SKINCOLOR_SAPPHIRE,8, // SKINCOLOR_RUBY
|
||||||
SKINCOLOR_MINT,8, // SKINCOLOR_RASPBERRY
|
SKINCOLOR_MINT,8, // SKINCOLOR_RASPBERRY
|
||||||
SKINCOLOR_HANDHELD,10, // SKINCOLOR_CHERRY
|
SKINCOLOR_HANDHELD,10, // SKINCOLOR_CHERRY
|
||||||
SKINCOLOR_GREEN,6, // SKINCOLOR_RED
|
SKINCOLOR_GREEN,6, // SKINCOLOR_RED
|
||||||
SKINCOLOR_PINETREE,6, // SKINCOLOR_CRIMSON
|
SKINCOLOR_PINETREE,6, // SKINCOLOR_CRIMSON
|
||||||
SKINCOLOR_TOXIC,8, // SKINCOLOR_MAROON
|
SKINCOLOR_TOXIC,8, // SKINCOLOR_MAROON
|
||||||
|
SKINCOLOR_THUNDER,8, // SKINCOLOR_LEMONADE
|
||||||
SKINCOLOR_CARIBBEAN,10, // SKINCOLOR_FLAME
|
SKINCOLOR_CARIBBEAN,10, // SKINCOLOR_FLAME
|
||||||
SKINCOLOR_ALGAE,10, // SKINCOLOR_SCARLET
|
SKINCOLOR_ALGAE,10, // SKINCOLOR_SCARLET
|
||||||
SKINCOLOR_MUSTARD,10, // SKINCOLOR_KETCHUP
|
SKINCOLOR_MUSTARD,10, // SKINCOLOR_KETCHUP
|
||||||
|
@ -178,8 +195,10 @@ const UINT8 KartColor_Opposite[MAXSKINCOLORS*2] =
|
||||||
SKINCOLOR_PLATINUM,6, // SKINCOLOR_ROYAL
|
SKINCOLOR_PLATINUM,6, // SKINCOLOR_ROYAL
|
||||||
SKINCOLOR_STEEL,8, // SKINCOLOR_BRONZE
|
SKINCOLOR_STEEL,8, // SKINCOLOR_BRONZE
|
||||||
SKINCOLOR_CREAM,6, // SKINCOLOR_COPPER
|
SKINCOLOR_CREAM,6, // SKINCOLOR_COPPER
|
||||||
|
SKINCOLOR_AZURE,8, // SKINCOLOR_QUARRY
|
||||||
SKINCOLOR_AQUA,8, // SKINCOLOR_YELLOW
|
SKINCOLOR_AQUA,8, // SKINCOLOR_YELLOW
|
||||||
SKINCOLOR_KETCHUP,8, // SKINCOLOR_MUSTARD
|
SKINCOLOR_KETCHUP,8, // SKINCOLOR_MUSTARD
|
||||||
|
SKINCOLOR_BUBBLEGUM,8, // SKINCOLOR_CROCODILE
|
||||||
SKINCOLOR_TEAL,8, // SKINCOLOR_OLIVE
|
SKINCOLOR_TEAL,8, // SKINCOLOR_OLIVE
|
||||||
SKINCOLOR_ROBOHOOD,8, // SKINCOLOR_VOMIT
|
SKINCOLOR_ROBOHOOD,8, // SKINCOLOR_VOMIT
|
||||||
SKINCOLOR_LAVENDER,6, // SKINCOLOR_GARDEN
|
SKINCOLOR_LAVENDER,6, // SKINCOLOR_GARDEN
|
||||||
|
@ -188,7 +207,7 @@ const UINT8 KartColor_Opposite[MAXSKINCOLORS*2] =
|
||||||
SKINCOLOR_SALMON,8, // SKINCOLOR_TEA
|
SKINCOLOR_SALMON,8, // SKINCOLOR_TEA
|
||||||
SKINCOLOR_PINK,6, // SKINCOLOR_PISTACHIO
|
SKINCOLOR_PINK,6, // SKINCOLOR_PISTACHIO
|
||||||
SKINCOLOR_ROSE,8, // SKINCOLOR_MOSS
|
SKINCOLOR_ROSE,8, // SKINCOLOR_MOSS
|
||||||
SKINCOLOR_FAIRY,10, // SKINCOLOR_CAMOUFLAGE
|
SKINCOLOR_WALNUT,8, // SKINCOLOR_CAMOUFLAGE
|
||||||
SKINCOLOR_VOMIT,8, // SKINCOLOR_ROBOHOOD
|
SKINCOLOR_VOMIT,8, // SKINCOLOR_ROBOHOOD
|
||||||
SKINCOLOR_RASPBERRY,8, // SKINCOLOR_MINT
|
SKINCOLOR_RASPBERRY,8, // SKINCOLOR_MINT
|
||||||
SKINCOLOR_RED,8, // SKINCOLOR_GREEN
|
SKINCOLOR_RED,8, // SKINCOLOR_GREEN
|
||||||
|
@ -199,6 +218,7 @@ const UINT8 KartColor_Opposite[MAXSKINCOLORS*2] =
|
||||||
SKINCOLOR_NOVA,8, // SKINCOLOR_PLAGUE
|
SKINCOLOR_NOVA,8, // SKINCOLOR_PLAGUE
|
||||||
SKINCOLOR_SCARLET,10, // SKINCOLOR_ALGAE
|
SKINCOLOR_SCARLET,10, // SKINCOLOR_ALGAE
|
||||||
SKINCOLOR_FLAME,8, // SKINCOLOR_CARIBBEAN
|
SKINCOLOR_FLAME,8, // SKINCOLOR_CARIBBEAN
|
||||||
|
SKINCOLOR_QUARRY,8, // SKINCOLOR_AZURE
|
||||||
SKINCOLOR_YELLOW,8, // SKINCOLOR_AQUA
|
SKINCOLOR_YELLOW,8, // SKINCOLOR_AQUA
|
||||||
SKINCOLOR_OLIVE,8, // SKINCOLOR_TEAL
|
SKINCOLOR_OLIVE,8, // SKINCOLOR_TEAL
|
||||||
SKINCOLOR_PEACH,8, // SKINCOLOR_CYAN
|
SKINCOLOR_PEACH,8, // SKINCOLOR_CYAN
|
||||||
|
@ -208,7 +228,9 @@ const UINT8 KartColor_Opposite[MAXSKINCOLORS*2] =
|
||||||
SKINCOLOR_ROYAL,8, // SKINCOLOR_PLATINUM
|
SKINCOLOR_ROYAL,8, // SKINCOLOR_PLATINUM
|
||||||
SKINCOLOR_GOLD,10, // SKINCOLOR_SLATE
|
SKINCOLOR_GOLD,10, // SKINCOLOR_SLATE
|
||||||
SKINCOLOR_BRONZE,10, // SKINCOLOR_STEEL
|
SKINCOLOR_BRONZE,10, // SKINCOLOR_STEEL
|
||||||
|
SKINCOLOR_LEMONADE,8, // SKINCOLOR_THUNDER
|
||||||
SKINCOLOR_BRICK,10, // SKINCOLOR_RUST
|
SKINCOLOR_BRICK,10, // SKINCOLOR_RUST
|
||||||
|
SKINCOLOR_CINNAMON,8, // SKINCOLOR_WRISTWATCH
|
||||||
SKINCOLOR_BURGUNDY,8, // SKINCOLOR_JET
|
SKINCOLOR_BURGUNDY,8, // SKINCOLOR_JET
|
||||||
SKINCOLOR_RUBY,6, // SKINCOLOR_SAPPHIRE
|
SKINCOLOR_RUBY,6, // SKINCOLOR_SAPPHIRE
|
||||||
SKINCOLOR_CREAMSICLE,8, // SKINCOLOR_PERIWINKLE
|
SKINCOLOR_CREAMSICLE,8, // SKINCOLOR_PERIWINKLE
|
||||||
|
@ -219,7 +241,7 @@ const UINT8 KartColor_Opposite[MAXSKINCOLORS*2] =
|
||||||
SKINCOLOR_SUNSET,10, // SKINCOLOR_MOONSLAM
|
SKINCOLOR_SUNSET,10, // SKINCOLOR_MOONSLAM
|
||||||
SKINCOLOR_MAUVE,10, // SKINCOLOR_ULTRAVIOLET
|
SKINCOLOR_MAUVE,10, // SKINCOLOR_ULTRAVIOLET
|
||||||
SKINCOLOR_DAWN,6, // SKINCOLOR_DUSK
|
SKINCOLOR_DAWN,6, // SKINCOLOR_DUSK
|
||||||
SKINCOLOR_POPCORN,12, // SKINCOLOR_BUBBLEGUM
|
SKINCOLOR_CROCODILE,8, // SKINCOLOR_BUBBLEGUM
|
||||||
SKINCOLOR_EMERALD,8, // SKINCOLOR_PURPLE
|
SKINCOLOR_EMERALD,8, // SKINCOLOR_PURPLE
|
||||||
SKINCOLOR_PASTEL,11, // SKINCOLOR_FUCHSIA
|
SKINCOLOR_PASTEL,11, // SKINCOLOR_FUCHSIA
|
||||||
SKINCOLOR_MAROON,8, // SKINCOLOR_TOXIC
|
SKINCOLOR_MAROON,8, // SKINCOLOR_TOXIC
|
||||||
|
@ -237,27 +259,33 @@ UINT8 colortranslations[MAXTRANSLATIONS][16] = {
|
||||||
{ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31}, // SKINCOLOR_GREY
|
{ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31}, // SKINCOLOR_GREY
|
||||||
{ 3, 5, 8, 11, 15, 17, 19, 21, 23, 24, 25, 26, 27, 29, 30, 31}, // SKINCOLOR_NICKEL
|
{ 3, 5, 8, 11, 15, 17, 19, 21, 23, 24, 25, 26, 27, 29, 30, 31}, // SKINCOLOR_NICKEL
|
||||||
{ 4, 7, 11, 15, 20, 22, 24, 27, 28, 28, 28, 29, 29, 30, 30, 31}, // SKINCOLOR_BLACK
|
{ 4, 7, 11, 15, 20, 22, 24, 27, 28, 28, 28, 29, 29, 30, 30, 31}, // SKINCOLOR_BLACK
|
||||||
|
{120, 120, 0, 2, 4, 10, 16, 22, 23, 24, 25, 26, 27, 28, 29, 31}, // SKINCOLOR_SKUNK
|
||||||
{120, 120, 121, 121, 122, 123, 10, 14, 16, 18, 20, 22, 24, 26, 28, 31}, // SKINCOLOR_FAIRY
|
{120, 120, 121, 121, 122, 123, 10, 14, 16, 18, 20, 22, 24, 26, 28, 31}, // SKINCOLOR_FAIRY
|
||||||
{120, 96, 97, 98, 99, 71, 32, 11, 13, 16, 18, 21, 23, 26, 28, 31}, // SKINCOLOR_POPCORN
|
{120, 96, 97, 98, 99, 71, 32, 11, 13, 16, 18, 21, 23, 26, 28, 31}, // SKINCOLOR_POPCORN
|
||||||
|
{ 97, 176, 177, 162, 163, 179, 12, 14, 16, 18, 20, 22, 24, 26, 28, 31}, // SKINCOLOR_ARTICHOKE
|
||||||
|
{ 0, 208, 209, 211, 226, 202, 14, 15, 17, 19, 21, 23, 25, 27, 29, 31}, // SKINCOLOR_PIGEON
|
||||||
{ 0, 1, 3, 5, 7, 9, 34, 36, 38, 40, 42, 44, 60, 61, 62, 63}, // SKINCOLOR_SEPIA
|
{ 0, 1, 3, 5, 7, 9, 34, 36, 38, 40, 42, 44, 60, 61, 62, 63}, // SKINCOLOR_SEPIA
|
||||||
{120, 65, 67, 69, 32, 34, 36, 38, 40, 42, 44, 45, 46, 47, 62, 63}, // SKINCOLOR_BEIGE
|
{120, 65, 67, 69, 32, 34, 36, 38, 40, 42, 44, 45, 46, 47, 62, 63}, // SKINCOLOR_BEIGE
|
||||||
|
{ 3, 6, 32, 33, 35, 37, 51, 52, 54, 55, 57, 58, 60, 61, 63, 30}, // SKINCOLOR_WALNUT
|
||||||
{ 67, 70, 73, 76, 48, 49, 51, 53, 54, 56, 58, 59, 61, 63, 29, 30}, // SKINCOLOR_BROWN
|
{ 67, 70, 73, 76, 48, 49, 51, 53, 54, 56, 58, 59, 61, 63, 29, 30}, // SKINCOLOR_BROWN
|
||||||
{ 72, 76, 48, 51, 53, 55, 57, 59, 61, 63, 28, 28, 29, 29, 30, 31}, // SKINCOLOR_LEATHER
|
{ 72, 76, 48, 51, 53, 55, 57, 59, 61, 63, 28, 28, 29, 29, 30, 31}, // SKINCOLOR_LEATHER
|
||||||
{120, 120, 120, 121, 121, 122, 123, 124, 126, 127, 129, 131, 133, 135, 137, 139}, // SKINCOLOR_SALMON
|
{120, 120, 120, 121, 121, 122, 123, 124, 126, 127, 129, 131, 133, 135, 137, 139}, // SKINCOLOR_SALMON
|
||||||
{120, 121, 121, 122, 144, 145, 146, 147, 148, 149, 150, 151, 134, 136, 138, 140}, // SKINCOLOR_PINK
|
{120, 121, 121, 122, 144, 145, 146, 147, 148, 149, 150, 151, 134, 136, 138, 140}, // SKINCOLOR_PINK
|
||||||
{144, 145, 146, 147, 148, 149, 150, 151, 134, 135, 136, 137, 138, 139, 140, 141}, // SKINCOLOR_ROSE
|
{144, 145, 146, 147, 148, 149, 150, 151, 134, 135, 136, 137, 138, 139, 140, 141}, // SKINCOLOR_ROSE
|
||||||
{ 64, 67, 70, 73, 146, 147, 148, 150, 118, 118, 119, 119, 156, 159, 141, 143}, // SKINCOLOR_BRICK
|
{ 64, 67, 70, 73, 146, 147, 148, 150, 118, 118, 119, 119, 156, 159, 141, 143}, // SKINCOLOR_BRICK
|
||||||
|
{ 68, 75, 48, 50, 52, 94, 152, 136, 137, 138, 139, 140, 141, 142, 143, 31}, // SKINCOLOR_CINNAMON
|
||||||
{120, 121, 144, 145, 147, 149, 132, 133, 134, 136, 198, 198, 199, 255, 30, 31}, // SKINCOLOR_RUBY
|
{120, 121, 144, 145, 147, 149, 132, 133, 134, 136, 198, 198, 199, 255, 30, 31}, // SKINCOLOR_RUBY
|
||||||
{120, 121, 122, 123, 124, 125, 126, 127, 128, 130, 131, 134, 136, 137, 139, 140}, // SKINCOLOR_RASPBERRY
|
{120, 121, 122, 123, 124, 125, 126, 127, 128, 130, 131, 134, 136, 137, 139, 140}, // SKINCOLOR_RASPBERRY
|
||||||
{120, 65, 67, 69, 71, 124, 125, 127, 132, 133, 135, 136, 138, 139, 140, 141}, // SKINCOLOR_CHERRY
|
{120, 65, 67, 69, 71, 124, 125, 127, 132, 133, 135, 136, 138, 139, 140, 141}, // SKINCOLOR_CHERRY
|
||||||
{122, 123, 124, 126, 129, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142}, // SKINCOLOR_RED
|
{122, 123, 124, 126, 129, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142}, // SKINCOLOR_RED
|
||||||
{123, 125, 128, 131, 133, 135, 136, 138, 140, 140, 141, 141, 142, 142, 143, 31}, // SKINCOLOR_CRIMSON
|
{123, 125, 128, 131, 133, 135, 136, 138, 140, 140, 141, 141, 142, 142, 143, 31}, // SKINCOLOR_CRIMSON
|
||||||
{123, 124, 126, 128, 132, 135, 137, 27, 28, 28, 28, 29, 29, 30, 30, 31}, // SKINCOLOR_MAROON
|
{123, 124, 126, 128, 132, 135, 137, 27, 28, 28, 28, 29, 29, 30, 30, 31}, // SKINCOLOR_MAROON
|
||||||
|
{120, 96, 97, 98, 99, 65, 122, 144, 123, 124, 147, 149, 151, 153, 156, 159}, // SKINCOLOR_LEMONADE
|
||||||
{120, 97, 112, 113, 113, 85, 87, 126, 149, 150, 151, 252, 253, 254, 255, 29}, // SKINCOLOR_FLAME
|
{120, 97, 112, 113, 113, 85, 87, 126, 149, 150, 151, 252, 253, 254, 255, 29}, // SKINCOLOR_FLAME
|
||||||
{ 99, 113, 113, 84, 85, 87, 126, 128, 130, 196, 197, 198, 199, 240, 243, 246}, // SKINCOLOR_SCARLET
|
{ 99, 113, 113, 84, 85, 87, 126, 128, 130, 196, 197, 198, 199, 240, 243, 246}, // SKINCOLOR_SCARLET
|
||||||
{103, 113, 113, 84, 85, 88, 127, 130, 131, 133, 134, 136, 138, 139, 141, 143}, // SKINCOLOR_KETCHUP
|
{103, 113, 113, 84, 85, 88, 127, 130, 131, 133, 134, 136, 138, 139, 141, 143}, // SKINCOLOR_KETCHUP
|
||||||
{120, 121, 122, 123, 124, 147, 147, 148, 90, 91, 92, 93, 94, 95, 152, 154}, // SKINCOLOR_DAWN
|
{120, 121, 122, 123, 124, 147, 148, 91, 93, 95, 152, 154, 156, 159, 141, 143}, // SKINCOLOR_DAWN
|
||||||
{ 98, 112, 113, 84, 85, 87, 89, 149, 150, 251, 252, 206, 238, 240, 243, 246}, // SKINCOLOR_SUNSET
|
{ 98, 112, 113, 84, 85, 87, 89, 149, 150, 251, 251, 205, 206, 207, 29, 31}, // SKINCOLOR_SUNSET
|
||||||
{120, 120, 80, 80, 81, 82, 83, 83, 84, 85, 86, 88, 89, 91, 93, 95}, // SKINCOLOR_CREAMSICLE
|
{120, 120, 80, 80, 81, 82, 83, 83, 84, 85, 86, 88, 89, 91, 93, 95}, // SKINCOLOR_CREAMSICLE
|
||||||
{ 80, 81, 82, 83, 84, 85, 86, 88, 89, 91, 94, 95, 154, 156, 158, 159}, // SKINCOLOR_ORANGE
|
{ 80, 81, 82, 83, 84, 85, 86, 88, 89, 91, 94, 95, 154, 156, 158, 159}, // SKINCOLOR_ORANGE
|
||||||
{ 82, 83, 84, 85, 87, 89, 90, 92, 94, 152, 153, 155, 157, 159, 141, 142}, // SKINCOLOR_PUMPKIN
|
{ 82, 83, 84, 85, 87, 89, 90, 92, 94, 152, 153, 155, 157, 159, 141, 142}, // SKINCOLOR_PUMPKIN
|
||||||
|
@ -266,17 +294,19 @@ UINT8 colortranslations[MAXTRANSLATIONS][16] = {
|
||||||
{ 98, 98, 112, 112, 113, 113, 84, 85, 87, 89, 91, 93, 95, 153, 156, 159}, // SKINCOLOR_TANGERINE
|
{ 98, 98, 112, 112, 113, 113, 84, 85, 87, 89, 91, 93, 95, 153, 156, 159}, // SKINCOLOR_TANGERINE
|
||||||
{120, 80, 66, 70, 72, 76, 148, 149, 150, 151, 153, 154, 156, 61, 62, 63}, // SKINCOLOR_PEACH
|
{120, 80, 66, 70, 72, 76, 148, 149, 150, 151, 153, 154, 156, 61, 62, 63}, // SKINCOLOR_PEACH
|
||||||
{ 64, 66, 68, 70, 72, 74, 76, 78, 48, 50, 52, 54, 56, 58, 60, 62}, // SKINCOLOR_CARAMEL
|
{ 64, 66, 68, 70, 72, 74, 76, 78, 48, 50, 52, 54, 56, 58, 60, 62}, // SKINCOLOR_CARAMEL
|
||||||
{120, 120, 96, 96, 97, 82, 84, 77, 50, 54, 57, 59, 61, 63, 29, 31}, // SKINCOLOR_CREAM
|
{120, 96, 96, 97, 98, 82, 84, 77, 50, 54, 57, 59, 61, 63, 29, 31}, // SKINCOLOR_CREAM
|
||||||
{112, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119}, // SKINCOLOR_GOLD
|
{ 96, 97, 98, 112, 113, 114, 115, 116, 117, 151, 118, 119, 157, 159, 140, 143}, // SKINCOLOR_GOLD
|
||||||
{ 97, 112, 113, 113, 114, 78, 53, 252, 252, 253, 253, 254, 255, 29, 30, 31}, // SKINCOLOR_ROYAL
|
{ 97, 112, 113, 113, 114, 78, 53, 252, 252, 253, 253, 254, 255, 29, 30, 31}, // SKINCOLOR_ROYAL
|
||||||
{112, 113, 114, 115, 116, 117, 118, 119, 156, 157, 158, 159, 141, 141, 142, 143}, // SKINCOLOR_BRONZE
|
{112, 113, 114, 115, 116, 117, 118, 119, 156, 157, 158, 159, 141, 141, 142, 143}, // SKINCOLOR_BRONZE
|
||||||
{120, 99, 113, 114, 116, 117, 119, 61, 63, 28, 28, 29, 29, 30, 30, 31}, // SKINCOLOR_COPPER
|
{120, 99, 113, 114, 116, 117, 119, 61, 63, 28, 28, 29, 29, 30, 30, 31}, // SKINCOLOR_COPPER
|
||||||
|
{ 96, 97, 98, 99, 104, 105, 106, 107, 117, 152, 154, 156, 159, 141, 142, 143}, // SKINCOLOR_QUARRY
|
||||||
{ 96, 97, 98, 100, 101, 102, 104, 113, 114, 115, 116, 117, 118, 119, 156, 159}, // SKINCOLOR_YELLOW
|
{ 96, 97, 98, 100, 101, 102, 104, 113, 114, 115, 116, 117, 118, 119, 156, 159}, // SKINCOLOR_YELLOW
|
||||||
{ 96, 98, 99, 112, 113, 114, 114, 106, 106, 107, 107, 108, 108, 109, 110, 111}, // SKINCOLOR_MUSTARD
|
{ 96, 98, 99, 112, 113, 114, 114, 106, 106, 107, 107, 108, 108, 109, 110, 111}, // SKINCOLOR_MUSTARD
|
||||||
{105, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 31}, // SKINCOLOR_OLIVE
|
{120, 96, 97, 98, 176, 113, 114, 106, 115, 107, 108, 109, 110, 174, 175, 31}, // SKINCOLOR_CROCODILE
|
||||||
{121, 144, 145, 72, 73, 84, 114, 115, 107, 108, 109, 183, 223, 207, 30, 246}, // SKINCOLOR_VOMIT
|
{ 98, 101, 104, 105, 106, 115, 107, 108, 182, 109, 183, 110, 174, 111, 30, 31}, // SKINCOLOR_OLIVE
|
||||||
|
{ 0, 121, 122, 144, 71, 84, 114, 115, 107, 108, 109, 183, 223, 207, 30, 246}, // SKINCOLOR_VOMIT
|
||||||
{ 98, 99, 112, 101, 113, 114, 106, 179, 180, 180, 181, 182, 183, 173, 174, 175}, // SKINCOLOR_GARDEN
|
{ 98, 99, 112, 101, 113, 114, 106, 179, 180, 180, 181, 182, 183, 173, 174, 175}, // SKINCOLOR_GARDEN
|
||||||
{ 96, 97, 99, 100, 102, 104, 160, 162, 164, 166, 168, 171, 223, 223, 207, 31}, // SKINCOLOR_LIME
|
{120, 96, 97, 98, 99, 176, 177, 163, 164, 166, 168, 170, 223, 207, 243, 31}, // SKINCOLOR_LIME
|
||||||
{ 98, 104, 105, 105, 106, 167, 168, 169, 170, 171, 172, 173, 174, 175, 30, 31}, // SKINCOLOR_HANDHELD
|
{ 98, 104, 105, 105, 106, 167, 168, 169, 170, 171, 172, 173, 174, 175, 30, 31}, // SKINCOLOR_HANDHELD
|
||||||
{120, 120, 176, 176, 176, 177, 177, 178, 178, 179, 179, 180, 180, 181, 182, 183}, // SKINCOLOR_TEA
|
{120, 120, 176, 176, 176, 177, 177, 178, 178, 179, 179, 180, 180, 181, 182, 183}, // SKINCOLOR_TEA
|
||||||
{120, 120, 176, 176, 177, 177, 178, 179, 165, 166, 167, 168, 169, 170, 171, 172}, // SKINCOLOR_PISTACHIO
|
{120, 120, 176, 176, 177, 177, 178, 179, 165, 166, 167, 168, 169, 170, 171, 172}, // SKINCOLOR_PISTACHIO
|
||||||
|
@ -289,9 +319,10 @@ UINT8 colortranslations[MAXTRANSLATIONS][16] = {
|
||||||
{160, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 191, 175}, // SKINCOLOR_EMERALD
|
{160, 184, 184, 185, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 191, 175}, // SKINCOLOR_EMERALD
|
||||||
{160, 184, 185, 186, 187, 188, 189, 190, 191, 191, 29, 29, 30, 30, 31, 31}, // SKINCOLOR_SWAMP
|
{160, 184, 185, 186, 187, 188, 189, 190, 191, 191, 29, 29, 30, 30, 31, 31}, // SKINCOLOR_SWAMP
|
||||||
{120, 120, 80, 80, 81, 177, 162, 164, 228, 228, 204, 204, 205, 205, 206, 207}, // SKINCOLOR_DREAM
|
{120, 120, 80, 80, 81, 177, 162, 164, 228, 228, 204, 204, 205, 205, 206, 207}, // SKINCOLOR_DREAM
|
||||||
{176, 160, 184, 185, 186, 187, 188, 230, 230, 206, 206, 207, 28, 29, 30, 31}, // SKINCOLOR_PLAGUE
|
{ 97, 176, 160, 184, 185, 186, 187, 229, 229, 205, 206, 207, 28, 29, 30, 31}, // SKINCOLOR_PLAGUE
|
||||||
{208, 209, 210, 211, 213, 220, 216, 167, 168, 188, 188, 189, 190, 191, 30, 31}, // SKINCOLOR_ALGAE
|
{208, 209, 210, 211, 213, 220, 216, 167, 168, 188, 188, 189, 190, 191, 30, 31}, // SKINCOLOR_ALGAE
|
||||||
{120, 176, 177, 160, 185, 220, 216, 217, 221, 230, 206, 206, 254, 255, 29, 31}, // SKINCOLOR_CARIBBEAN
|
{120, 176, 177, 160, 185, 220, 216, 217, 229, 229, 204, 205, 206, 254, 255, 31}, // SKINCOLOR_CARIBBEAN
|
||||||
|
{120, 96, 97, 98, 177, 220, 216, 217, 218, 204, 252, 253, 254, 255, 30, 31}, // SKINCOLOR_AZURE
|
||||||
{120, 208, 208, 210, 212, 214, 220, 220, 220, 221, 221, 222, 222, 223, 223, 191}, // SKINCOLOR_AQUA
|
{120, 208, 208, 210, 212, 214, 220, 220, 220, 221, 221, 222, 222, 223, 223, 191}, // SKINCOLOR_AQUA
|
||||||
{210, 213, 220, 220, 220, 216, 216, 221, 221, 221, 222, 222, 223, 223, 191, 31}, // SKINCOLOR_TEAL
|
{210, 213, 220, 220, 220, 216, 216, 221, 221, 221, 222, 222, 223, 223, 191, 31}, // SKINCOLOR_TEAL
|
||||||
{120, 120, 208, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 219, 222, 223}, // SKINCOLOR_CYAN
|
{120, 120, 208, 208, 209, 210, 211, 212, 213, 215, 216, 217, 218, 219, 222, 223}, // SKINCOLOR_CYAN
|
||||||
|
@ -301,7 +332,9 @@ UINT8 colortranslations[MAXTRANSLATIONS][16] = {
|
||||||
{120, 0, 0, 200, 200, 201, 11, 14, 17, 218, 222, 223, 238, 240, 243, 246}, // SKINCOLOR_PLATINUM
|
{120, 0, 0, 200, 200, 201, 11, 14, 17, 218, 222, 223, 238, 240, 243, 246}, // SKINCOLOR_PLATINUM
|
||||||
{120, 120, 200, 200, 200, 201, 201, 201, 202, 202, 202, 203, 204, 205, 206, 207}, // SKINCOLOR_SLATE
|
{120, 120, 200, 200, 200, 201, 201, 201, 202, 202, 202, 203, 204, 205, 206, 207}, // SKINCOLOR_SLATE
|
||||||
{120, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 207, 31}, // SKINCOLOR_STEEL
|
{120, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206, 207, 31}, // SKINCOLOR_STEEL
|
||||||
|
{ 96, 97, 98, 112, 113, 114, 11, 203, 204, 205, 205, 237, 239, 241, 243, 246}, // SKINCOLOR_THUNDER
|
||||||
{ 64, 66, 68, 70, 32, 34, 36, 203, 204, 205, 24, 25, 26, 28, 29, 31}, // SKINCOLOR_RUST
|
{ 64, 66, 68, 70, 32, 34, 36, 203, 204, 205, 24, 25, 26, 28, 29, 31}, // SKINCOLOR_RUST
|
||||||
|
{ 81, 72, 76, 48, 51, 55, 252, 205, 205, 206, 240, 241, 242, 243, 244, 246}, // SKINCOLOR_WRISTWATCH
|
||||||
{225, 226, 227, 228, 229, 205, 205, 206, 207, 207, 28, 28, 29, 29, 30, 31}, // SKINCOLOR_JET
|
{225, 226, 227, 228, 229, 205, 205, 206, 207, 207, 28, 28, 29, 29, 30, 31}, // SKINCOLOR_JET
|
||||||
{208, 209, 211, 213, 215, 217, 229, 230, 232, 234, 236, 238, 240, 242, 244, 246}, // SKINCOLOR_SAPPHIRE
|
{208, 209, 211, 213, 215, 217, 229, 230, 232, 234, 236, 238, 240, 242, 244, 246}, // SKINCOLOR_SAPPHIRE
|
||||||
{120, 120, 224, 225, 226, 202, 227, 228, 229, 230, 231, 233, 235, 237, 239, 241}, // SKINCOLOR_PERIWINKLE
|
{120, 120, 224, 225, 226, 202, 227, 228, 229, 230, 231, 233, 235, 237, 239, 241}, // SKINCOLOR_PERIWINKLE
|
||||||
|
@ -318,9 +351,10 @@ UINT8 colortranslations[MAXTRANSLATIONS][16] = {
|
||||||
{120, 120, 176, 176, 177, 6, 8, 10, 249, 250, 196, 197, 198, 199, 143, 31}, // SKINCOLOR_TOXIC
|
{120, 120, 176, 176, 177, 6, 8, 10, 249, 250, 196, 197, 198, 199, 143, 31}, // SKINCOLOR_TOXIC
|
||||||
{ 96, 97, 98, 112, 113, 73, 146, 248, 249, 251, 205, 205, 206, 207, 29, 31}, // SKINCOLOR_MAUVE
|
{ 96, 97, 98, 112, 113, 73, 146, 248, 249, 251, 205, 205, 206, 207, 29, 31}, // SKINCOLOR_MAUVE
|
||||||
{121, 145, 192, 248, 249, 250, 251, 252, 252, 253, 253, 254, 254, 255, 30, 31}, // SKINCOLOR_LAVENDER
|
{121, 145, 192, 248, 249, 250, 251, 252, 252, 253, 253, 254, 254, 255, 30, 31}, // SKINCOLOR_LAVENDER
|
||||||
{144, 248, 249, 250, 251, 252, 253, 254, 255, 255, 29, 29, 30, 30, 31, 31}, // SKINCOLOR_BYZANTIUM
|
{201, 248, 249, 250, 251, 252, 253, 254, 255, 255, 29, 29, 30, 30, 31, 31}, // SKINCOLOR_BYZANTIUM
|
||||||
{144, 145, 146, 147, 148, 149, 150, 251, 251, 252, 252, 253, 254, 255, 29, 30}, // SKINCOLOR_POMEGRANATE
|
{144, 145, 146, 147, 148, 149, 150, 251, 251, 252, 252, 253, 254, 255, 29, 30}, // SKINCOLOR_POMEGRANATE
|
||||||
{120, 120, 120, 121, 121, 122, 122, 123, 192, 248, 249, 250, 251, 252, 253, 254}, // SKINCOLOR_LILAC
|
{120, 120, 120, 121, 121, 122, 122, 123, 192, 248, 249, 250, 251, 252, 253, 254}, // SKINCOLOR_LILAC
|
||||||
|
|
||||||
{120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 96, 100, 104, 113, 116, 119}, // SKINCOLOR_SUPER1
|
{120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 96, 100, 104, 113, 116, 119}, // SKINCOLOR_SUPER1
|
||||||
{120, 120, 120, 120, 120, 120, 120, 120, 96, 98, 101, 104, 113, 115, 117, 119}, // SKINCOLOR_SUPER2
|
{120, 120, 120, 120, 120, 120, 120, 120, 96, 98, 101, 104, 113, 115, 117, 119}, // SKINCOLOR_SUPER2
|
||||||
{120, 120, 120, 120, 120, 120, 96, 98, 100, 102, 104, 113, 114, 116, 117, 119}, // SKINCOLOR_SUPER3
|
{120, 120, 120, 120, 120, 120, 96, 98, 100, 102, 104, 113, 114, 116, 117, 119}, // SKINCOLOR_SUPER3
|
||||||
|
@ -1548,7 +1582,7 @@ void K_RespawnChecker(player_t *player)
|
||||||
|
|
||||||
if (!P_IsObjectOnGround(player->mo) && !mapreset)
|
if (!P_IsObjectOnGround(player->mo) && !mapreset)
|
||||||
{
|
{
|
||||||
player->powers[pw_flashing] = 2;
|
player->powers[pw_flashing] = K_GetKartFlashing(player);
|
||||||
|
|
||||||
// Sal: The old behavior was stupid and prone to accidental usage.
|
// Sal: The old behavior was stupid and prone to accidental usage.
|
||||||
// Let's rip off Mania instead, and turn this into a Drop Dash!
|
// Let's rip off Mania instead, and turn this into a Drop Dash!
|
||||||
|
@ -1614,7 +1648,7 @@ void K_KartMoveAnimation(player_t *player)
|
||||||
P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_R);
|
P_SetPlayerMobjState(player->mo, S_KART_DRIFT1_R);
|
||||||
}
|
}
|
||||||
// Run frames - S_KART_RUN1 S_KART_RUN1_L S_KART_RUN1_R
|
// Run frames - S_KART_RUN1 S_KART_RUN1_L S_KART_RUN1_R
|
||||||
else if (player->speed > FixedMul(player->runspeed, player->mo->scale))
|
else if (player->speed > (20*player->mo->scale))
|
||||||
{
|
{
|
||||||
if (cmd->driftturn < 0 && !(player->mo->state >= &states[S_KART_RUN1_R] && player->mo->state <= &states[S_KART_RUN2_R]))
|
if (cmd->driftturn < 0 && !(player->mo->state >= &states[S_KART_RUN1_R] && player->mo->state <= &states[S_KART_RUN2_R]))
|
||||||
P_SetPlayerMobjState(player->mo, S_KART_RUN1_R);
|
P_SetPlayerMobjState(player->mo, S_KART_RUN1_R);
|
||||||
|
@ -1624,7 +1658,7 @@ void K_KartMoveAnimation(player_t *player)
|
||||||
P_SetPlayerMobjState(player->mo, S_KART_RUN1);
|
P_SetPlayerMobjState(player->mo, S_KART_RUN1);
|
||||||
}
|
}
|
||||||
// Walk frames - S_KART_WALK1 S_KART_WALK1_L S_KART_WALK1_R
|
// Walk frames - S_KART_WALK1 S_KART_WALK1_L S_KART_WALK1_R
|
||||||
else if (player->speed <= FixedMul(player->runspeed, player->mo->scale))
|
else if (player->speed <= (20*player->mo->scale))
|
||||||
{
|
{
|
||||||
if (cmd->driftturn < 0 && !(player->mo->state >= &states[S_KART_WALK1_R] && player->mo->state <= &states[S_KART_WALK2_R]))
|
if (cmd->driftturn < 0 && !(player->mo->state >= &states[S_KART_WALK1_R] && player->mo->state <= &states[S_KART_WALK2_R]))
|
||||||
P_SetPlayerMobjState(player->mo, S_KART_WALK1_R);
|
P_SetPlayerMobjState(player->mo, S_KART_WALK1_R);
|
||||||
|
@ -8268,7 +8302,7 @@ static void K_drawKartFirstPerson(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
if (stplyr->speed < FixedMul(stplyr->runspeed, stplyr->mo->scale) && (leveltime & 1) && !splitscreen)
|
if (stplyr->speed < (20*stplyr->mo->scale) && (leveltime & 1) && !splitscreen)
|
||||||
y++;
|
y++;
|
||||||
// the following isn't EXPLICITLY right, it just gets the result we want, but i'm too lazy to look up the right way to do it
|
// the following isn't EXPLICITLY right, it just gets the result we want, but i'm too lazy to look up the right way to do it
|
||||||
if (stplyr->mo->flags2 & MF2_SHADOW)
|
if (stplyr->mo->flags2 & MF2_SHADOW)
|
||||||
|
|
|
@ -953,40 +953,6 @@ static int lib_pHomingAttack(lua_State *L)
|
||||||
return 1;
|
return 1;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
static int lib_pDoJump(lua_State *L)
|
|
||||||
{
|
|
||||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
|
||||||
boolean soundandstate = (boolean)lua_opttrueboolean(L, 2);
|
|
||||||
NOHUD
|
|
||||||
if (!player)
|
|
||||||
return LUA_ErrInvalid(L, "player_t");
|
|
||||||
P_DoJump(player, soundandstate);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lib_pSpawnThokMobj(lua_State *L)
|
|
||||||
{
|
|
||||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
|
||||||
NOHUD
|
|
||||||
if (!player)
|
|
||||||
return LUA_ErrInvalid(L, "player_t");
|
|
||||||
P_SpawnThokMobj(player);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lib_pSpawnSpinMobj(lua_State *L)
|
|
||||||
{
|
|
||||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
|
||||||
mobjtype_t type = luaL_checkinteger(L, 2);
|
|
||||||
NOHUD
|
|
||||||
if (!player)
|
|
||||||
return LUA_ErrInvalid(L, "player_t");
|
|
||||||
if (type >= NUMMOBJTYPES)
|
|
||||||
return luaL_error(L, "mobj type %d out of range (0 - %d)", type, NUMMOBJTYPES-1);
|
|
||||||
P_SpawnSpinMobj(player, type);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lib_pTelekinesis(lua_State *L)
|
static int lib_pTelekinesis(lua_State *L)
|
||||||
{
|
{
|
||||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||||
|
@ -2652,9 +2618,6 @@ static luaL_Reg lib[] = {
|
||||||
{"P_NukeEnemies",lib_pNukeEnemies},
|
{"P_NukeEnemies",lib_pNukeEnemies},
|
||||||
{"P_HomingAttack",lib_pHomingAttack},
|
{"P_HomingAttack",lib_pHomingAttack},
|
||||||
//{"P_SuperReady",lib_pSuperReady},
|
//{"P_SuperReady",lib_pSuperReady},
|
||||||
{"P_DoJump",lib_pDoJump},
|
|
||||||
{"P_SpawnThokMobj",lib_pSpawnThokMobj},
|
|
||||||
{"P_SpawnSpinMobj",lib_pSpawnSpinMobj},
|
|
||||||
{"P_Telekinesis",lib_pTelekinesis},
|
{"P_Telekinesis",lib_pTelekinesis},
|
||||||
|
|
||||||
// p_map
|
// p_map
|
||||||
|
|
|
@ -155,36 +155,8 @@ static int player_get(lua_State *L)
|
||||||
else if (fastcmp(field,"kartweight"))
|
else if (fastcmp(field,"kartweight"))
|
||||||
lua_pushinteger(L, plr->kartweight);
|
lua_pushinteger(L, plr->kartweight);
|
||||||
//
|
//
|
||||||
else if (fastcmp(field,"normalspeed"))
|
|
||||||
lua_pushfixed(L, plr->normalspeed);
|
|
||||||
else if (fastcmp(field,"runspeed"))
|
|
||||||
lua_pushfixed(L, plr->runspeed);
|
|
||||||
else if (fastcmp(field,"thrustfactor"))
|
|
||||||
lua_pushinteger(L, plr->thrustfactor);
|
|
||||||
else if (fastcmp(field,"accelstart"))
|
|
||||||
lua_pushinteger(L, plr->accelstart);
|
|
||||||
else if (fastcmp(field,"acceleration"))
|
|
||||||
lua_pushinteger(L, plr->acceleration);
|
|
||||||
else if (fastcmp(field,"charability"))
|
|
||||||
lua_pushinteger(L, plr->charability);
|
|
||||||
else if (fastcmp(field,"charability2"))
|
|
||||||
lua_pushinteger(L, plr->charability2);
|
|
||||||
else if (fastcmp(field,"charflags"))
|
else if (fastcmp(field,"charflags"))
|
||||||
lua_pushinteger(L, plr->charflags);
|
lua_pushinteger(L, plr->charflags);
|
||||||
else if (fastcmp(field,"thokitem"))
|
|
||||||
lua_pushinteger(L, plr->thokitem);
|
|
||||||
else if (fastcmp(field,"spinitem"))
|
|
||||||
lua_pushinteger(L, plr->spinitem);
|
|
||||||
else if (fastcmp(field,"revitem"))
|
|
||||||
lua_pushinteger(L, plr->revitem);
|
|
||||||
else if (fastcmp(field,"actionspd"))
|
|
||||||
lua_pushfixed(L, plr->actionspd);
|
|
||||||
else if (fastcmp(field,"mindash"))
|
|
||||||
lua_pushfixed(L, plr->mindash);
|
|
||||||
else if (fastcmp(field,"maxdash"))
|
|
||||||
lua_pushfixed(L, plr->maxdash);
|
|
||||||
else if (fastcmp(field,"jumpfactor"))
|
|
||||||
lua_pushfixed(L, plr->jumpfactor);
|
|
||||||
else if (fastcmp(field,"lives"))
|
else if (fastcmp(field,"lives"))
|
||||||
lua_pushinteger(L, plr->lives);
|
lua_pushinteger(L, plr->lives);
|
||||||
else if (fastcmp(field,"continues"))
|
else if (fastcmp(field,"continues"))
|
||||||
|
@ -431,36 +403,8 @@ static int player_set(lua_State *L)
|
||||||
else if (fastcmp(field,"kartweight"))
|
else if (fastcmp(field,"kartweight"))
|
||||||
plr->kartweight = (UINT8)luaL_checkinteger(L, 3);
|
plr->kartweight = (UINT8)luaL_checkinteger(L, 3);
|
||||||
//
|
//
|
||||||
else if (fastcmp(field,"normalspeed"))
|
|
||||||
plr->normalspeed = luaL_checkfixed(L, 3);
|
|
||||||
else if (fastcmp(field,"runspeed"))
|
|
||||||
plr->runspeed = luaL_checkfixed(L, 3);
|
|
||||||
else if (fastcmp(field,"thrustfactor"))
|
|
||||||
plr->thrustfactor = (UINT8)luaL_checkinteger(L, 3);
|
|
||||||
else if (fastcmp(field,"accelstart"))
|
|
||||||
plr->accelstart = (UINT8)luaL_checkinteger(L, 3);
|
|
||||||
else if (fastcmp(field,"acceleration"))
|
|
||||||
plr->acceleration = (UINT8)luaL_checkinteger(L, 3);
|
|
||||||
else if (fastcmp(field,"charability"))
|
|
||||||
plr->charability = (UINT8)luaL_checkinteger(L, 3);
|
|
||||||
else if (fastcmp(field,"charability2"))
|
|
||||||
plr->charability2 = (UINT8)luaL_checkinteger(L, 3);
|
|
||||||
else if (fastcmp(field,"charflags"))
|
else if (fastcmp(field,"charflags"))
|
||||||
plr->charflags = (UINT32)luaL_checkinteger(L, 3);
|
plr->charflags = (UINT32)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"thokitem"))
|
|
||||||
plr->thokitem = luaL_checkinteger(L, 3);
|
|
||||||
else if (fastcmp(field,"spinitem"))
|
|
||||||
plr->spinitem = luaL_checkinteger(L, 3);
|
|
||||||
else if (fastcmp(field,"revitem"))
|
|
||||||
plr->revitem = luaL_checkinteger(L, 3);
|
|
||||||
else if (fastcmp(field,"actionspd"))
|
|
||||||
plr->actionspd = (INT32)luaL_checkinteger(L, 3);
|
|
||||||
else if (fastcmp(field,"mindash"))
|
|
||||||
plr->mindash = (INT32)luaL_checkinteger(L, 3);
|
|
||||||
else if (fastcmp(field,"maxdash"))
|
|
||||||
plr->maxdash = (INT32)luaL_checkinteger(L, 3);
|
|
||||||
else if (fastcmp(field,"jumpfactor"))
|
|
||||||
plr->jumpfactor = (INT32)luaL_checkinteger(L, 3);
|
|
||||||
else if (fastcmp(field,"lives"))
|
else if (fastcmp(field,"lives"))
|
||||||
plr->lives = (SINT8)luaL_checkinteger(L, 3);
|
plr->lives = (SINT8)luaL_checkinteger(L, 3);
|
||||||
else if (fastcmp(field,"continues"))
|
else if (fastcmp(field,"continues"))
|
||||||
|
|
239
src/m_fixed.c
239
src/m_fixed.c
|
@ -56,7 +56,7 @@ fixed_t FixedDiv2(fixed_t a, fixed_t b)
|
||||||
if (b == 0)
|
if (b == 0)
|
||||||
I_Error("FixedDiv: divide by zero");
|
I_Error("FixedDiv: divide by zero");
|
||||||
|
|
||||||
ret = (((INT64)a * FRACUNIT) ) / b;
|
ret = (((INT64)a * FRACUNIT)) / b;
|
||||||
|
|
||||||
if ((ret > INT32_MAX) || (ret < INT32_MIN))
|
if ((ret > INT32_MAX) || (ret < INT32_MIN))
|
||||||
I_Error("FixedDiv: divide by zero");
|
I_Error("FixedDiv: divide by zero");
|
||||||
|
@ -117,7 +117,7 @@ fixed_t FixedHypot(fixed_t x, fixed_t y)
|
||||||
yx = FixedDiv(y, x); // (x/y)
|
yx = FixedDiv(y, x); // (x/y)
|
||||||
}
|
}
|
||||||
yx2 = FixedMul(yx, yx); // (x/y)^2
|
yx2 = FixedMul(yx, yx); // (x/y)^2
|
||||||
yx1 = FixedSqrt(1*FRACUNIT + yx2); // (1 + (x/y)^2)^1/2
|
yx1 = FixedSqrt(1 * FRACUNIT + yx2); // (1 + (x/y)^2)^1/2
|
||||||
return FixedMul(ax, yx1); // |x|*((1 + (x/y)^2)^1/2)
|
return FixedMul(ax, yx1); // |x|*((1 + (x/y)^2)^1/2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,8 +191,8 @@ vector2_t *FV2_Divide(vector2_t *a_i, fixed_t a_c)
|
||||||
// Vector Complex Math
|
// Vector Complex Math
|
||||||
vector2_t *FV2_Midpoint(const vector2_t *a_1, const vector2_t *a_2, vector2_t *a_o)
|
vector2_t *FV2_Midpoint(const vector2_t *a_1, const vector2_t *a_2, vector2_t *a_o)
|
||||||
{
|
{
|
||||||
a_o->x = FixedDiv(a_2->x - a_1->x, 2*FRACUNIT);
|
a_o->x = FixedDiv(a_2->x - a_1->x, 2 * FRACUNIT);
|
||||||
a_o->y = FixedDiv(a_2->y - a_1->y, 2*FRACUNIT);
|
a_o->y = FixedDiv(a_2->y - a_1->y, 2 * FRACUNIT);
|
||||||
a_o->x = a_1->x + a_o->x;
|
a_o->x = a_1->x + a_o->x;
|
||||||
a_o->y = a_1->y + a_o->y;
|
a_o->y = a_1->y + a_o->y;
|
||||||
return a_o;
|
return a_o;
|
||||||
|
@ -200,16 +200,16 @@ vector2_t *FV2_Midpoint(const vector2_t *a_1, const vector2_t *a_2, vector2_t *a
|
||||||
|
|
||||||
fixed_t FV2_Distance(const vector2_t *p1, const vector2_t *p2)
|
fixed_t FV2_Distance(const vector2_t *p1, const vector2_t *p2)
|
||||||
{
|
{
|
||||||
fixed_t xs = FixedMul(p2->x-p1->x,p2->x-p1->x);
|
fixed_t xs = FixedMul(p2->x - p1->x, p2->x - p1->x);
|
||||||
fixed_t ys = FixedMul(p2->y-p1->y,p2->y-p1->y);
|
fixed_t ys = FixedMul(p2->y - p1->y, p2->y - p1->y);
|
||||||
return FixedSqrt(xs+ys);
|
return FixedSqrt(xs + ys);
|
||||||
}
|
}
|
||||||
|
|
||||||
fixed_t FV2_Magnitude(const vector2_t *a_normal)
|
fixed_t FV2_Magnitude(const vector2_t *a_normal)
|
||||||
{
|
{
|
||||||
fixed_t xs = FixedMul(a_normal->x,a_normal->x);
|
fixed_t xs = FixedMul(a_normal->x, a_normal->x);
|
||||||
fixed_t ys = FixedMul(a_normal->y,a_normal->y);
|
fixed_t ys = FixedMul(a_normal->y, a_normal->y);
|
||||||
return FixedSqrt(xs+ys);
|
return FixedSqrt(xs + ys);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Also returns the magnitude
|
// Also returns the magnitude
|
||||||
|
@ -240,7 +240,7 @@ vector2_t *FV2_Negate(vector2_t *a_1)
|
||||||
|
|
||||||
boolean FV2_Equal(const vector2_t *a_1, const vector2_t *a_2)
|
boolean FV2_Equal(const vector2_t *a_1, const vector2_t *a_2)
|
||||||
{
|
{
|
||||||
fixed_t Epsilon = FRACUNIT/FRACUNIT;
|
fixed_t Epsilon = FRACUNIT / FRACUNIT;
|
||||||
|
|
||||||
if ((abs(a_2->x - a_1->x) > Epsilon) ||
|
if ((abs(a_2->x - a_1->x) > Epsilon) ||
|
||||||
(abs(a_2->y - a_1->y) > Epsilon))
|
(abs(a_2->y - a_1->y) > Epsilon))
|
||||||
|
@ -261,7 +261,7 @@ fixed_t FV2_Dot(const vector2_t *a_1, const vector2_t *a_2)
|
||||||
//
|
//
|
||||||
// Given two points, create a vector between them.
|
// Given two points, create a vector between them.
|
||||||
//
|
//
|
||||||
vector2_t *FV2_Point2Vec (const vector2_t *point1, const vector2_t *point2, vector2_t *a_o)
|
vector2_t *FV2_Point2Vec(const vector2_t *point1, const vector2_t *point2, vector2_t *a_o)
|
||||||
{
|
{
|
||||||
a_o->x = point1->x - point2->x;
|
a_o->x = point1->x - point2->x;
|
||||||
a_o->y = point1->y - point2->y;
|
a_o->y = point1->y - point2->y;
|
||||||
|
@ -344,9 +344,9 @@ vector3_t *FV3_Divide(vector3_t *a_i, fixed_t a_c)
|
||||||
// Vector Complex Math
|
// Vector Complex Math
|
||||||
vector3_t *FV3_Midpoint(const vector3_t *a_1, const vector3_t *a_2, vector3_t *a_o)
|
vector3_t *FV3_Midpoint(const vector3_t *a_1, const vector3_t *a_2, vector3_t *a_o)
|
||||||
{
|
{
|
||||||
a_o->x = FixedDiv(a_2->x - a_1->x, 2*FRACUNIT);
|
a_o->x = FixedDiv(a_2->x - a_1->x, 2 * FRACUNIT);
|
||||||
a_o->y = FixedDiv(a_2->y - a_1->y, 2*FRACUNIT);
|
a_o->y = FixedDiv(a_2->y - a_1->y, 2 * FRACUNIT);
|
||||||
a_o->z = FixedDiv(a_2->z - a_1->z, 2*FRACUNIT);
|
a_o->z = FixedDiv(a_2->z - a_1->z, 2 * FRACUNIT);
|
||||||
a_o->x = a_1->x + a_o->x;
|
a_o->x = a_1->x + a_o->x;
|
||||||
a_o->y = a_1->y + a_o->y;
|
a_o->y = a_1->y + a_o->y;
|
||||||
a_o->z = a_1->z + a_o->z;
|
a_o->z = a_1->z + a_o->z;
|
||||||
|
@ -355,18 +355,18 @@ vector3_t *FV3_Midpoint(const vector3_t *a_1, const vector3_t *a_2, vector3_t *a
|
||||||
|
|
||||||
fixed_t FV3_Distance(const vector3_t *p1, const vector3_t *p2)
|
fixed_t FV3_Distance(const vector3_t *p1, const vector3_t *p2)
|
||||||
{
|
{
|
||||||
fixed_t xs = FixedMul(p2->x-p1->x,p2->x-p1->x);
|
fixed_t xs = FixedMul(p2->x - p1->x, p2->x - p1->x);
|
||||||
fixed_t ys = FixedMul(p2->y-p1->y,p2->y-p1->y);
|
fixed_t ys = FixedMul(p2->y - p1->y, p2->y - p1->y);
|
||||||
fixed_t zs = FixedMul(p2->z-p1->z,p2->z-p1->z);
|
fixed_t zs = FixedMul(p2->z - p1->z, p2->z - p1->z);
|
||||||
return FixedSqrt(xs+ys+zs);
|
return FixedSqrt(xs + ys + zs);
|
||||||
}
|
}
|
||||||
|
|
||||||
fixed_t FV3_Magnitude(const vector3_t *a_normal)
|
fixed_t FV3_Magnitude(const vector3_t *a_normal)
|
||||||
{
|
{
|
||||||
fixed_t xs = FixedMul(a_normal->x,a_normal->x);
|
fixed_t xs = FixedMul(a_normal->x, a_normal->x);
|
||||||
fixed_t ys = FixedMul(a_normal->y,a_normal->y);
|
fixed_t ys = FixedMul(a_normal->y, a_normal->y);
|
||||||
fixed_t zs = FixedMul(a_normal->z,a_normal->z);
|
fixed_t zs = FixedMul(a_normal->z, a_normal->z);
|
||||||
return FixedSqrt(xs+ys+zs);
|
return FixedSqrt(xs + ys + zs);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Also returns the magnitude
|
// Also returns the magnitude
|
||||||
|
@ -399,7 +399,7 @@ vector3_t *FV3_Negate(vector3_t *a_1)
|
||||||
|
|
||||||
boolean FV3_Equal(const vector3_t *a_1, const vector3_t *a_2)
|
boolean FV3_Equal(const vector3_t *a_1, const vector3_t *a_2)
|
||||||
{
|
{
|
||||||
fixed_t Epsilon = FRACUNIT/FRACUNIT;
|
fixed_t Epsilon = FRACUNIT / FRACUNIT;
|
||||||
|
|
||||||
if ((abs(a_2->x - a_1->x) > Epsilon) ||
|
if ((abs(a_2->x - a_1->x) > Epsilon) ||
|
||||||
(abs(a_2->y - a_1->y) > Epsilon) ||
|
(abs(a_2->y - a_1->y) > Epsilon) ||
|
||||||
|
@ -458,6 +458,20 @@ vector3_t *FV3_ClosestPointOnLine(const vector3_t *Line, const vector3_t *p, vec
|
||||||
return FV3_AddEx(&Line[0], &V, out);
|
return FV3_AddEx(&Line[0], &V, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// ClosestPointOnVector
|
||||||
|
//
|
||||||
|
// Similar to ClosestPointOnLine, but uses a vector instead of two points.
|
||||||
|
//
|
||||||
|
void FV3_ClosestPointOnVector(const vector3_t *dir, const vector3_t *p, vector3_t *out)
|
||||||
|
{
|
||||||
|
fixed_t t = FV3_Dot(dir, p);
|
||||||
|
|
||||||
|
// Return the point on the line closest
|
||||||
|
FV3_MulEx(dir, t, out);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// ClosestPointOnTriangle
|
// ClosestPointOnTriangle
|
||||||
//
|
//
|
||||||
|
@ -465,7 +479,7 @@ vector3_t *FV3_ClosestPointOnLine(const vector3_t *Line, const vector3_t *p, vec
|
||||||
// the closest point on the edge of
|
// the closest point on the edge of
|
||||||
// the triangle is returned.
|
// the triangle is returned.
|
||||||
//
|
//
|
||||||
void FV3_ClosestPointOnTriangle (const vector3_t *tri, const vector3_t *point, vector3_t *result)
|
void FV3_ClosestPointOnTriangle(const vector3_t *tri, const vector3_t *point, vector3_t *result)
|
||||||
{
|
{
|
||||||
UINT8 i;
|
UINT8 i;
|
||||||
fixed_t dist, closestdist;
|
fixed_t dist, closestdist;
|
||||||
|
@ -506,7 +520,7 @@ void FV3_ClosestPointOnTriangle (const vector3_t *tri, const vector3_t *point, v
|
||||||
//
|
//
|
||||||
// Given two points, create a vector between them.
|
// Given two points, create a vector between them.
|
||||||
//
|
//
|
||||||
vector3_t *FV3_Point2Vec (const vector3_t *point1, const vector3_t *point2, vector3_t *a_o)
|
vector3_t *FV3_Point2Vec(const vector3_t *point1, const vector3_t *point2, vector3_t *a_o)
|
||||||
{
|
{
|
||||||
a_o->x = point1->x - point2->x;
|
a_o->x = point1->x - point2->x;
|
||||||
a_o->y = point1->y - point2->y;
|
a_o->y = point1->y - point2->y;
|
||||||
|
@ -519,7 +533,7 @@ vector3_t *FV3_Point2Vec (const vector3_t *point1, const vector3_t *point2, vect
|
||||||
//
|
//
|
||||||
// Calculates the normal of a polygon.
|
// Calculates the normal of a polygon.
|
||||||
//
|
//
|
||||||
void FV3_Normal (const vector3_t *a_triangle, vector3_t *a_normal)
|
fixed_t FV3_Normal(const vector3_t *a_triangle, vector3_t *a_normal)
|
||||||
{
|
{
|
||||||
vector3_t a_1;
|
vector3_t a_1;
|
||||||
vector3_t a_2;
|
vector3_t a_2;
|
||||||
|
@ -529,7 +543,28 @@ void FV3_Normal (const vector3_t *a_triangle, vector3_t *a_normal)
|
||||||
|
|
||||||
FV3_Cross(&a_1, &a_2, a_normal);
|
FV3_Cross(&a_1, &a_2, a_normal);
|
||||||
|
|
||||||
FV3_NormalizeEx(a_normal, a_normal);
|
return FV3_NormalizeEx(a_normal, a_normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Strength
|
||||||
|
//
|
||||||
|
// Measures the 'strength' of a vector in a particular direction.
|
||||||
|
//
|
||||||
|
fixed_t FV3_Strength(const vector3_t *a_1, const vector3_t *dir)
|
||||||
|
{
|
||||||
|
vector3_t normal;
|
||||||
|
fixed_t dist = FV3_NormalizeEx(a_1, &normal);
|
||||||
|
fixed_t dot = FV3_Dot(&normal, dir);
|
||||||
|
|
||||||
|
FV3_ClosestPointOnVector(dir, a_1, &normal);
|
||||||
|
|
||||||
|
dist = FV3_Magnitude(&normal);
|
||||||
|
|
||||||
|
if (dot < 0) // Not facing same direction, so negate result.
|
||||||
|
dist = -dist;
|
||||||
|
|
||||||
|
return dist;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -550,11 +585,11 @@ boolean FV3_IntersectedPlane(const vector3_t *a_triangle, const vector3_t *a_lin
|
||||||
|
|
||||||
*originDistance = FV3_PlaneDistance(a_normal, &a_triangle[0]);
|
*originDistance = FV3_PlaneDistance(a_normal, &a_triangle[0]);
|
||||||
|
|
||||||
distance1 = (FixedMul(a_normal->x, a_line[0].x) + FixedMul(a_normal->y, a_line[0].y)
|
distance1 = (FixedMul(a_normal->x, a_line[0].x) + FixedMul(a_normal->y, a_line[0].y)
|
||||||
+ FixedMul(a_normal->z, a_line[0].z)) + *originDistance;
|
+ FixedMul(a_normal->z, a_line[0].z)) + *originDistance;
|
||||||
|
|
||||||
distance2 = (FixedMul(a_normal->x, a_line[1].x) + FixedMul(a_normal->y, a_line[1].y)
|
distance2 = (FixedMul(a_normal->x, a_line[1].x) + FixedMul(a_normal->y, a_line[1].y)
|
||||||
+ FixedMul(a_normal->z, a_line[1].z)) + *originDistance;
|
+ FixedMul(a_normal->z, a_line[1].z)) + *originDistance;
|
||||||
|
|
||||||
// Positive or zero number means no intersection
|
// Positive or zero number means no intersection
|
||||||
if (FixedMul(distance1, distance2) >= 0)
|
if (FixedMul(distance1, distance2) >= 0)
|
||||||
|
@ -575,8 +610,8 @@ boolean FV3_IntersectedPlane(const vector3_t *a_triangle, const vector3_t *a_lin
|
||||||
fixed_t FV3_PlaneIntersection(const vector3_t *pOrigin, const vector3_t *pNormal, const vector3_t *rOrigin, const vector3_t *rVector)
|
fixed_t FV3_PlaneIntersection(const vector3_t *pOrigin, const vector3_t *pNormal, const vector3_t *rOrigin, const vector3_t *rVector)
|
||||||
{
|
{
|
||||||
fixed_t d = -(FV3_Dot(pNormal, pOrigin));
|
fixed_t d = -(FV3_Dot(pNormal, pOrigin));
|
||||||
fixed_t number = FV3_Dot(pNormal,rOrigin) + d;
|
fixed_t number = FV3_Dot(pNormal, rOrigin) + d;
|
||||||
fixed_t denom = FV3_Dot(pNormal,rVector);
|
fixed_t denom = FV3_Dot(pNormal, rVector);
|
||||||
return -FixedDiv(number, denom);
|
return -FixedDiv(number, denom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -597,11 +632,11 @@ fixed_t FV3_IntersectRaySphere(const vector3_t *rO, const vector3_t *rV, const v
|
||||||
|
|
||||||
c = FV3_Magnitude(&Q);
|
c = FV3_Magnitude(&Q);
|
||||||
v = FV3_Dot(&Q, rV);
|
v = FV3_Dot(&Q, rV);
|
||||||
d = FixedMul(sR, sR) - (FixedMul(c,c) - FixedMul(v,v));
|
d = FixedMul(sR, sR) - (FixedMul(c, c) - FixedMul(v, v));
|
||||||
|
|
||||||
// If there was no intersection, return -1
|
// If there was no intersection, return -1
|
||||||
if (d < 0*FRACUNIT)
|
if (d < 0 * FRACUNIT)
|
||||||
return (-1*FRACUNIT);
|
return (-1 * FRACUNIT);
|
||||||
|
|
||||||
// Return the distance to the [first] intersecting point
|
// Return the distance to the [first] intersecting point
|
||||||
return (v - FixedSqrt(d));
|
return (v - FixedSqrt(d));
|
||||||
|
@ -629,9 +664,9 @@ vector3_t *FV3_IntersectionPoint(const vector3_t *vNormal, const vector3_t *vLin
|
||||||
// Here I just chose a arbitrary point as the point to find that distance. You notice we negate that
|
// Here I just chose a arbitrary point as the point to find that distance. You notice we negate that
|
||||||
// distance. We negate the distance because we want to eventually go BACKWARDS from our point to the plane.
|
// distance. We negate the distance because we want to eventually go BACKWARDS from our point to the plane.
|
||||||
// By doing this is will basically bring us back to the plane to find our intersection point.
|
// By doing this is will basically bring us back to the plane to find our intersection point.
|
||||||
Numerator = - (FixedMul(vNormal->x, vLine[0].x) + // Use the plane equation with the normal and the line
|
Numerator = -(FixedMul(vNormal->x, vLine[0].x) + // Use the plane equation with the normal and the line
|
||||||
FixedMul(vNormal->y, vLine[0].y) +
|
FixedMul(vNormal->y, vLine[0].y) +
|
||||||
FixedMul(vNormal->z, vLine[0].z) + distance);
|
FixedMul(vNormal->z, vLine[0].z) + distance);
|
||||||
|
|
||||||
// 3) If we take the dot product between our line vector and the normal of the polygon,
|
// 3) If we take the dot product between our line vector and the normal of the polygon,
|
||||||
// this will give us the cosine of the angle between the 2 (since they are both normalized - length 1).
|
// this will give us the cosine of the angle between the 2 (since they are both normalized - length 1).
|
||||||
|
@ -643,7 +678,7 @@ vector3_t *FV3_IntersectionPoint(const vector3_t *vNormal, const vector3_t *vLin
|
||||||
// on the plane (the normal is perpendicular to the line - (Normal.Vector = 0)).
|
// on the plane (the normal is perpendicular to the line - (Normal.Vector = 0)).
|
||||||
// In this case, we should just return any point on the line.
|
// In this case, we should just return any point on the line.
|
||||||
|
|
||||||
if( Denominator == 0*FRACUNIT) // Check so we don't divide by zero
|
if (Denominator == 0 * FRACUNIT) // Check so we don't divide by zero
|
||||||
{
|
{
|
||||||
ReturnVec->x = vLine[0].x;
|
ReturnVec->x = vLine[0].x;
|
||||||
ReturnVec->y = vLine[0].y;
|
ReturnVec->y = vLine[0].y;
|
||||||
|
@ -686,8 +721,8 @@ vector3_t *FV3_IntersectionPoint(const vector3_t *vNormal, const vector3_t *vLin
|
||||||
//
|
//
|
||||||
UINT8 FV3_PointOnLineSide(const vector3_t *point, const vector3_t *line)
|
UINT8 FV3_PointOnLineSide(const vector3_t *point, const vector3_t *line)
|
||||||
{
|
{
|
||||||
fixed_t s1 = FixedMul((point->y - line[0].y),(line[1].x - line[0].x));
|
fixed_t s1 = FixedMul((point->y - line[0].y), (line[1].x - line[0].x));
|
||||||
fixed_t s2 = FixedMul((point->x - line[0].x),(line[1].y - line[0].y));
|
fixed_t s2 = FixedMul((point->x - line[0].x), (line[1].y - line[0].y));
|
||||||
return (UINT8)(s1 - s2 < 0);
|
return (UINT8)(s1 - s2 < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -752,7 +787,7 @@ void FM_CreateObjectMatrix(matrix_t *matrix, fixed_t x, fixed_t y, fixed_t z, fi
|
||||||
matrix->m[0] = upcross.x;
|
matrix->m[0] = upcross.x;
|
||||||
matrix->m[1] = upcross.y;
|
matrix->m[1] = upcross.y;
|
||||||
matrix->m[2] = upcross.z;
|
matrix->m[2] = upcross.z;
|
||||||
matrix->m[3] = 0*FRACUNIT;
|
matrix->m[3] = 0 * FRACUNIT;
|
||||||
|
|
||||||
matrix->m[4] = upx;
|
matrix->m[4] = upx;
|
||||||
matrix->m[5] = upy;
|
matrix->m[5] = upy;
|
||||||
|
@ -764,9 +799,9 @@ void FM_CreateObjectMatrix(matrix_t *matrix, fixed_t x, fixed_t y, fixed_t z, fi
|
||||||
matrix->m[10] = anglez;
|
matrix->m[10] = anglez;
|
||||||
matrix->m[11] = 0;
|
matrix->m[11] = 0;
|
||||||
|
|
||||||
matrix->m[12] = x - FixedMul(upx,radius);
|
matrix->m[12] = x - FixedMul(upx, radius);
|
||||||
matrix->m[13] = y - FixedMul(upy,radius);
|
matrix->m[13] = y - FixedMul(upy, radius);
|
||||||
matrix->m[14] = z - FixedMul(upz,radius);
|
matrix->m[14] = z - FixedMul(upz, radius);
|
||||||
matrix->m[15] = FRACUNIT;
|
matrix->m[15] = FRACUNIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -778,20 +813,20 @@ void FM_CreateObjectMatrix(matrix_t *matrix, fixed_t x, fixed_t y, fixed_t z, fi
|
||||||
void FM_MultMatrixVec3(const matrix_t *matrix, const vector3_t *vec, vector3_t *out)
|
void FM_MultMatrixVec3(const matrix_t *matrix, const vector3_t *vec, vector3_t *out)
|
||||||
{
|
{
|
||||||
#define M(row,col) matrix->m[col * 4 + row]
|
#define M(row,col) matrix->m[col * 4 + row]
|
||||||
out->x = FixedMul(vec->x,M(0, 0))
|
out->x = FixedMul(vec->x, M(0, 0))
|
||||||
+ FixedMul(vec->y,M(0, 1))
|
+ FixedMul(vec->y, M(0, 1))
|
||||||
+ FixedMul(vec->z,M(0, 2))
|
+ FixedMul(vec->z, M(0, 2))
|
||||||
+ M(0, 3);
|
+ M(0, 3);
|
||||||
|
|
||||||
out->y = FixedMul(vec->x,M(1, 0))
|
out->y = FixedMul(vec->x, M(1, 0))
|
||||||
+ FixedMul(vec->y,M(1, 1))
|
+ FixedMul(vec->y, M(1, 1))
|
||||||
+ FixedMul(vec->z,M(1, 2))
|
+ FixedMul(vec->z, M(1, 2))
|
||||||
+ M(1, 3);
|
+ M(1, 3);
|
||||||
|
|
||||||
out->z = FixedMul(vec->x,M(2, 0))
|
out->z = FixedMul(vec->x, M(2, 0))
|
||||||
+ FixedMul(vec->y,M(2, 1))
|
+ FixedMul(vec->y, M(2, 1))
|
||||||
+ FixedMul(vec->z,M(2, 2))
|
+ FixedMul(vec->z, M(2, 2))
|
||||||
+ M(2, 3);
|
+ M(2, 3);
|
||||||
#undef M
|
#undef M
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -811,7 +846,7 @@ void FM_MultMatrix(matrix_t *dest, const matrix_t *multme)
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
for (j = 0; j < 4; j++)
|
for (j = 0; j < 4; j++)
|
||||||
R(i, j) = FixedMul(D(i, 0),M(0, j)) + FixedMul(D(i, 1),M(1, j)) + FixedMul(D(i, 2),M(2, j)) + FixedMul(D(i, 3),M(3, j));
|
R(i, j) = FixedMul(D(i, 0), M(0, j)) + FixedMul(D(i, 1), M(1, j)) + FixedMul(D(i, 2), M(2, j)) + FixedMul(D(i, 3), M(3, j));
|
||||||
}
|
}
|
||||||
|
|
||||||
M_Memcpy(dest, &result, sizeof(matrix_t));
|
M_Memcpy(dest, &result, sizeof(matrix_t));
|
||||||
|
@ -869,8 +904,8 @@ void FM_Scale(matrix_t *dest, fixed_t x, fixed_t y, fixed_t z)
|
||||||
|
|
||||||
static inline void M_print(INT64 a)
|
static inline void M_print(INT64 a)
|
||||||
{
|
{
|
||||||
const fixed_t w = (a>>FRACBITS);
|
const fixed_t w = (a >> FRACBITS);
|
||||||
fixed_t f = a%FRACUNIT;
|
fixed_t f = a % FRACUNIT;
|
||||||
fixed_t d = FRACUNIT;
|
fixed_t d = FRACUNIT;
|
||||||
|
|
||||||
if (f == 0)
|
if (f == 0)
|
||||||
|
@ -878,7 +913,7 @@ static inline void M_print(INT64 a)
|
||||||
printf("%d", (fixed_t)w);
|
printf("%d", (fixed_t)w);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else while (f != 1 && f/2 == f>>1)
|
else while (f != 1 && f / 2 == f >> 1)
|
||||||
{
|
{
|
||||||
d /= 2;
|
d /= 2;
|
||||||
f /= 2;
|
f /= 2;
|
||||||
|
@ -892,7 +927,7 @@ static inline void M_print(INT64 a)
|
||||||
|
|
||||||
FUNCMATH FUNCINLINE static inline fixed_t FixedMulC(fixed_t a, fixed_t b)
|
FUNCMATH FUNCINLINE static inline fixed_t FixedMulC(fixed_t a, fixed_t b)
|
||||||
{
|
{
|
||||||
return (fixed_t)((((INT64)a * b) ) / FRACUNIT);
|
return (fixed_t)((((INT64)a * b)) / FRACUNIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
FUNCMATH FUNCINLINE static inline fixed_t FixedDivC2(fixed_t a, fixed_t b)
|
FUNCMATH FUNCINLINE static inline fixed_t FixedDivC2(fixed_t a, fixed_t b)
|
||||||
|
@ -902,7 +937,7 @@ FUNCMATH FUNCINLINE static inline fixed_t FixedDivC2(fixed_t a, fixed_t b)
|
||||||
if (b == 0)
|
if (b == 0)
|
||||||
I_Error("FixedDiv: divide by zero");
|
I_Error("FixedDiv: divide by zero");
|
||||||
|
|
||||||
ret = (((INT64)a * FRACUNIT) ) / b;
|
ret = (((INT64)a * FRACUNIT)) / b;
|
||||||
|
|
||||||
if ((ret > INT32_MAX) || (ret < INT32_MIN))
|
if ((ret > INT32_MAX) || (ret < INT32_MIN))
|
||||||
I_Error("FixedDiv: divide by zero");
|
I_Error("FixedDiv: divide by zero");
|
||||||
|
@ -911,7 +946,7 @@ FUNCMATH FUNCINLINE static inline fixed_t FixedDivC2(fixed_t a, fixed_t b)
|
||||||
|
|
||||||
FUNCMATH FUNCINLINE static inline fixed_t FixedDivC(fixed_t a, fixed_t b)
|
FUNCMATH FUNCINLINE static inline fixed_t FixedDivC(fixed_t a, fixed_t b)
|
||||||
{
|
{
|
||||||
if ((abs(a) >> (FRACBITS-2)) >= abs(b))
|
if ((abs(a) >> (FRACBITS - 2)) >= abs(b))
|
||||||
return (a^b) < 0 ? INT32_MIN : INT32_MAX;
|
return (a^b) < 0 ? INT32_MIN : INT32_MAX;
|
||||||
|
|
||||||
return FixedDivC2(a, b);
|
return FixedDivC2(a, b);
|
||||||
|
@ -938,43 +973,43 @@ int main(int argc, char** argv)
|
||||||
|
|
||||||
#ifdef MULDIV_TEST
|
#ifdef MULDIV_TEST
|
||||||
for (a = 1; a <= INT32_MAX; a += FRACUNIT)
|
for (a = 1; a <= INT32_MAX; a += FRACUNIT)
|
||||||
for (b = 0; b <= INT32_MAX; b += FRACUNIT)
|
for (b = 0; b <= INT32_MAX; b += FRACUNIT)
|
||||||
{
|
|
||||||
c = FixedMul(a, b);
|
|
||||||
d = FixedMulC(a, b);
|
|
||||||
if (c != d)
|
|
||||||
{
|
{
|
||||||
printf("(");
|
c = FixedMul(a, b);
|
||||||
M_print(a);
|
d = FixedMulC(a, b);
|
||||||
printf(") * (");
|
if (c != d)
|
||||||
M_print(b);
|
{
|
||||||
printf(") = (");
|
printf("(");
|
||||||
M_print(c);
|
M_print(a);
|
||||||
printf(") != (");
|
printf(") * (");
|
||||||
M_print(d);
|
M_print(b);
|
||||||
printf(") \n");
|
printf(") = (");
|
||||||
n--;
|
M_print(c);
|
||||||
printf("%d != %d\n", c, d);
|
printf(") != (");
|
||||||
|
M_print(d);
|
||||||
|
printf(") \n");
|
||||||
|
n--;
|
||||||
|
printf("%d != %d\n", c, d);
|
||||||
|
}
|
||||||
|
c = FixedDiv(a, b);
|
||||||
|
d = FixedDivC(a, b);
|
||||||
|
if (c != d)
|
||||||
|
{
|
||||||
|
printf("(");
|
||||||
|
M_print(a);
|
||||||
|
printf(") / (");
|
||||||
|
M_print(b);
|
||||||
|
printf(") = (");
|
||||||
|
M_print(c);
|
||||||
|
printf(") != (");
|
||||||
|
M_print(d);
|
||||||
|
printf(")\n");
|
||||||
|
n--;
|
||||||
|
printf("%d != %d\n", c, d);
|
||||||
|
}
|
||||||
|
if (n <= 0)
|
||||||
|
exit(-1);
|
||||||
}
|
}
|
||||||
c = FixedDiv(a, b);
|
|
||||||
d = FixedDivC(a, b);
|
|
||||||
if (c != d)
|
|
||||||
{
|
|
||||||
printf("(");
|
|
||||||
M_print(a);
|
|
||||||
printf(") / (");
|
|
||||||
M_print(b);
|
|
||||||
printf(") = (");
|
|
||||||
M_print(c);
|
|
||||||
printf(") != (");
|
|
||||||
M_print(d);
|
|
||||||
printf(")\n");
|
|
||||||
n--;
|
|
||||||
printf("%d != %d\n", c, d);
|
|
||||||
}
|
|
||||||
if (n <= 0)
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SQRT_TEST
|
#ifdef SQRT_TEST
|
||||||
|
@ -982,7 +1017,7 @@ int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
c = FixedSqrt(a);
|
c = FixedSqrt(a);
|
||||||
d = FixedSqrtC(a);
|
d = FixedSqrtC(a);
|
||||||
b = abs(c-d);
|
b = abs(c - d);
|
||||||
if (b > 1)
|
if (b > 1)
|
||||||
{
|
{
|
||||||
printf("sqrt(");
|
printf("sqrt(");
|
||||||
|
|
|
@ -394,9 +394,11 @@ boolean FV3_Equal(const vector3_t *a_1, const vector3_t *a_2);
|
||||||
fixed_t FV3_Dot(const vector3_t *a_1, const vector3_t *a_2);
|
fixed_t FV3_Dot(const vector3_t *a_1, const vector3_t *a_2);
|
||||||
vector3_t *FV3_Cross(const vector3_t *a_1, const vector3_t *a_2, vector3_t *a_o);
|
vector3_t *FV3_Cross(const vector3_t *a_1, const vector3_t *a_2, vector3_t *a_o);
|
||||||
vector3_t *FV3_ClosestPointOnLine(const vector3_t *Line, const vector3_t *p, vector3_t *out);
|
vector3_t *FV3_ClosestPointOnLine(const vector3_t *Line, const vector3_t *p, vector3_t *out);
|
||||||
|
void FV3_ClosestPointOnVector(const vector3_t *dir, const vector3_t *p, vector3_t *out);
|
||||||
void FV3_ClosestPointOnTriangle(const vector3_t *tri, const vector3_t *point, vector3_t *result);
|
void FV3_ClosestPointOnTriangle(const vector3_t *tri, const vector3_t *point, vector3_t *result);
|
||||||
vector3_t *FV3_Point2Vec(const vector3_t *point1, const vector3_t *point2, vector3_t *a_o);
|
vector3_t *FV3_Point2Vec(const vector3_t *point1, const vector3_t *point2, vector3_t *a_o);
|
||||||
void FV3_Normal(const vector3_t *a_triangle, vector3_t *a_normal);
|
fixed_t FV3_Normal(const vector3_t *a_triangle, vector3_t *a_normal);
|
||||||
|
fixed_t FV3_Strength(const vector3_t *a_1, const vector3_t *dir);
|
||||||
fixed_t FV3_PlaneDistance(const vector3_t *a_normal, const vector3_t *a_point);
|
fixed_t FV3_PlaneDistance(const vector3_t *a_normal, const vector3_t *a_point);
|
||||||
boolean FV3_IntersectedPlane(const vector3_t *a_triangle, const vector3_t *a_line, vector3_t *a_normal, fixed_t *originDistance);
|
boolean FV3_IntersectedPlane(const vector3_t *a_triangle, const vector3_t *a_line, vector3_t *a_normal, fixed_t *originDistance);
|
||||||
fixed_t FV3_PlaneIntersection(const vector3_t *pOrigin, const vector3_t *pNormal, const vector3_t *rOrigin, const vector3_t *rVector);
|
fixed_t FV3_PlaneIntersection(const vector3_t *pOrigin, const vector3_t *pNormal, const vector3_t *rOrigin, const vector3_t *rVector);
|
||||||
|
|
|
@ -1300,7 +1300,7 @@ static menuitem_t OP_VideoOptionsMenu[] =
|
||||||
{IT_STRING | IT_CVAR, NULL, "Vertical Sync", &cv_vidwait, 90},
|
{IT_STRING | IT_CVAR, NULL, "Vertical Sync", &cv_vidwait, 90},
|
||||||
|
|
||||||
#ifdef HWRENDER
|
#ifdef HWRENDER
|
||||||
{IT_STRING | IT_CVAR, NULL, "3D models", &cv_grmd2, 105},
|
{IT_STRING | IT_CVAR, NULL, "3D models", &cv_grmdls, 105},
|
||||||
{IT_STRING | IT_CVAR, NULL, "Fallback Player 3D Model", &cv_grfallbackplayermodel, 115},
|
{IT_STRING | IT_CVAR, NULL, "Fallback Player 3D Model", &cv_grfallbackplayermodel, 115},
|
||||||
{IT_SUBMENU|IT_STRING, NULL, "OpenGL Options...", &OP_OpenGLOptionsDef, 125},
|
{IT_SUBMENU|IT_STRING, NULL, "OpenGL Options...", &OP_OpenGLOptionsDef, 125},
|
||||||
#endif
|
#endif
|
||||||
|
@ -2455,10 +2455,8 @@ static void M_ChangeCvar(INT32 choice)
|
||||||
choice *= (TICRATE/7);
|
choice *= (TICRATE/7);
|
||||||
else if (cv == &cv_maxsend)
|
else if (cv == &cv_maxsend)
|
||||||
choice *= 512;
|
choice *= 512;
|
||||||
#ifdef NEWPING
|
|
||||||
else if (cv == &cv_maxping)
|
else if (cv == &cv_maxping)
|
||||||
choice *= 50;
|
choice *= 50;
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
CV_AddValue(cv,choice);
|
CV_AddValue(cv,choice);
|
||||||
}
|
}
|
||||||
|
@ -2617,7 +2615,7 @@ boolean M_Responder(event_t *ev)
|
||||||
{
|
{
|
||||||
if (ev->type == ev_joystick && ev->data1 == 0 && joywait < I_GetTime())
|
if (ev->type == ev_joystick && ev->data1 == 0 && joywait < I_GetTime())
|
||||||
{
|
{
|
||||||
const INT32 jdeadzone = JOYAXISRANGE/4;
|
const INT32 jdeadzone = ((JOYAXISRANGE-1) * cv_deadzone.value) >> FRACBITS;
|
||||||
if (ev->data3 != INT32_MAX)
|
if (ev->data3 != INT32_MAX)
|
||||||
{
|
{
|
||||||
if (Joystick.bGamepadStyle || abs(ev->data3) > jdeadzone)
|
if (Joystick.bGamepadStyle || abs(ev->data3) > jdeadzone)
|
||||||
|
|
50
src/mserv.c
50
src/mserv.c
|
@ -661,11 +661,19 @@ FUNCMATH static const char *int2str(INT32 n)
|
||||||
#ifndef NONET
|
#ifndef NONET
|
||||||
static INT32 ConnectionFailed(void)
|
static INT32 ConnectionFailed(void)
|
||||||
{
|
{
|
||||||
|
time(&MSLastPing);
|
||||||
con_state = MSCS_FAILED;
|
con_state = MSCS_FAILED;
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("Connection to Master Server failed\n"));
|
CONS_Alert(CONS_ERROR, M_GetText("Connection to Master Server failed\n"));
|
||||||
CloseConnection();
|
CloseConnection();
|
||||||
return MS_CONNECT_ERROR;
|
return MS_CONNECT_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static INT32 ConnectionFailedwerrno(int no)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_ERROR, M_GetText("Master Server socket error: %s\n"),
|
||||||
|
strerror(no));
|
||||||
|
return ConnectionFailed();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** Tries to register the local game server on the master server.
|
/** Tries to register the local game server on the master server.
|
||||||
|
@ -682,44 +690,43 @@ static INT32 AddToMasterServer(boolean firstadd)
|
||||||
msg_server_t *info = (msg_server_t *)msg.buffer;
|
msg_server_t *info = (msg_server_t *)msg.buffer;
|
||||||
INT32 room = -1;
|
INT32 room = -1;
|
||||||
fd_set tset;
|
fd_set tset;
|
||||||
time_t timestamp = time(NULL);
|
|
||||||
UINT32 signature, tmp;
|
UINT32 signature, tmp;
|
||||||
const char *insname;
|
const char *insname;
|
||||||
|
|
||||||
|
if (socket_fd == (SOCKET_TYPE)ERRSOCKET)/* Woah, our socket was closed! */
|
||||||
|
{
|
||||||
|
if (MS_Connect(GetMasterServerIP(), GetMasterServerPort(), 0))
|
||||||
|
return ConnectionFailedwerrno(errno);
|
||||||
|
}
|
||||||
|
|
||||||
M_Memcpy(&tset, &wset, sizeof (tset));
|
M_Memcpy(&tset, &wset, sizeof (tset));
|
||||||
res = select(255, NULL, &tset, NULL, &select_timeout);
|
res = select(255, NULL, &tset, NULL, &select_timeout);
|
||||||
if (res != ERRSOCKET && !res)
|
if (res == ERRSOCKET)
|
||||||
|
return ConnectionFailedwerrno(errno);
|
||||||
|
if (res == 0)/* nothing selected */
|
||||||
{
|
{
|
||||||
if (retry++ > 30) // an about 30 second timeout
|
/*
|
||||||
|
Timeout next call because SendPingToMasterServer
|
||||||
|
(our calling function) already calls this once
|
||||||
|
every two minutes.
|
||||||
|
*/
|
||||||
|
if (retry++ == 1)
|
||||||
{
|
{
|
||||||
retry = 0;
|
retry = 0;
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("Master Server timed out\n"));
|
CONS_Alert(CONS_ERROR, M_GetText("Master Server timed out\n"));
|
||||||
MSLastPing = timestamp;
|
|
||||||
return ConnectionFailed();
|
return ConnectionFailed();
|
||||||
}
|
}
|
||||||
return MS_CONNECT_ERROR;
|
return MS_CONNECT_ERROR;
|
||||||
}
|
}
|
||||||
retry = 0;
|
retry = 0;
|
||||||
if (res == ERRSOCKET)
|
|
||||||
{
|
|
||||||
if (MS_Connect(GetMasterServerIP(), GetMasterServerPort(), 0))
|
|
||||||
{
|
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("Master Server socket error #%u: %s\n"), errno, strerror(errno));
|
|
||||||
MSLastPing = timestamp;
|
|
||||||
return ConnectionFailed();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// so, the socket is writable, but what does that mean, that the connection is
|
// so, the socket is writable, but what does that mean, that the connection is
|
||||||
// ok, or bad... let see that!
|
// ok, or bad... let see that!
|
||||||
j = (socklen_t)sizeof (i);
|
j = (socklen_t)sizeof (i);
|
||||||
getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, (char *)&i, &j);
|
if (getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, (char *)&i, &j) == ERRSOCKET)
|
||||||
|
return ConnectionFailedwerrno(errno);
|
||||||
if (i) // it was bad
|
if (i) // it was bad
|
||||||
{
|
return ConnectionFailedwerrno(i);
|
||||||
CONS_Alert(CONS_ERROR, M_GetText("Master Server socket error #%u: %s\n"), errno, strerror(errno));
|
|
||||||
MSLastPing = timestamp;
|
|
||||||
return ConnectionFailed();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef PARANOIA
|
#ifdef PARANOIA
|
||||||
if (ms_RoomId <= 0)
|
if (ms_RoomId <= 0)
|
||||||
|
@ -752,15 +759,12 @@ static INT32 AddToMasterServer(boolean firstadd)
|
||||||
msg.length = (UINT32)sizeof (msg_server_t);
|
msg.length = (UINT32)sizeof (msg_server_t);
|
||||||
msg.room = 0;
|
msg.room = 0;
|
||||||
if (MS_Write(&msg) < 0)
|
if (MS_Write(&msg) < 0)
|
||||||
{
|
|
||||||
MSLastPing = timestamp;
|
|
||||||
return ConnectionFailed();
|
return ConnectionFailed();
|
||||||
}
|
|
||||||
|
|
||||||
if(con_state != MSCS_REGISTERED)
|
if(con_state != MSCS_REGISTERED)
|
||||||
CONS_Printf(M_GetText("Master Server update successful.\n"));
|
CONS_Printf(M_GetText("Master Server update successful.\n"));
|
||||||
|
|
||||||
MSLastPing = timestamp;
|
time(&MSLastPing);
|
||||||
con_state = MSCS_REGISTERED;
|
con_state = MSCS_REGISTERED;
|
||||||
CloseConnection();
|
CloseConnection();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4781,8 +4781,8 @@ void A_DetonChase(mobj_t *actor)
|
||||||
actor->reactiontime = -42;
|
actor->reactiontime = -42;
|
||||||
|
|
||||||
exact = actor->movedir>>ANGLETOFINESHIFT;
|
exact = actor->movedir>>ANGLETOFINESHIFT;
|
||||||
xyspeed = FixedMul(FixedMul(actor->tracer->player->normalspeed,3*FRACUNIT/4), FINECOSINE(exact));
|
xyspeed = FixedMul(FixedMul(K_GetKartSpeed(actor->tracer->player, false),3*FRACUNIT/4), FINECOSINE(exact));
|
||||||
actor->momz = FixedMul(FixedMul(actor->tracer->player->normalspeed,3*FRACUNIT/4), FINESINE(exact));
|
actor->momz = FixedMul(FixedMul(K_GetKartSpeed(actor->tracer->player, false),3*FRACUNIT/4), FINESINE(exact));
|
||||||
|
|
||||||
exact = actor->angle>>ANGLETOFINESHIFT;
|
exact = actor->angle>>ANGLETOFINESHIFT;
|
||||||
actor->momx = FixedMul(xyspeed, FINECOSINE(exact));
|
actor->momx = FixedMul(xyspeed, FINECOSINE(exact));
|
||||||
|
|
|
@ -180,7 +180,6 @@ boolean P_LookForEnemies(player_t *player);
|
||||||
void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius);
|
void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius);
|
||||||
void P_HomingAttack(mobj_t *source, mobj_t *enemy); /// \todo doesn't belong in p_user
|
void P_HomingAttack(mobj_t *source, mobj_t *enemy); /// \todo doesn't belong in p_user
|
||||||
//boolean P_SuperReady(player_t *player);
|
//boolean P_SuperReady(player_t *player);
|
||||||
void P_DoJump(player_t *player, boolean soundandstate);
|
|
||||||
boolean P_AnalogMove(player_t *player);
|
boolean P_AnalogMove(player_t *player);
|
||||||
/*boolean P_TransferToNextMare(player_t *player);
|
/*boolean P_TransferToNextMare(player_t *player);
|
||||||
UINT8 P_FindLowestMare(void);*/
|
UINT8 P_FindLowestMare(void);*/
|
||||||
|
@ -189,8 +188,6 @@ UINT8 P_FindHighestLap(void);
|
||||||
void P_FindEmerald(void);
|
void P_FindEmerald(void);
|
||||||
//void P_TransferToAxis(player_t *player, INT32 axisnum);
|
//void P_TransferToAxis(player_t *player, INT32 axisnum);
|
||||||
boolean P_PlayerMoving(INT32 pnum);
|
boolean P_PlayerMoving(INT32 pnum);
|
||||||
void P_SpawnThokMobj(player_t *player);
|
|
||||||
void P_SpawnSpinMobj(player_t *player, mobjtype_t type);
|
|
||||||
void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range);
|
void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range);
|
||||||
|
|
||||||
void P_PlayLivesJingle(player_t *player);
|
void P_PlayLivesJingle(player_t *player);
|
||||||
|
|
|
@ -1908,7 +1908,7 @@ void P_XYMovement(mobj_t *mo)
|
||||||
if (mo->type == MT_ORBINAUT || mo->type == MT_JAWZ_DUD || mo->type == MT_JAWZ || mo->type == MT_BALLHOG) //(mo->type == MT_JAWZ && !mo->tracer))
|
if (mo->type == MT_ORBINAUT || mo->type == MT_JAWZ_DUD || mo->type == MT_JAWZ || mo->type == MT_BALLHOG) //(mo->type == MT_JAWZ && !mo->tracer))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (mo->player && (mo->player->kartstuff[k_spinouttimer] && !mo->player->kartstuff[k_wipeoutslow]) && mo->player->speed <= mo->player->normalspeed/2)
|
if (mo->player && (mo->player->kartstuff[k_spinouttimer] && !mo->player->kartstuff[k_wipeoutslow]) && mo->player->speed <= K_GetKartSpeed(mo->player, false)/2)
|
||||||
return;
|
return;
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
|
|
@ -265,25 +265,11 @@ static void P_NetArchivePlayers(void)
|
||||||
if (flags & AWAYVIEW)
|
if (flags & AWAYVIEW)
|
||||||
WRITEUINT32(save_p, players[i].awayviewmobj->mobjnum);
|
WRITEUINT32(save_p, players[i].awayviewmobj->mobjnum);
|
||||||
|
|
||||||
WRITEUINT8(save_p, players[i].charability);
|
|
||||||
WRITEUINT8(save_p, players[i].charability2);
|
|
||||||
WRITEUINT32(save_p, players[i].charflags);
|
WRITEUINT32(save_p, players[i].charflags);
|
||||||
WRITEUINT32(save_p, (UINT32)players[i].thokitem);
|
|
||||||
WRITEUINT32(save_p, (UINT32)players[i].spinitem);
|
|
||||||
WRITEUINT32(save_p, (UINT32)players[i].revitem);
|
|
||||||
WRITEFIXED(save_p, players[i].actionspd);
|
|
||||||
WRITEFIXED(save_p, players[i].mindash);
|
|
||||||
WRITEFIXED(save_p, players[i].maxdash);
|
|
||||||
// SRB2kart
|
// SRB2kart
|
||||||
WRITEUINT8(save_p, players[i].kartspeed);
|
WRITEUINT8(save_p, players[i].kartspeed);
|
||||||
WRITEUINT8(save_p, players[i].kartweight);
|
WRITEUINT8(save_p, players[i].kartweight);
|
||||||
//
|
//
|
||||||
WRITEFIXED(save_p, players[i].normalspeed);
|
|
||||||
WRITEFIXED(save_p, players[i].runspeed);
|
|
||||||
WRITEUINT8(save_p, players[i].thrustfactor);
|
|
||||||
WRITEUINT8(save_p, players[i].accelstart);
|
|
||||||
WRITEUINT8(save_p, players[i].acceleration);
|
|
||||||
WRITEFIXED(save_p, players[i].jumpfactor);
|
|
||||||
|
|
||||||
for (j = 0; j < MAXPREDICTTICS; j++)
|
for (j = 0; j < MAXPREDICTTICS; j++)
|
||||||
{
|
{
|
||||||
|
@ -447,25 +433,11 @@ static void P_NetUnArchivePlayers(void)
|
||||||
players[i].viewheight = 32<<FRACBITS;
|
players[i].viewheight = 32<<FRACBITS;
|
||||||
|
|
||||||
//SetPlayerSkinByNum(i, players[i].skin);
|
//SetPlayerSkinByNum(i, players[i].skin);
|
||||||
players[i].charability = READUINT8(save_p);
|
|
||||||
players[i].charability2 = READUINT8(save_p);
|
|
||||||
players[i].charflags = READUINT32(save_p);
|
players[i].charflags = READUINT32(save_p);
|
||||||
players[i].thokitem = (mobjtype_t)READUINT32(save_p);
|
|
||||||
players[i].spinitem = (mobjtype_t)READUINT32(save_p);
|
|
||||||
players[i].revitem = (mobjtype_t)READUINT32(save_p);
|
|
||||||
players[i].actionspd = READFIXED(save_p);
|
|
||||||
players[i].mindash = READFIXED(save_p);
|
|
||||||
players[i].maxdash = READFIXED(save_p);
|
|
||||||
// SRB2kart
|
// SRB2kart
|
||||||
players[i].kartspeed = READUINT8(save_p);
|
players[i].kartspeed = READUINT8(save_p);
|
||||||
players[i].kartweight = READUINT8(save_p);
|
players[i].kartweight = READUINT8(save_p);
|
||||||
//
|
//
|
||||||
players[i].normalspeed = READFIXED(save_p);
|
|
||||||
players[i].runspeed = READFIXED(save_p);
|
|
||||||
players[i].thrustfactor = READUINT8(save_p);
|
|
||||||
players[i].accelstart = READUINT8(save_p);
|
|
||||||
players[i].acceleration = READUINT8(save_p);
|
|
||||||
players[i].jumpfactor = READFIXED(save_p);
|
|
||||||
|
|
||||||
for (j = 0; j < MAXPREDICTTICS; j++)
|
for (j = 0; j < MAXPREDICTTICS; j++)
|
||||||
{
|
{
|
||||||
|
|
661
src/p_user.c
661
src/p_user.c
|
@ -1685,113 +1685,6 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj)
|
||||||
return ghost;
|
return ghost;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// P_SpawnThokMobj
|
|
||||||
//
|
|
||||||
// Spawns the appropriate thok object on the player
|
|
||||||
//
|
|
||||||
void P_SpawnThokMobj(player_t *player)
|
|
||||||
{
|
|
||||||
mobj_t *mobj;
|
|
||||||
mobjtype_t type = player->thokitem;
|
|
||||||
fixed_t zheight;
|
|
||||||
|
|
||||||
if (player->skincolor == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (player->spectator)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (type == MT_GHOST)
|
|
||||||
mobj = P_SpawnGhostMobj(player->mo); // virtually does everything here for us
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
|
||||||
zheight = player->mo->z + player->mo->height + FixedDiv(P_GetPlayerHeight(player) - player->mo->height, 3*FRACUNIT) - FixedMul(mobjinfo[type].height, player->mo->scale);
|
|
||||||
else
|
|
||||||
zheight = player->mo->z - FixedDiv(P_GetPlayerHeight(player) - player->mo->height, 3*FRACUNIT);
|
|
||||||
|
|
||||||
if (!(player->mo->eflags & MFE_VERTICALFLIP) && zheight < player->mo->floorz && !(mobjinfo[type].flags & MF_NOCLIPHEIGHT))
|
|
||||||
zheight = player->mo->floorz;
|
|
||||||
else if (player->mo->eflags & MFE_VERTICALFLIP && zheight + FixedMul(mobjinfo[type].height, player->mo->scale) > player->mo->ceilingz && !(mobjinfo[type].flags & MF_NOCLIPHEIGHT))
|
|
||||||
zheight = player->mo->ceilingz - FixedMul(mobjinfo[type].height, player->mo->scale);
|
|
||||||
|
|
||||||
mobj = P_SpawnMobj(player->mo->x, player->mo->y, zheight, type);
|
|
||||||
|
|
||||||
// set to player's angle, just in case
|
|
||||||
mobj->angle = player->mo->angle;
|
|
||||||
|
|
||||||
// color and skin
|
|
||||||
mobj->color = player->mo->color;
|
|
||||||
mobj->skin = player->mo->skin;
|
|
||||||
|
|
||||||
// vertical flip
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
|
||||||
mobj->flags2 |= MF2_OBJECTFLIP;
|
|
||||||
mobj->eflags |= (player->mo->eflags & MFE_VERTICALFLIP);
|
|
||||||
|
|
||||||
// scale
|
|
||||||
P_SetScale(mobj, player->mo->scale);
|
|
||||||
mobj->destscale = player->mo->scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
P_SetTarget(&mobj->target, player->mo); // the one thing P_SpawnGhostMobj doesn't do
|
|
||||||
if (demo.recording)
|
|
||||||
G_GhostAddThok((INT32) (player - players));
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// P_SpawnSpinMobj
|
|
||||||
//
|
|
||||||
// Spawns the appropriate spin object on the player
|
|
||||||
//
|
|
||||||
void P_SpawnSpinMobj(player_t *player, mobjtype_t type)
|
|
||||||
{
|
|
||||||
mobj_t *mobj;
|
|
||||||
fixed_t zheight;
|
|
||||||
|
|
||||||
if (player->skincolor == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (player->spectator)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (type == MT_GHOST)
|
|
||||||
mobj = P_SpawnGhostMobj(player->mo); // virtually does everything here for us
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
|
||||||
zheight = player->mo->z + player->mo->height + FixedDiv(P_GetPlayerHeight(player) - player->mo->height, 3*FRACUNIT) - FixedMul(mobjinfo[type].height, player->mo->scale);
|
|
||||||
else
|
|
||||||
zheight = player->mo->z - FixedDiv(P_GetPlayerHeight(player) - player->mo->height, 3*FRACUNIT);
|
|
||||||
|
|
||||||
if (!(player->mo->eflags & MFE_VERTICALFLIP) && zheight < player->mo->floorz && !(mobjinfo[type].flags & MF_NOCLIPHEIGHT))
|
|
||||||
zheight = player->mo->floorz;
|
|
||||||
else if (player->mo->eflags & MFE_VERTICALFLIP && zheight + FixedMul(mobjinfo[type].height, player->mo->scale) > player->mo->ceilingz && !(mobjinfo[type].flags & MF_NOCLIPHEIGHT))
|
|
||||||
zheight = player->mo->ceilingz - FixedMul(mobjinfo[type].height, player->mo->scale);
|
|
||||||
|
|
||||||
mobj = P_SpawnMobj(player->mo->x, player->mo->y, zheight, type);
|
|
||||||
|
|
||||||
// set to player's angle, just in case
|
|
||||||
mobj->angle = player->mo->angle;
|
|
||||||
|
|
||||||
// color and skin
|
|
||||||
mobj->color = player->mo->color;
|
|
||||||
mobj->skin = player->mo->skin;
|
|
||||||
|
|
||||||
// vertical flip
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
|
||||||
mobj->flags2 |= MF2_OBJECTFLIP;
|
|
||||||
mobj->eflags |= (player->mo->eflags & MFE_VERTICALFLIP);
|
|
||||||
|
|
||||||
// scale
|
|
||||||
P_SetScale(mobj, player->mo->scale);
|
|
||||||
mobj->destscale = player->mo->scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
P_SetTarget(&mobj->target, player->mo); // the one thing P_SpawnGhostMobj doesn't do
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_DoPlayerExit
|
// P_DoPlayerExit
|
||||||
//
|
//
|
||||||
|
@ -1991,13 +1884,13 @@ static void P_CheckBustableBlocks(player_t *player)
|
||||||
// ...or are drilling in NiGHTS (or Metal Sonic)
|
// ...or are drilling in NiGHTS (or Metal Sonic)
|
||||||
if (!(rover->flags & FF_SHATTER) && !(rover->flags & FF_SPINBUST)
|
if (!(rover->flags & FF_SHATTER) && !(rover->flags & FF_SPINBUST)
|
||||||
&& !((player->pflags & PF_SPINNING) && !(player->pflags & PF_JUMPED))
|
&& !((player->pflags & PF_SPINNING) && !(player->pflags & PF_JUMPED))
|
||||||
&& (player->charability != CA_GLIDEANDCLIMB && !player->powers[pw_super])
|
&& (/*player->charability != CA_GLIDEANDCLIMB &&*/ !player->powers[pw_super])
|
||||||
&& !(player->pflags & PF_DRILLING) && !metalrecording)
|
&& !(player->pflags & PF_DRILLING) && !metalrecording)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Only Knuckles can break this rock...
|
// Only Knuckles can break this rock...
|
||||||
if (!(rover->flags & FF_SHATTER) && (rover->flags & FF_ONLYKNUX) && !(player->charability == CA_GLIDEANDCLIMB))
|
/*if (!(rover->flags & FF_SHATTER) && (rover->flags & FF_ONLYKNUX) && !(player->charability == CA_GLIDEANDCLIMB))
|
||||||
continue;
|
continue;*/
|
||||||
|
|
||||||
topheight = P_GetFOFTopZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL);
|
topheight = P_GetFOFTopZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL);
|
||||||
bottomheight = P_GetFOFBottomZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL);
|
bottomheight = P_GetFOFBottomZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL);
|
||||||
|
@ -2499,7 +2392,7 @@ static void P_DoBubbleBreath(player_t *player)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Tails stirs up the water while flying in it
|
// Tails stirs up the water while flying in it
|
||||||
if (player->powers[pw_tailsfly] && (leveltime & 1) && player->charability != CA_SWIM)
|
/*if (player->powers[pw_tailsfly] && (leveltime & 1) && player->charability != CA_SWIM)
|
||||||
{
|
{
|
||||||
fixed_t radius = (3*player->mo->radius)>>1;
|
fixed_t radius = (3*player->mo->radius)>>1;
|
||||||
angle_t fa = ((leveltime%45)*FINEANGLES/8) & FINEMASK;
|
angle_t fa = ((leveltime%45)*FINEANGLES/8) & FINEMASK;
|
||||||
|
@ -2525,7 +2418,7 @@ static void P_DoBubbleBreath(player_t *player)
|
||||||
stirwaterz, MT_SMALLBUBBLE);
|
stirwaterz, MT_SMALLBUBBLE);
|
||||||
bubble->destscale = player->mo->scale;
|
bubble->destscale = player->mo->scale;
|
||||||
P_SetScale(bubble,bubble->destscale);
|
P_SetScale(bubble,bubble->destscale);
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -3664,195 +3557,6 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd) // SRB2kart - unused.
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//
|
|
||||||
// P_DoJump
|
|
||||||
//
|
|
||||||
// Jump routine for the player
|
|
||||||
//
|
|
||||||
void P_DoJump(player_t *player, boolean soundandstate)
|
|
||||||
{
|
|
||||||
fixed_t factor;
|
|
||||||
const fixed_t dist6 = FixedMul(FixedDiv(player->speed, player->mo->scale), player->actionspd)/20;
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (player->pflags & PF_JUMPSTASIS)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!player->jumpfactor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (player->kartstuff[k_spinouttimer]) // SRB2kart
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* // SRB2kart - climbing in a kart?
|
|
||||||
if (player->climbing)
|
|
||||||
{
|
|
||||||
// Jump this high.
|
|
||||||
if (player->powers[pw_super])
|
|
||||||
player->mo->momz = 5*FRACUNIT;
|
|
||||||
else if (player->mo->eflags & MFE_UNDERWATER)
|
|
||||||
player->mo->momz = 2*FRACUNIT;
|
|
||||||
else
|
|
||||||
player->mo->momz = 15*(FRACUNIT/4);
|
|
||||||
|
|
||||||
player->mo->angle = player->mo->angle - ANGLE_180; // Turn around from the wall you were climbing.
|
|
||||||
|
|
||||||
if (player == &players[consoleplayer])
|
|
||||||
localangle[0] = player->mo->angle; // Adjust the local control angle.
|
|
||||||
else if (player == &players[displayplayers[1]])
|
|
||||||
localangle[1] = player->mo->angle;
|
|
||||||
else if (player == &players[displayplayers[2]])
|
|
||||||
localangle[2] = player->mo->angle;
|
|
||||||
else if (player == &players[displayplayers[3]])
|
|
||||||
localangle[3] = player->mo->angle;
|
|
||||||
|
|
||||||
player->climbing = 0; // Stop climbing, duh!
|
|
||||||
P_InstaThrust(player->mo, player->mo->angle, FixedMul(6*FRACUNIT, player->mo->scale)); // Jump off the wall.
|
|
||||||
}
|
|
||||||
// Quicksand jumping.
|
|
||||||
else if (P_InQuicksand(player->mo))
|
|
||||||
{
|
|
||||||
if (player->mo->ceilingz-player->mo->floorz <= player->mo->height-1)
|
|
||||||
return;
|
|
||||||
player->mo->momz += (39*(FRACUNIT/4))>>1;
|
|
||||||
if (player->mo->momz >= 6*FRACUNIT)
|
|
||||||
player->mo->momz = 6*FRACUNIT; //max momz in quicksand
|
|
||||||
else if (player->mo->momz < 0) // still descending?
|
|
||||||
player->mo->momz = (39*(FRACUNIT/4))>>1; // just default to the jump height.
|
|
||||||
}
|
|
||||||
else*/ if (!(player->pflags & PF_JUMPED)) // Spin Attack
|
|
||||||
{
|
|
||||||
if (player->mo->ceilingz-player->mo->floorz <= player->mo->height-1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Jump this high.
|
|
||||||
if (player->pflags & PF_CARRIED)
|
|
||||||
{
|
|
||||||
player->mo->momz = 9*FRACUNIT;
|
|
||||||
player->pflags &= ~PF_CARRIED;
|
|
||||||
/*if (player-players == consoleplayer && botingame)
|
|
||||||
CV_SetValue(&cv_analog2, true);*/
|
|
||||||
}
|
|
||||||
else if (player->pflags & PF_ITEMHANG)
|
|
||||||
{
|
|
||||||
player->mo->momz = 9*FRACUNIT;
|
|
||||||
player->pflags &= ~PF_ITEMHANG;
|
|
||||||
}
|
|
||||||
else if (player->pflags & PF_ROPEHANG)
|
|
||||||
{
|
|
||||||
player->mo->momz = 12*FRACUNIT;
|
|
||||||
player->pflags &= ~PF_ROPEHANG;
|
|
||||||
P_SetTarget(&player->mo->tracer, NULL);
|
|
||||||
}
|
|
||||||
else if (player->mo->eflags & MFE_GOOWATER)
|
|
||||||
{
|
|
||||||
player->mo->momz = 7*FRACUNIT;
|
|
||||||
if (player->charability == CA_JUMPBOOST && onground)
|
|
||||||
{
|
|
||||||
if (player->charability2 == CA2_MULTIABILITY)
|
|
||||||
player->mo->momz += FixedMul(FRACUNIT/4, dist6);
|
|
||||||
else
|
|
||||||
player->mo->momz += FixedMul(FRACUNIT/8, dist6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (maptol & TOL_NIGHTS)
|
|
||||||
player->mo->momz = 24*FRACUNIT;
|
|
||||||
else
|
|
||||||
player->mo->momz = 3*FRACUNIT; // Kart jump momentum.
|
|
||||||
/* // SRB2kart - Okay enough of that.
|
|
||||||
else if (player->powers[pw_super])
|
|
||||||
{
|
|
||||||
if (player->charability == CA_FLOAT)
|
|
||||||
player->mo->momz = 28*FRACUNIT; //Obscene jump height anyone?
|
|
||||||
else if (player->charability == CA_SLOWFALL)
|
|
||||||
player->mo->momz = 37*(FRACUNIT/2); //Less obscene because during super, floating propells oneself upward.
|
|
||||||
else // Default super jump momentum.
|
|
||||||
player->mo->momz = 13*FRACUNIT;
|
|
||||||
|
|
||||||
// Add a boost for super characters with float/slowfall and multiability.
|
|
||||||
if (player->charability2 == CA2_MULTIABILITY &&
|
|
||||||
(player->charability == CA_FLOAT || player->charability == CA_SLOWFALL))
|
|
||||||
player->mo->momz += 2*FRACUNIT;
|
|
||||||
else if (player->charability == CA_JUMPBOOST)
|
|
||||||
{
|
|
||||||
if (player->charability2 == CA2_MULTIABILITY)
|
|
||||||
player->mo->momz += FixedMul(FRACUNIT/4, dist6);
|
|
||||||
else
|
|
||||||
player->mo->momz += FixedMul(FRACUNIT/8, dist6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (player->charability2 == CA2_MULTIABILITY &&
|
|
||||||
(player->charability == CA_DOUBLEJUMP || player->charability == CA_FLOAT || player->charability == CA_SLOWFALL))
|
|
||||||
{
|
|
||||||
// Multiability exceptions, since some abilities cannot effectively use it and need a boost.
|
|
||||||
if (player->charability == CA_DOUBLEJUMP)
|
|
||||||
player->mo->momz = 23*(FRACUNIT/2); // Increased jump height instead of infinite jumps.
|
|
||||||
else if (player->charability == CA_FLOAT || player->charability == CA_SLOWFALL)
|
|
||||||
player->mo->momz = 12*FRACUNIT; // Increased jump height due to ineffective repeat.
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
player->mo->momz = 39*(FRACUNIT/4); // Default jump momentum.
|
|
||||||
if (player->charability == CA_JUMPBOOST && onground)
|
|
||||||
{
|
|
||||||
if (player->charability2 == CA2_MULTIABILITY)
|
|
||||||
player->mo->momz += FixedMul(FRACUNIT/4, dist6);
|
|
||||||
else
|
|
||||||
player->mo->momz += FixedMul(FRACUNIT/8, dist6);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Reduce player momz by 58.5% when underwater.
|
|
||||||
if (player->mo->eflags & MFE_UNDERWATER)
|
|
||||||
player->mo->momz = FixedMul(player->mo->momz, FixedDiv(117*FRACUNIT, 200*FRACUNIT));
|
|
||||||
|
|
||||||
player->jumping = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
factor = player->jumpfactor;
|
|
||||||
|
|
||||||
if (twodlevel || (player->mo->flags2 & MF2_TWOD))
|
|
||||||
factor += player->jumpfactor / 10;
|
|
||||||
|
|
||||||
P_SetObjectMomZ(player->mo, FixedMul(factor, player->mo->momz), false); // Custom height
|
|
||||||
|
|
||||||
// set just an eensy above the ground
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP)
|
|
||||||
{
|
|
||||||
player->mo->z--;
|
|
||||||
if (player->mo->pmomz < 0)
|
|
||||||
player->mo->momz += player->mo->pmomz; // Add the platform's momentum to your jump.
|
|
||||||
else
|
|
||||||
player->mo->pmomz = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
player->mo->z++;
|
|
||||||
if (player->mo->pmomz > 0)
|
|
||||||
player->mo->momz += player->mo->pmomz; // Add the platform's momentum to your jump.
|
|
||||||
else
|
|
||||||
player->mo->pmomz = 0;
|
|
||||||
}
|
|
||||||
player->mo->eflags &= ~MFE_APPLYPMOMZ;
|
|
||||||
|
|
||||||
player->pflags |= PF_JUMPED;
|
|
||||||
|
|
||||||
if (soundandstate)
|
|
||||||
{
|
|
||||||
if (!player->spectator)
|
|
||||||
S_StartSound(player->mo, sfx_jump); // Play jump sound!
|
|
||||||
|
|
||||||
/* // SRB2kart - don't need jump frames
|
|
||||||
if (!(player->charability2 == CA2_SPINDASH))
|
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_SPRING);
|
|
||||||
else
|
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_ATK1);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_DoSpinDash
|
// P_DoSpinDash
|
||||||
//
|
//
|
||||||
|
@ -3976,7 +3680,7 @@ void P_DoJumpShield(player_t *player)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
player->pflags &= ~PF_JUMPED;
|
player->pflags &= ~PF_JUMPED;
|
||||||
P_DoJump(player, false);
|
//P_DoJump(player, false);
|
||||||
player->pflags &= ~PF_JUMPED;
|
player->pflags &= ~PF_JUMPED;
|
||||||
player->secondjump = 0;
|
player->secondjump = 0;
|
||||||
player->jumping = 0;
|
player->jumping = 0;
|
||||||
|
@ -4034,338 +3738,10 @@ void P_Telekinesis(player_t *player, fixed_t thrust, fixed_t range)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
P_SpawnThokMobj(player);
|
//P_SpawnThokMobj(player);
|
||||||
player->pflags |= PF_THOKKED;
|
player->pflags |= PF_THOKKED;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// P_DoJumpStuff
|
|
||||||
//
|
|
||||||
// Handles player jumping
|
|
||||||
//
|
|
||||||
static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
|
|
||||||
{
|
|
||||||
if (player->pflags & PF_JUMPSTASIS)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (cmd->buttons & BT_BRAKE && !(player->pflags & PF_JUMPDOWN) && !player->exiting && !P_PlayerInPain(player))
|
|
||||||
{
|
|
||||||
if (onground || player->climbing || player->pflags & (PF_CARRIED|PF_ITEMHANG|PF_ROPEHANG))
|
|
||||||
{}
|
|
||||||
else if (player->pflags & PF_MACESPIN && player->mo->tracer)
|
|
||||||
{}
|
|
||||||
else if (!(player->pflags & PF_SLIDING) && ((gametype != GT_CTF) || (!player->gotflag)))
|
|
||||||
{
|
|
||||||
#ifdef HAVE_BLUA
|
|
||||||
if (!LUAh_JumpSpinSpecial(player))
|
|
||||||
#endif
|
|
||||||
switch (player->charability)
|
|
||||||
{
|
|
||||||
case CA_TELEKINESIS:
|
|
||||||
if (player->pflags & PF_JUMPED)
|
|
||||||
{
|
|
||||||
if (!(player->pflags & PF_THOKKED) || (player->charability2 == CA2_MULTIABILITY))
|
|
||||||
{
|
|
||||||
P_Telekinesis(player,
|
|
||||||
-FixedMul(player->actionspd, player->mo->scale), // -ve thrust (pulling towards player)
|
|
||||||
FixedMul(384*FRACUNIT, player->mo->scale));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case CA_AIRDRILL:
|
|
||||||
if (player->pflags & PF_JUMPED)
|
|
||||||
{
|
|
||||||
if (player->pflags & PF_THOKKED) // speed up falling down
|
|
||||||
{
|
|
||||||
if (player->secondjump < 42)
|
|
||||||
player->secondjump ++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player->charability == CA_AIRDRILL)
|
|
||||||
{
|
|
||||||
if (player->pflags & PF_JUMPED)
|
|
||||||
{
|
|
||||||
if (player->flyangle > 0 && player->pflags & PF_THOKKED)
|
|
||||||
{
|
|
||||||
player->flyangle--;
|
|
||||||
|
|
||||||
P_SetObjectMomZ(player->mo, ((player->flyangle-24 - player->secondjump*3)*((player->actionspd>>FRACBITS)/12 + 1)<<FRACBITS)/7, false);
|
|
||||||
|
|
||||||
P_SpawnThokMobj(player);
|
|
||||||
|
|
||||||
if ((player->mo->eflags & MFE_UNDERWATER))
|
|
||||||
P_InstaThrust(player->mo, player->mo->angle, FixedMul(player->normalspeed, player->mo->scale)*(80-player->flyangle - (player->actionspd>>FRACBITS)/2)/80);
|
|
||||||
else
|
|
||||||
P_InstaThrust(player->mo, player->mo->angle, ((FixedMul(player->normalspeed - player->actionspd/4, player->mo->scale))*2)/3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd->buttons & BT_DRIFT && !player->exiting && !P_PlayerInPain(player))
|
|
||||||
{
|
|
||||||
#ifdef HAVE_BLUA
|
|
||||||
if (LUAh_JumpSpecial(player))
|
|
||||||
;
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
if (player->pflags & PF_JUMPDOWN) // all situations below this require jump button not to be pressed already
|
|
||||||
;
|
|
||||||
else
|
|
||||||
// Jump S3&K style while in quicksand.
|
|
||||||
if (P_InQuicksand(player->mo))
|
|
||||||
{
|
|
||||||
P_DoJump(player, true);
|
|
||||||
player->secondjump = 0;
|
|
||||||
player->pflags &= ~PF_THOKKED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
// can't jump while in air, can't jump while jumping
|
|
||||||
if (onground || player->climbing || player->pflags & (PF_CARRIED|PF_ITEMHANG|PF_ROPEHANG))
|
|
||||||
{
|
|
||||||
P_DoJump(player, true);
|
|
||||||
player->secondjump = 0;
|
|
||||||
player->pflags &= ~PF_THOKKED;
|
|
||||||
}
|
|
||||||
/* // SRB2kart - no jumpy power things
|
|
||||||
else if (player->pflags & PF_MACESPIN && player->mo->tracer)
|
|
||||||
{
|
|
||||||
player->pflags &= ~PF_MACESPIN;
|
|
||||||
player->powers[pw_flashing] = TICRATE/4;
|
|
||||||
}
|
|
||||||
else if (player->pflags & PF_SLIDING || (gametype == GT_CTF && player->gotflag))
|
|
||||||
;
|
|
||||||
else if (P_SuperReady(player))
|
|
||||||
{
|
|
||||||
// If you can turn super and aren't already,
|
|
||||||
// and you don't have a shield, do it!
|
|
||||||
P_DoSuperTransformation(player, false);
|
|
||||||
}
|
|
||||||
else if (player->pflags & PF_JUMPED)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_BLUA
|
|
||||||
if (!LUAh_AbilitySpecial(player))
|
|
||||||
#endif
|
|
||||||
switch (player->charability)
|
|
||||||
{
|
|
||||||
case CA_THOK:
|
|
||||||
case CA_HOMINGTHOK:
|
|
||||||
case CA_JUMPTHOK: // Credit goes to CZ64 and Sryder13 for the original
|
|
||||||
// Now it's Sonic's abilities turn!
|
|
||||||
// THOK!
|
|
||||||
if (!(player->pflags & PF_THOKKED) || (player->charability2 == CA2_MULTIABILITY))
|
|
||||||
{
|
|
||||||
// Catapult the player
|
|
||||||
fixed_t actionspd = player->actionspd;
|
|
||||||
if (player->mo->eflags & MFE_UNDERWATER)
|
|
||||||
actionspd >>= 1;
|
|
||||||
if ((player->charability == CA_JUMPTHOK) && !(player->pflags & PF_THOKKED))
|
|
||||||
{
|
|
||||||
player->pflags &= ~PF_JUMPED;
|
|
||||||
P_DoJump(player, false);
|
|
||||||
}
|
|
||||||
P_InstaThrust(player->mo, player->mo->angle, FixedMul(actionspd, player->mo->scale));
|
|
||||||
|
|
||||||
if (maptol & TOL_2D)
|
|
||||||
{
|
|
||||||
player->mo->momx /= 2;
|
|
||||||
player->mo->momy /= 2;
|
|
||||||
}
|
|
||||||
else if (player->charability == CA_HOMINGTHOK)
|
|
||||||
{
|
|
||||||
player->mo->momx /= 3;
|
|
||||||
player->mo->momy /= 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (player->mo->info->attacksound && !player->spectator)
|
|
||||||
S_StartSound(player->mo, player->mo->info->attacksound); // Play the THOK sound
|
|
||||||
|
|
||||||
P_SpawnThokMobj(player);
|
|
||||||
|
|
||||||
if (player->charability == CA_HOMINGTHOK && !player->homing)
|
|
||||||
{
|
|
||||||
if (P_LookForEnemies(player))
|
|
||||||
{
|
|
||||||
if (player->mo->tracer)
|
|
||||||
player->homing = 3*TICRATE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
player->pflags &= ~(PF_SPINNING|PF_STARTDASH);
|
|
||||||
player->pflags |= PF_THOKKED;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CA_FLY:
|
|
||||||
case CA_SWIM: // Swim
|
|
||||||
// If currently in the air from a jump, and you pressed the
|
|
||||||
// button again and have the ability to fly, do so!
|
|
||||||
if (player->charability == CA_SWIM && !(player->mo->eflags & MFE_UNDERWATER))
|
|
||||||
; // Can't do anything if you're a fish out of water!
|
|
||||||
else if (!(player->pflags & PF_THOKKED) && !(player->powers[pw_tailsfly]))
|
|
||||||
{
|
|
||||||
//P_SetPlayerMobjState(player->mo, S_PLAY_ABL1); // Change to the flying animation
|
|
||||||
|
|
||||||
player->powers[pw_tailsfly] = tailsflytics + 1; // Set the fly timer
|
|
||||||
|
|
||||||
player->pflags &= ~(PF_JUMPED|PF_SPINNING|PF_STARTDASH);
|
|
||||||
player->pflags |= PF_THOKKED;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case CA_GLIDEANDCLIMB:
|
|
||||||
// Now Knuckles-type abilities are checked.
|
|
||||||
// If you can turn super and aren't already,
|
|
||||||
// and you don't have a shield, do it!
|
|
||||||
if (!(player->pflags & PF_THOKKED) || player->charability2 == CA2_MULTIABILITY)
|
|
||||||
{
|
|
||||||
INT32 glidespeed = player->actionspd;
|
|
||||||
|
|
||||||
player->pflags |= PF_GLIDING|PF_THOKKED;
|
|
||||||
player->glidetime = 0;
|
|
||||||
|
|
||||||
if (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))
|
|
||||||
{
|
|
||||||
// Glide at double speed while super.
|
|
||||||
glidespeed *= 2;
|
|
||||||
player->pflags &= ~PF_THOKKED;
|
|
||||||
}
|
|
||||||
|
|
||||||
//P_SetPlayerMobjState(player->mo, S_PLAY_ABL1);
|
|
||||||
P_InstaThrust(player->mo, player->mo->angle, FixedMul(glidespeed, player->mo->scale));
|
|
||||||
player->pflags &= ~(PF_SPINNING|PF_STARTDASH);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case CA_DOUBLEJUMP: // Double-Jump
|
|
||||||
if (!(player->pflags & PF_THOKKED))
|
|
||||||
{
|
|
||||||
player->pflags &= ~PF_JUMPED;
|
|
||||||
P_DoJump(player, true);
|
|
||||||
|
|
||||||
// Allow infinite double jumping if super.
|
|
||||||
if (!player->powers[pw_super])
|
|
||||||
player->pflags |= PF_THOKKED;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case CA_FLOAT: // Float
|
|
||||||
case CA_SLOWFALL: // Slow descent hover
|
|
||||||
if (!player->secondjump)
|
|
||||||
player->secondjump = 1;
|
|
||||||
break;
|
|
||||||
case CA_TELEKINESIS:
|
|
||||||
if (!(player->pflags & PF_THOKKED) || player->charability2 == CA2_MULTIABILITY)
|
|
||||||
{
|
|
||||||
P_Telekinesis(player,
|
|
||||||
FixedMul(player->actionspd, player->mo->scale), // +ve thrust (pushing away from player)
|
|
||||||
FixedMul(384*FRACUNIT, player->mo->scale));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case CA_FALLSWITCH:
|
|
||||||
if (!(player->pflags & PF_THOKKED) || player->charability2 == CA2_MULTIABILITY)
|
|
||||||
{
|
|
||||||
player->mo->momz = -player->mo->momz;
|
|
||||||
P_SpawnThokMobj(player);
|
|
||||||
player->pflags |= PF_THOKKED;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CA_AIRDRILL:
|
|
||||||
if (!(player->pflags & PF_THOKKED) || player->charability2 == CA2_MULTIABILITY)
|
|
||||||
{
|
|
||||||
player->flyangle = 56 + (60-(player->actionspd>>FRACBITS))/3;
|
|
||||||
player->pflags |= PF_THOKKED;
|
|
||||||
S_StartSound(player->mo, sfx_spndsh);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (player->pflags & PF_THOKKED)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_BLUA
|
|
||||||
if (!LUAh_AbilitySpecial(player))
|
|
||||||
#endif
|
|
||||||
switch (player->charability)
|
|
||||||
{
|
|
||||||
case CA_FLY:
|
|
||||||
case CA_SWIM: // Swim
|
|
||||||
if (player->charability == CA_SWIM && !(player->mo->eflags & MFE_UNDERWATER))
|
|
||||||
; // Can't do anything if you're a fish out of water!
|
|
||||||
else if (player->powers[pw_tailsfly]) // If currently flying, give an ascend boost.
|
|
||||||
{
|
|
||||||
if (!player->fly1)
|
|
||||||
player->fly1 = 20;
|
|
||||||
else
|
|
||||||
player->fly1 = 2;
|
|
||||||
|
|
||||||
if (player->charability == CA_SWIM)
|
|
||||||
player->fly1 /= 2;
|
|
||||||
|
|
||||||
// Slow down!
|
|
||||||
if (player->speed > FixedMul(8*FRACUNIT, player->mo->scale) && player->speed > FixedMul(player->normalspeed>>1, player->mo->scale))
|
|
||||||
P_Thrust(player->mo, R_PointToAngle2(0,0,player->mo->momx,player->mo->momy), FixedMul(-4*FRACUNIT, player->mo->scale));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((player->powers[pw_shield] & SH_NOSTACK) == SH_JUMP && !player->powers[pw_super])
|
|
||||||
P_DoJumpShield(player);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd->buttons & BT_DRIFT)
|
|
||||||
{
|
|
||||||
player->pflags |= PF_JUMPDOWN;
|
|
||||||
|
|
||||||
if ((gametype != GT_CTF || !player->gotflag) && !player->exiting)
|
|
||||||
{
|
|
||||||
if (player->secondjump == 1)
|
|
||||||
{
|
|
||||||
if (player->charability == CA_FLOAT)
|
|
||||||
player->mo->momz = 0;
|
|
||||||
else if (player->charability == CA_SLOWFALL)
|
|
||||||
{
|
|
||||||
if (player->powers[pw_super])
|
|
||||||
{
|
|
||||||
if (P_MobjFlip(player->mo)*player->mo->momz < gravity*16)
|
|
||||||
player->mo->momz = P_MobjFlip(player->mo)*gravity*16; //Float upward 4x as fast while super.
|
|
||||||
}
|
|
||||||
else if (P_MobjFlip(player->mo)*player->mo->momz < -gravity*4)
|
|
||||||
player->mo->momz = P_MobjFlip(player->mo)*-gravity*4;
|
|
||||||
}
|
|
||||||
player->pflags &= ~PF_SPINNING;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // If not pressing the jump button
|
|
||||||
{
|
|
||||||
player->pflags &= ~PF_JUMPDOWN;
|
|
||||||
|
|
||||||
// Repeat abilities, but not double jump!
|
|
||||||
if ((player->charability2 == CA2_MULTIABILITY && player->charability != CA_DOUBLEJUMP)
|
|
||||||
|| (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds])))
|
|
||||||
player->secondjump = 0;
|
|
||||||
else if (player->charability == CA_FLOAT && player->secondjump == 1)
|
|
||||||
player->secondjump = 2;
|
|
||||||
|
|
||||||
|
|
||||||
// If letting go of the jump button while still on ascent, cut the jump height.
|
|
||||||
if (player->pflags & PF_JUMPED && P_MobjFlip(player->mo)*player->mo->momz > 0 && player->jumping == 1)
|
|
||||||
{
|
|
||||||
player->mo->momz >>= 1;
|
|
||||||
player->jumping = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean P_AnalogMove(player_t *player)
|
boolean P_AnalogMove(player_t *player)
|
||||||
{
|
{
|
||||||
return player->pflags & PF_ANALOGMODE;
|
return player->pflags & PF_ANALOGMODE;
|
||||||
|
@ -6568,14 +5944,7 @@ static void P_MovePlayer(player_t *player)
|
||||||
P_SetPlayerMobjState(player->mo, S_KART_STND1); // SRB2kart - was S_PLAY_STND
|
P_SetPlayerMobjState(player->mo, S_KART_STND1); // SRB2kart - was S_PLAY_STND
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cap the speed limit on a spindash
|
if (/*!(player->charability == CA_GLIDEANDCLIMB) ||*/ player->gotflag) // If you can't glide, then why the heck would you be gliding?
|
||||||
// Up the 60*FRACUNIT number to boost faster, you speed demon you!
|
|
||||||
if (player->dashspeed > FixedMul(player->maxdash, player->mo->scale))
|
|
||||||
player->dashspeed = FixedMul(player->maxdash, player->mo->scale);
|
|
||||||
else if (player->dashspeed > 0 && player->dashspeed < FixedMul(player->mindash, player->mo->scale))
|
|
||||||
player->dashspeed = FixedMul(player->mindash, player->mo->scale);
|
|
||||||
|
|
||||||
if (!(player->charability == CA_GLIDEANDCLIMB) || player->gotflag) // If you can't glide, then why the heck would you be gliding?
|
|
||||||
{
|
{
|
||||||
/* // SRB2kart - ???
|
/* // SRB2kart - ???
|
||||||
if (player->pflags & PF_GLIDING || player->climbing)
|
if (player->pflags & PF_GLIDING || player->climbing)
|
||||||
|
@ -6828,7 +6197,7 @@ static void P_MovePlayer(player_t *player)
|
||||||
P_DoSpinDash(player, cmd);
|
P_DoSpinDash(player, cmd);
|
||||||
*/
|
*/
|
||||||
// jumping
|
// jumping
|
||||||
P_DoJumpStuff(player, cmd);
|
//P_DoJumpStuff(player, cmd);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// If you're not spinning, you'd better not be spindashing!
|
// If you're not spinning, you'd better not be spindashing!
|
||||||
|
@ -6884,7 +6253,7 @@ static void P_MovePlayer(player_t *player)
|
||||||
}
|
}
|
||||||
// Otherwise, face the direction you're travelling.
|
// Otherwise, face the direction you're travelling.
|
||||||
else if (player->panim == PA_WALK || player->panim == PA_RUN || player->panim == PA_ROLL
|
else if (player->panim == PA_WALK || player->panim == PA_RUN || player->panim == PA_ROLL
|
||||||
|| (/*(player->mo->state >= &states[S_PLAY_ABL1] && player->mo->state <= &states[S_PLAY_SPC4]) && */player->charability == CA_FLY)) // SRB2kart - idk
|
/*|| ((player->mo->state >= &states[S_PLAY_ABL1] && player->mo->state <= &states[S_PLAY_SPC4]) && player->charability == CA_FLY)*/) // SRB2kart - idk
|
||||||
player->mo->angle = R_PointToAngle2(0, 0, player->rmomx, player->rmomy);
|
player->mo->angle = R_PointToAngle2(0, 0, player->rmomx, player->rmomy);
|
||||||
|
|
||||||
// Update the local angle control.
|
// Update the local angle control.
|
||||||
|
@ -7074,8 +6443,8 @@ static void P_MovePlayer(player_t *player)
|
||||||
|
|
||||||
speed = R_PointToDist2(player->rmomx, player->rmomy, 0, 0);
|
speed = R_PointToDist2(player->rmomx, player->rmomy, 0, 0);
|
||||||
|
|
||||||
if (speed > player->normalspeed-5*FRACUNIT)
|
if (speed > K_GetKartSpeed(player, false)-(5<<FRACBITS))
|
||||||
speed = player->normalspeed-5*FRACUNIT;
|
speed = K_GetKartSpeed(player, false)-(5<<FRACBITS);
|
||||||
|
|
||||||
if (speed >= runnyspeed)
|
if (speed >= runnyspeed)
|
||||||
player->fovadd = speed-runnyspeed;
|
player->fovadd = speed-runnyspeed;
|
||||||
|
@ -7630,7 +6999,7 @@ void P_HomingAttack(mobj_t *source, mobj_t *enemy) // Home in on your target
|
||||||
dist = 1;
|
dist = 1;
|
||||||
|
|
||||||
if (source->type == MT_DETON && enemy->player) // For Deton Chase (Unused)
|
if (source->type == MT_DETON && enemy->player) // For Deton Chase (Unused)
|
||||||
ns = FixedDiv(FixedMul(enemy->player->normalspeed, enemy->scale), FixedDiv(20*FRACUNIT,17*FRACUNIT));
|
ns = FixedDiv(FixedMul(K_GetKartSpeed(enemy->player, false), enemy->scale), FixedDiv(20*FRACUNIT,17*FRACUNIT));
|
||||||
else if (source->type != MT_PLAYER)
|
else if (source->type != MT_PLAYER)
|
||||||
{
|
{
|
||||||
if (source->threshold == 32000)
|
if (source->threshold == 32000)
|
||||||
|
@ -7639,7 +7008,7 @@ void P_HomingAttack(mobj_t *source, mobj_t *enemy) // Home in on your target
|
||||||
ns = FixedMul(source->info->speed, source->scale);
|
ns = FixedMul(source->info->speed, source->scale);
|
||||||
}
|
}
|
||||||
else if (source->player)
|
else if (source->player)
|
||||||
ns = FixedDiv(FixedMul(source->player->actionspd, source->scale), 3*FRACUNIT/2);
|
ns = FixedDiv(FixedMul(K_GetKartSpeed(source->player, false), source->scale), 3*FRACUNIT/2);
|
||||||
|
|
||||||
source->momx = FixedMul(FixedDiv(enemy->x - source->x, dist), ns);
|
source->momx = FixedMul(FixedDiv(enemy->x - source->x, dist), ns);
|
||||||
source->momy = FixedMul(FixedDiv(enemy->y - source->y, dist), ns);
|
source->momy = FixedMul(FixedDiv(enemy->y - source->y, dist), ns);
|
||||||
|
@ -9127,7 +8496,7 @@ void P_PlayerThink(player_t *player)
|
||||||
|| (player->spectator || player->powers[pw_flashing] < K_GetKartFlashing(player))))
|
|| (player->spectator || player->powers[pw_flashing] < K_GetKartFlashing(player))))
|
||||||
player->powers[pw_flashing]--;
|
player->powers[pw_flashing]--;
|
||||||
|
|
||||||
if (player->powers[pw_tailsfly] && player->powers[pw_tailsfly] < UINT16_MAX && player->charability != CA_SWIM && !(player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))) // tails fly counter
|
if (player->powers[pw_tailsfly] && player->powers[pw_tailsfly] < UINT16_MAX /*&& player->charability != CA_SWIM*/ && !(player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))) // tails fly counter
|
||||||
player->powers[pw_tailsfly]--;
|
player->powers[pw_tailsfly]--;
|
||||||
|
|
||||||
/* // SRB2kart - Can't drown.
|
/* // SRB2kart - Can't drown.
|
||||||
|
|
|
@ -1552,7 +1552,6 @@ void R_RegisterEngineStuff(void)
|
||||||
CV_RegisterVar(&cv_grgammared);
|
CV_RegisterVar(&cv_grgammared);
|
||||||
CV_RegisterVar(&cv_grfovchange);
|
CV_RegisterVar(&cv_grfovchange);
|
||||||
CV_RegisterVar(&cv_grfog);
|
CV_RegisterVar(&cv_grfog);
|
||||||
CV_RegisterVar(&cv_voodoocompatibility);
|
|
||||||
CV_RegisterVar(&cv_grfogcolor);
|
CV_RegisterVar(&cv_grfogcolor);
|
||||||
CV_RegisterVar(&cv_grsoftwarefog);
|
CV_RegisterVar(&cv_grsoftwarefog);
|
||||||
#ifdef ALAM_LIGHTING
|
#ifdef ALAM_LIGHTING
|
||||||
|
@ -1561,7 +1560,7 @@ void R_RegisterEngineStuff(void)
|
||||||
CV_RegisterVar(&cv_grcoronas);
|
CV_RegisterVar(&cv_grcoronas);
|
||||||
CV_RegisterVar(&cv_grcoronasize);
|
CV_RegisterVar(&cv_grcoronasize);
|
||||||
#endif
|
#endif
|
||||||
CV_RegisterVar(&cv_grmd2);
|
CV_RegisterVar(&cv_grmdls);
|
||||||
CV_RegisterVar(&cv_grfallbackplayermodel);
|
CV_RegisterVar(&cv_grfallbackplayermodel);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -227,6 +227,10 @@
|
||||||
<ClInclude Include="..\hardware\hw_light.h" />
|
<ClInclude Include="..\hardware\hw_light.h" />
|
||||||
<ClInclude Include="..\hardware\hw_main.h" />
|
<ClInclude Include="..\hardware\hw_main.h" />
|
||||||
<ClInclude Include="..\hardware\hw_md2.h" />
|
<ClInclude Include="..\hardware\hw_md2.h" />
|
||||||
|
<ClInclude Include="..\hardware\hw_md2load.h" />
|
||||||
|
<ClInclude Include="..\hardware\hw_md3load.h" />
|
||||||
|
<ClInclude Include="..\hardware\hw_model.h" />
|
||||||
|
<ClInclude Include="..\hardware\u_list.h" />
|
||||||
<ClInclude Include="..\hu_stuff.h" />
|
<ClInclude Include="..\hu_stuff.h" />
|
||||||
<ClInclude Include="..\info.h" />
|
<ClInclude Include="..\info.h" />
|
||||||
<ClInclude Include="..\i_addrinfo.h" />
|
<ClInclude Include="..\i_addrinfo.h" />
|
||||||
|
@ -366,8 +370,12 @@
|
||||||
<ClCompile Include="..\hardware\hw_light.c" />
|
<ClCompile Include="..\hardware\hw_light.c" />
|
||||||
<ClCompile Include="..\hardware\hw_main.c" />
|
<ClCompile Include="..\hardware\hw_main.c" />
|
||||||
<ClCompile Include="..\hardware\hw_md2.c" />
|
<ClCompile Include="..\hardware\hw_md2.c" />
|
||||||
|
<ClCompile Include="..\hardware\hw_md2load.c" />
|
||||||
|
<ClCompile Include="..\hardware\hw_md3load.c" />
|
||||||
|
<ClCompile Include="..\hardware\hw_model.c" />
|
||||||
<ClCompile Include="..\hardware\hw_trick.c" />
|
<ClCompile Include="..\hardware\hw_trick.c" />
|
||||||
<ClCompile Include="..\hardware\r_opengl\r_opengl.c" />
|
<ClCompile Include="..\hardware\r_opengl\r_opengl.c" />
|
||||||
|
<ClCompile Include="..\hardware\u_list.c" />
|
||||||
<ClCompile Include="..\hu_stuff.c" />
|
<ClCompile Include="..\hu_stuff.c" />
|
||||||
<ClCompile Include="..\info.c" />
|
<ClCompile Include="..\info.c" />
|
||||||
<ClCompile Include="..\i_addrinfo.c">
|
<ClCompile Include="..\i_addrinfo.c">
|
||||||
|
|
|
@ -246,6 +246,18 @@
|
||||||
<ClInclude Include="..\hardware\hw_md2.h">
|
<ClInclude Include="..\hardware\hw_md2.h">
|
||||||
<Filter>Hw_Hardware</Filter>
|
<Filter>Hw_Hardware</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\hardware\hw_md2load.h">
|
||||||
|
<Filter>Hw_Hardware</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\hardware\hw_md3load.h">
|
||||||
|
<Filter>Hw_Hardware</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\hardware\hw_model.h">
|
||||||
|
<Filter>Hw_Hardware</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\hardware\u_list.h">
|
||||||
|
<Filter>Hw_Hardware</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\byteptr.h">
|
<ClInclude Include="..\byteptr.h">
|
||||||
<Filter>I_Interface</Filter>
|
<Filter>I_Interface</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -627,9 +639,21 @@
|
||||||
<ClCompile Include="..\hardware\hw_md2.c">
|
<ClCompile Include="..\hardware\hw_md2.c">
|
||||||
<Filter>Hw_Hardware</Filter>
|
<Filter>Hw_Hardware</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\hardware\hw_md2load.c">
|
||||||
|
<Filter>Hw_Hardware</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\hardware\hw_md3load.c">
|
||||||
|
<Filter>Hw_Hardware</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\hardware\hw_model.c">
|
||||||
|
<Filter>Hw_Hardware</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\hardware\hw_trick.c">
|
<ClCompile Include="..\hardware\hw_trick.c">
|
||||||
<Filter>Hw_Hardware</Filter>
|
<Filter>Hw_Hardware</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\hardware\u_list.c">
|
||||||
|
<Filter>Hw_Hardware</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\filesrch.c">
|
<ClCompile Include="..\filesrch.c">
|
||||||
<Filter>I_Interface</Filter>
|
<Filter>I_Interface</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
|
|
@ -87,13 +87,11 @@ void *hwSym(const char *funcName,void *handle)
|
||||||
GETFUNC(ClearMipMapCache);
|
GETFUNC(ClearMipMapCache);
|
||||||
GETFUNC(SetSpecialState);
|
GETFUNC(SetSpecialState);
|
||||||
GETFUNC(GetTextureUsed);
|
GETFUNC(GetTextureUsed);
|
||||||
GETFUNC(DrawMD2);
|
GETFUNC(DrawModel);
|
||||||
GETFUNC(DrawMD2i);
|
GETFUNC(CreateModelVBOs);
|
||||||
GETFUNC(SetTransform);
|
GETFUNC(SetTransform);
|
||||||
GETFUNC(GetRenderVersion);
|
GETFUNC(GetRenderVersion);
|
||||||
#ifdef SHUFFLE
|
|
||||||
GETFUNC(PostImgRedraw);
|
GETFUNC(PostImgRedraw);
|
||||||
#endif //SHUFFLE
|
|
||||||
GETFUNC(FlushScreenTextures);
|
GETFUNC(FlushScreenTextures);
|
||||||
GETFUNC(StartScreenWipe);
|
GETFUNC(StartScreenWipe);
|
||||||
GETFUNC(EndScreenWipe);
|
GETFUNC(EndScreenWipe);
|
||||||
|
|
|
@ -359,6 +359,14 @@ static INT32 Impl_SDL_Scancode_To_Keycode(SDL_Scancode code)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void SDLdoGrabMouse(void)
|
||||||
|
{
|
||||||
|
SDL_ShowCursor(SDL_DISABLE);
|
||||||
|
SDL_SetWindowGrab(window, SDL_TRUE);
|
||||||
|
if (SDL_SetRelativeMouseMode(SDL_TRUE) == 0) // already warps mouse if successful
|
||||||
|
wrapmouseok = SDL_TRUE; // TODO: is wrapmouseok or HalfWarpMouse needed anymore?
|
||||||
|
}
|
||||||
|
|
||||||
static void SDLdoUngrabMouse(void)
|
static void SDLdoUngrabMouse(void)
|
||||||
{
|
{
|
||||||
SDL_ShowCursor(SDL_ENABLE);
|
SDL_ShowCursor(SDL_ENABLE);
|
||||||
|
@ -629,6 +637,9 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
|
||||||
//else firsttimeonmouse = SDL_FALSE;
|
//else firsttimeonmouse = SDL_FALSE;
|
||||||
|
|
||||||
capslock = !!( SDL_GetModState() & KMOD_CAPS );// in case CL changes
|
capslock = !!( SDL_GetModState() & KMOD_CAPS );// in case CL changes
|
||||||
|
|
||||||
|
if (USE_MOUSEINPUT)
|
||||||
|
SDLdoGrabMouse();
|
||||||
}
|
}
|
||||||
else if (!mousefocus && !kbfocus)
|
else if (!mousefocus && !kbfocus)
|
||||||
{
|
{
|
||||||
|
@ -708,9 +719,7 @@ static void Impl_HandleMouseMotionEvent(SDL_MouseMotionEvent evt)
|
||||||
// -- Monster Iestyn
|
// -- Monster Iestyn
|
||||||
if (SDL_GetMouseFocus() == window && SDL_GetKeyboardFocus() == window)
|
if (SDL_GetMouseFocus() == window && SDL_GetKeyboardFocus() == window)
|
||||||
{
|
{
|
||||||
SDL_SetWindowGrab(window, SDL_TRUE);
|
SDLdoGrabMouse();
|
||||||
if (SDL_SetRelativeMouseMode(SDL_TRUE) == 0) // already warps mouse if successful
|
|
||||||
wrapmouseok = SDL_TRUE; // TODO: is wrapmouseok or HalfWarpMouse needed anymore?
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1277,7 +1286,7 @@ void I_StartupMouse(void)
|
||||||
else
|
else
|
||||||
firsttimeonmouse = SDL_FALSE;
|
firsttimeonmouse = SDL_FALSE;
|
||||||
if (cv_usemouse.value)
|
if (cv_usemouse.value)
|
||||||
return;
|
SDLdoGrabMouse();
|
||||||
else
|
else
|
||||||
SDLdoUngrabMouse();
|
SDLdoUngrabMouse();
|
||||||
}
|
}
|
||||||
|
@ -1845,13 +1854,11 @@ void I_StartupGraphics(void)
|
||||||
HWD.pfnSetSpecialState = hwSym("SetSpecialState",NULL);
|
HWD.pfnSetSpecialState = hwSym("SetSpecialState",NULL);
|
||||||
HWD.pfnSetPalette = hwSym("SetPalette",NULL);
|
HWD.pfnSetPalette = hwSym("SetPalette",NULL);
|
||||||
HWD.pfnGetTextureUsed = hwSym("GetTextureUsed",NULL);
|
HWD.pfnGetTextureUsed = hwSym("GetTextureUsed",NULL);
|
||||||
HWD.pfnDrawMD2 = hwSym("DrawMD2",NULL);
|
HWD.pfnDrawModel = hwSym("DrawModel",NULL);
|
||||||
HWD.pfnDrawMD2i = hwSym("DrawMD2i",NULL);
|
HWD.pfnCreateModelVBOs = hwSym("CreateModelVBOs",NULL);
|
||||||
HWD.pfnSetTransform = hwSym("SetTransform",NULL);
|
HWD.pfnSetTransform = hwSym("SetTransform",NULL);
|
||||||
HWD.pfnGetRenderVersion = hwSym("GetRenderVersion",NULL);
|
HWD.pfnGetRenderVersion = hwSym("GetRenderVersion",NULL);
|
||||||
#ifdef SHUFFLE
|
|
||||||
HWD.pfnPostImgRedraw = hwSym("PostImgRedraw",NULL);
|
HWD.pfnPostImgRedraw = hwSym("PostImgRedraw",NULL);
|
||||||
#endif
|
|
||||||
HWD.pfnFlushScreenTextures=hwSym("FlushScreenTextures",NULL);
|
HWD.pfnFlushScreenTextures=hwSym("FlushScreenTextures",NULL);
|
||||||
HWD.pfnStartScreenWipe = hwSym("StartScreenWipe",NULL);
|
HWD.pfnStartScreenWipe = hwSym("StartScreenWipe",NULL);
|
||||||
HWD.pfnEndScreenWipe = hwSym("EndScreenWipe",NULL);
|
HWD.pfnEndScreenWipe = hwSym("EndScreenWipe",NULL);
|
||||||
|
|
|
@ -755,6 +755,36 @@
|
||||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\hardware\hw_md2load.c">
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\hardware\hw_md3load.c">
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\hardware\hw_model.c">
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\hardware\hw_trick.c">
|
<ClCompile Include="..\hardware\hw_trick.c">
|
||||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
@ -765,6 +795,16 @@
|
||||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\hardware\u_list.c">
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\i_tcp.c">
|
<ClCompile Include="..\i_tcp.c">
|
||||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
@ -1340,7 +1380,11 @@
|
||||||
<ClInclude Include="..\hardware\hw_light.h" />
|
<ClInclude Include="..\hardware\hw_light.h" />
|
||||||
<ClInclude Include="..\hardware\hw_main.h" />
|
<ClInclude Include="..\hardware\hw_main.h" />
|
||||||
<ClInclude Include="..\hardware\hw_md2.h" />
|
<ClInclude Include="..\hardware\hw_md2.h" />
|
||||||
|
<ClInclude Include="..\hardware\hw_md2load.h" />
|
||||||
|
<ClInclude Include="..\hardware\hw_md3load.h" />
|
||||||
|
<ClInclude Include="..\hardware\hw_model.h" />
|
||||||
<ClInclude Include="..\hardware\hws_data.h" />
|
<ClInclude Include="..\hardware\hws_data.h" />
|
||||||
|
<ClInclude Include="..\hardware\u_list.h" />
|
||||||
<ClInclude Include="..\byteptr.h" />
|
<ClInclude Include="..\byteptr.h" />
|
||||||
<ClInclude Include="..\i_joy.h" />
|
<ClInclude Include="..\i_joy.h" />
|
||||||
<ClInclude Include="..\i_net.h" />
|
<ClInclude Include="..\i_net.h" />
|
||||||
|
|
|
@ -573,17 +573,17 @@ static void ST_drawDebugInfo(void)
|
||||||
|
|
||||||
if (cv_debug & DBG_DETAILED)
|
if (cv_debug & DBG_DETAILED)
|
||||||
{
|
{
|
||||||
V_DrawRightAlignedString(320, height - 104, V_MONOSPACE, va("SHIELD: %5x", stplyr->powers[pw_shield]));
|
//V_DrawRightAlignedString(320, height - 104, V_MONOSPACE, va("SHIELD: %5x", stplyr->powers[pw_shield]));
|
||||||
V_DrawRightAlignedString(320, height - 96, V_MONOSPACE, va("SCALE: %5d%%", (stplyr->mo->scale*100)/FRACUNIT));
|
V_DrawRightAlignedString(320, height - 96, V_MONOSPACE, va("SCALE: %5d%%", (stplyr->mo->scale*100)/FRACUNIT));
|
||||||
V_DrawRightAlignedString(320, height - 88, V_MONOSPACE, va("DASH: %3d/%3d", stplyr->dashspeed>>FRACBITS, FixedMul(stplyr->maxdash,stplyr->mo->scale)>>FRACBITS));
|
//V_DrawRightAlignedString(320, height - 88, V_MONOSPACE, va("DASH: %3d/%3d", stplyr->dashspeed>>FRACBITS, FixedMul(stplyr->maxdash,stplyr->mo->scale)>>FRACBITS));
|
||||||
V_DrawRightAlignedString(320, height - 80, V_MONOSPACE, va("AIR: %4d, %3d", stplyr->powers[pw_underwater], stplyr->powers[pw_spacetime]));
|
//V_DrawRightAlignedString(320, height - 80, V_MONOSPACE, va("AIR: %4d, %3d", stplyr->powers[pw_underwater], stplyr->powers[pw_spacetime]));
|
||||||
|
|
||||||
// Flags
|
// Flags
|
||||||
V_DrawRightAlignedString(304-64, height - 72, V_MONOSPACE, "Flags:");
|
//V_DrawRightAlignedString(304-64, height - 72, V_MONOSPACE, "Flags:");
|
||||||
V_DrawString(304-60, height - 72, (stplyr->jumping) ? V_GREENMAP : V_REDMAP, "JM");
|
//V_DrawString(304-60, height - 72, (stplyr->jumping) ? V_GREENMAP : V_REDMAP, "JM");
|
||||||
V_DrawString(304-40, height - 72, (stplyr->pflags & PF_JUMPED) ? V_GREENMAP : V_REDMAP, "JD");
|
//V_DrawString(304-40, height - 72, (stplyr->pflags & PF_JUMPED) ? V_GREENMAP : V_REDMAP, "JD");
|
||||||
V_DrawString(304-20, height - 72, (stplyr->pflags & PF_SPINNING) ? V_GREENMAP : V_REDMAP, "SP");
|
//V_DrawString(304-20, height - 72, (stplyr->pflags & PF_SPINNING) ? V_GREENMAP : V_REDMAP, "SP");
|
||||||
V_DrawString(304, height - 72, (stplyr->pflags & PF_STARTDASH) ? V_GREENMAP : V_REDMAP, "ST");
|
//V_DrawString(304, height - 72, (stplyr->pflags & PF_STARTDASH) ? V_GREENMAP : V_REDMAP, "ST");
|
||||||
|
|
||||||
V_DrawRightAlignedString(320, height - 64, V_MONOSPACE, va("CEILZ: %6d", stplyr->mo->ceilingz>>FRACBITS));
|
V_DrawRightAlignedString(320, height - 64, V_MONOSPACE, va("CEILZ: %6d", stplyr->mo->ceilingz>>FRACBITS));
|
||||||
V_DrawRightAlignedString(320, height - 56, V_MONOSPACE, va("FLOORZ: %6d", stplyr->mo->floorz>>FRACBITS));
|
V_DrawRightAlignedString(320, height - 56, V_MONOSPACE, va("FLOORZ: %6d", stplyr->mo->floorz>>FRACBITS));
|
||||||
|
|
|
@ -60,7 +60,6 @@ static void CV_Gammaxxx_ONChange(void);
|
||||||
static CV_PossibleValue_t grgamma_cons_t[] = {{1, "MIN"}, {255, "MAX"}, {0, NULL}};
|
static CV_PossibleValue_t grgamma_cons_t[] = {{1, "MIN"}, {255, "MAX"}, {0, NULL}};
|
||||||
static CV_PossibleValue_t grsoftwarefog_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "LightPlanes"}, {0, NULL}};
|
static CV_PossibleValue_t grsoftwarefog_cons_t[] = {{0, "Off"}, {1, "On"}, {2, "LightPlanes"}, {0, NULL}};
|
||||||
|
|
||||||
consvar_t cv_voodoocompatibility = {"gr_voodoocompatibility", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
|
||||||
consvar_t cv_grfovchange = {"gr_fovchange", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_grfovchange = {"gr_fovchange", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_grfog = {"gr_fog", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_grfog = {"gr_fog", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_grfogcolor = {"gr_fogcolor", "AAAAAA", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_grfogcolor = {"gr_fogcolor", "AAAAAA", CV_SAVE, NULL, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
|
@ -80,7 +79,7 @@ consvar_t cv_grcoronasize = {"gr_coronasize", "1", CV_SAVE| CV_FLOAT, 0, NULL, 0
|
||||||
|
|
||||||
//static CV_PossibleValue_t CV_MD2[] = {{0, "Off"}, {1, "On"}, {2, "Old"}, {0, NULL}};
|
//static CV_PossibleValue_t CV_MD2[] = {{0, "Off"}, {1, "On"}, {2, "Old"}, {0, NULL}};
|
||||||
// console variables in development
|
// console variables in development
|
||||||
consvar_t cv_grmd2 = {"gr_md2", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_grmdls = {"gr_mdls", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
consvar_t cv_grfallbackplayermodel = {"gr_fallbackplayermodel", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
consvar_t cv_grfallbackplayermodel = {"gr_fallbackplayermodel", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -230,7 +230,11 @@
|
||||||
<ClCompile Include="..\hardware\hw_light.c" />
|
<ClCompile Include="..\hardware\hw_light.c" />
|
||||||
<ClCompile Include="..\hardware\hw_main.c" />
|
<ClCompile Include="..\hardware\hw_main.c" />
|
||||||
<ClCompile Include="..\hardware\hw_md2.c" />
|
<ClCompile Include="..\hardware\hw_md2.c" />
|
||||||
|
<ClCompile Include="..\hardware\hw_md2load.c" />
|
||||||
|
<ClCompile Include="..\hardware\hw_md3load.c" />
|
||||||
|
<ClCompile Include="..\hardware\hw_model.c" />
|
||||||
<ClCompile Include="..\hardware\hw_trick.c" />
|
<ClCompile Include="..\hardware\hw_trick.c" />
|
||||||
|
<ClCompile Include="..\hardware\u_list.c" />
|
||||||
<ClCompile Include="..\hu_stuff.c" />
|
<ClCompile Include="..\hu_stuff.c" />
|
||||||
<ClCompile Include="..\info.c" />
|
<ClCompile Include="..\info.c" />
|
||||||
<ClCompile Include="..\i_addrinfo.c">
|
<ClCompile Include="..\i_addrinfo.c">
|
||||||
|
@ -394,6 +398,10 @@
|
||||||
<ClInclude Include="..\hardware\hw_light.h" />
|
<ClInclude Include="..\hardware\hw_light.h" />
|
||||||
<ClInclude Include="..\hardware\hw_main.h" />
|
<ClInclude Include="..\hardware\hw_main.h" />
|
||||||
<ClInclude Include="..\hardware\hw_md2.h" />
|
<ClInclude Include="..\hardware\hw_md2.h" />
|
||||||
|
<ClInclude Include="..\hardware\hw_md2load.h" />
|
||||||
|
<ClInclude Include="..\hardware\hw_md3load.h" />
|
||||||
|
<ClInclude Include="..\hardware\hw_model.h" />
|
||||||
|
<ClInclude Include="..\hardware\u_list.h" />
|
||||||
<ClInclude Include="..\hu_stuff.h" />
|
<ClInclude Include="..\hu_stuff.h" />
|
||||||
<ClInclude Include="..\info.h" />
|
<ClInclude Include="..\info.h" />
|
||||||
<ClInclude Include="..\i_addrinfo.h" />
|
<ClInclude Include="..\i_addrinfo.h" />
|
||||||
|
|
|
@ -453,6 +453,10 @@
|
||||||
<ClCompile Include="..\string.c">
|
<ClCompile Include="..\string.c">
|
||||||
<Filter>M_Misc</Filter>
|
<Filter>M_Misc</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\hardware\hw_md2load.c" />
|
||||||
|
<ClCompile Include="..\hardware\hw_md3load.c" />
|
||||||
|
<ClCompile Include="..\hardware\hw_model.c" />
|
||||||
|
<ClCompile Include="..\hardware\u_list.c" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="afxres.h">
|
<ClInclude Include="afxres.h">
|
||||||
|
@ -506,6 +510,15 @@
|
||||||
<ClInclude Include="..\hardware\hw_md2.h">
|
<ClInclude Include="..\hardware\hw_md2.h">
|
||||||
<Filter>Hw_Hardware</Filter>
|
<Filter>Hw_Hardware</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\hardware\hw_md2load.h">
|
||||||
|
<Filter>Hw_Hardware</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\hardware\hw_md3load.h">
|
||||||
|
<Filter>Hw_Hardware</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\hardware\hw_model.h">
|
||||||
|
<Filter>Hw_Hardware</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\hardware\hw3dsdrv.h">
|
<ClInclude Include="..\hardware\hw3dsdrv.h">
|
||||||
<Filter>Hw_Hardware</Filter>
|
<Filter>Hw_Hardware</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -515,6 +528,9 @@
|
||||||
<ClInclude Include="..\hardware\hws_data.h">
|
<ClInclude Include="..\hardware\hws_data.h">
|
||||||
<Filter>Hw_Hardware</Filter>
|
<Filter>Hw_Hardware</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\hardware\u_list.h">
|
||||||
|
<Filter>Hw_Hardware</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\blua\lapi.h">
|
<ClInclude Include="..\blua\lapi.h">
|
||||||
<Filter>BLUA</Filter>
|
<Filter>BLUA</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
|
|
@ -109,8 +109,7 @@ static loadfunc_t hwdFuncTable[] = {
|
||||||
{"GClipRect@20", &hwdriver.pfnGClipRect},
|
{"GClipRect@20", &hwdriver.pfnGClipRect},
|
||||||
{"ClearMipMapCache@0", &hwdriver.pfnClearMipMapCache},
|
{"ClearMipMapCache@0", &hwdriver.pfnClearMipMapCache},
|
||||||
{"SetSpecialState@8", &hwdriver.pfnSetSpecialState},
|
{"SetSpecialState@8", &hwdriver.pfnSetSpecialState},
|
||||||
{"DrawMD2@16", &hwdriver.pfnDrawMD2},
|
{"DrawModel@16", &hwdriver.pfnDrawModel},
|
||||||
{"DrawMD2i@36", &hwdriver.pfnDrawMD2i},
|
|
||||||
{"SetTransform@4", &hwdriver.pfnSetTransform},
|
{"SetTransform@4", &hwdriver.pfnSetTransform},
|
||||||
{"GetTextureUsed@0", &hwdriver.pfnGetTextureUsed},
|
{"GetTextureUsed@0", &hwdriver.pfnGetTextureUsed},
|
||||||
{"GetRenderVersion@0", &hwdriver.pfnGetRenderVersion},
|
{"GetRenderVersion@0", &hwdriver.pfnGetRenderVersion},
|
||||||
|
@ -140,8 +139,7 @@ static loadfunc_t hwdFuncTable[] = {
|
||||||
{"GClipRect", &hwdriver.pfnGClipRect},
|
{"GClipRect", &hwdriver.pfnGClipRect},
|
||||||
{"ClearMipMapCache", &hwdriver.pfnClearMipMapCache},
|
{"ClearMipMapCache", &hwdriver.pfnClearMipMapCache},
|
||||||
{"SetSpecialState", &hwdriver.pfnSetSpecialState},
|
{"SetSpecialState", &hwdriver.pfnSetSpecialState},
|
||||||
{"DrawMD2", &hwdriver.pfnDrawMD2},
|
{"DrawModel", &hwdriver.pfnDrawModel},
|
||||||
{"DrawMD2i", &hwdriver.pfnDrawMD2i},
|
|
||||||
{"SetTransform", &hwdriver.pfnSetTransform},
|
{"SetTransform", &hwdriver.pfnSetTransform},
|
||||||
{"GetTextureUsed", &hwdriver.pfnGetTextureUsed},
|
{"GetTextureUsed", &hwdriver.pfnGetTextureUsed},
|
||||||
{"GetRenderVersion", &hwdriver.pfnGetRenderVersion},
|
{"GetRenderVersion", &hwdriver.pfnGetRenderVersion},
|
||||||
|
|
Loading…
Reference in a new issue