diff --git a/debian-template/source/options b/debian-template/source/options
index 9532ff20..7829e297 100644
--- a/debian-template/source/options
+++ b/debian-template/source/options
@@ -2,7 +2,10 @@ tar-ignore = "assets/*.srb"
tar-ignore = "assets/*.pk3"
tar-ignore = "assets/*.dta"
tar-ignore = "assets/*.wad"
+<<<<<<< HEAD:debian-template/source/options
tar-ignore = "assets/*.kart"
+=======
+>>>>>>> e251f9c230beda984cdcdea7e903d765f1c68f6f:debian-template/source/options
tar-ignore = "assets/debian/${PACKAGE_NAME}-data/*"
tar-ignore = "assets/debian/tmp/*"
tar-ignore = "*.obj"
diff --git a/libs/libgme.props b/libs/libgme.props
new file mode 100644
index 00000000..209f6b9a
--- /dev/null
+++ b/libs/libgme.props
@@ -0,0 +1,16 @@
+
+
+
+
+
+ $(SolutionDir)libs\gme\include;$(IncludePath)
+ $(SolutionDir)libs\gme\win32;$(LibraryPath)
+ $(SolutionDir)libs\gme\win64;$(LibraryPath)
+
+
+
+ libgme.dll.a;%(AdditionalDependencies)
+
+
+
+
\ No newline at end of file
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 2f97c173..db071e48 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -414,7 +414,6 @@ if(${SRB2_CONFIG_HWRENDER})
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_defs.h
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_dll.h
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_drv.h
- ${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_glide.h
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_glob.h
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_light.h
${CMAKE_CURRENT_SOURCE_DIR}/hardware/hw_main.h
diff --git a/src/Makefile b/src/Makefile
index 214c2bf7..400a06e7 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -741,8 +741,8 @@ ifdef SDL
ifdef MINGW
$(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 \
- 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 \
+ command.h hardware/hw_data.h hardware/hw_defs.h hardware/hw_md2.h \
+ hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.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
@@ -750,8 +750,8 @@ $(OBJDIR)/r_opengl.o: hardware/r_opengl/r_opengl.c hardware/r_opengl/r_opengl.h
else
$(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 \
- 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 \
+ command.h hardware/hw_data.h hardware/hw_defs.h hardware/hw_md2.h \
+ hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.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
@@ -904,8 +904,8 @@ ifndef SDL
ifndef NOHW
$(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 \
- 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 \
+ command.h hardware/hw_data.h hardware/hw_defs.h hardware/hw_md2.h \
+ hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.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
@@ -913,8 +913,8 @@ $(OBJDIR)/r_opengl.o: hardware/r_opengl/r_opengl.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 \
- 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 \
+ command.h hardware/hw_data.h hardware/hw_defs.h hardware/hw_md2.h \
+ hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.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
@@ -922,8 +922,8 @@ $(OBJDIR)/ogl_win.o: hardware/r_opengl/ogl_win.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 \
- 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 \
+ command.h hardware/hw_data.h hardware/hw_defs.h hardware/hw_md2.h \
+ hardware/hw_glob.h hardware/hw_main.h hardware/hw_clip.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
diff --git a/src/command.c b/src/command.c
index 6d9c86d3..11c0b7f8 100644
--- a/src/command.c
+++ b/src/command.c
@@ -532,7 +532,6 @@ static void COM_ExecuteString(char *ptext)
{
if (!stricmp(com_argv[0], cmd->name)) //case insensitive now that we have lower and uppercase!
{
- recursion = 0;
cmd->function();
return;
}
@@ -544,7 +543,7 @@ static void COM_ExecuteString(char *ptext)
if (!stricmp(com_argv[0], a->name))
{
if (recursion > MAX_ALIAS_RECURSION)
- {
+ {
CONS_Alert(CONS_WARNING, M_GetText("Alias recursion cycle detected!\n"));
recursion = 0;
}
@@ -586,8 +585,6 @@ static void COM_ExecuteString(char *ptext)
}
}
- recursion = 0;
-
// check cvars
// Hurdler: added at Ebola's request ;)
// (don't flood the console in software mode with bad gr_xxx command)
diff --git a/src/d_main.c b/src/d_main.c
index 467976c1..efa8a788 100644
--- a/src/d_main.c
+++ b/src/d_main.c
@@ -180,6 +180,7 @@ void D_PostEvent_end(void) {};
#endif
// modifier keys
+// Now handled in I_OsPolling
UINT8 shiftdown = 0; // 0x1 left, 0x2 right
UINT8 ctrldown = 0; // 0x1 left, 0x2 right
UINT8 altdown = 0; // 0x1 left, 0x2 right
@@ -226,9 +227,6 @@ void D_ProcessEvents(void)
{
ev = &events[eventtail];
- // Set global shift/ctrl/alt down variables
- D_ModifierKeyResponder(ev); // never eats events
-
// Screenshots over everything so that they can be taken anywhere.
if (M_ScreenshotResponder(ev))
continue; // ate the event
@@ -1301,6 +1299,15 @@ void D_SRB2Main(void)
CONS_Printf("I_StartupGraphics()...\n");
I_StartupGraphics();
+#ifdef HWRENDER
+ if (rendermode == render_opengl)
+ {
+ INT32 i;
+ for (i = 0; i < numwadfiles; i++)
+ HWR_LoadShaders(i, (wadfiles[i]->type == RET_PK3));
+ }
+#endif
+
//--------------------------------------------------------- CONSOLE
// setup loading screen
SCR_Startup();
diff --git a/src/dehacked.c b/src/dehacked.c
index b311a860..b17236c5 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -42,10 +42,6 @@
#include "r_draw.h" // translation colormap consts (for lua)
#endif
-#ifdef HWRENDER
-#include "hardware/hw_light.h"
-#endif
-
#ifdef PC_DOS
#include // for snprintf
//int snprintf(char *str, size_t n, const char *fmt, ...);
@@ -335,21 +331,6 @@ static INT32 searchvalue(const char *s)
}
}
-#ifdef HWRENDER
-static float searchfvalue(const char *s)
-{
- while (s[0] != '=' && s[0])
- s++;
- if (s[0] == '=')
- return (float)atof(&s[1]);
- else
- {
- deh_warning("No value found");
- return 0;
- }
-}
-#endif
-
// These are for clearing all of various things
static void clear_conditionsets(void)
{
@@ -854,128 +835,6 @@ static void readthing(MYFILE *f, INT32 num)
Z_Free(s);
}
-#ifdef HWRENDER
-static void readlight(MYFILE *f, INT32 num)
-{
- char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL);
- char *word;
- char *tmp;
- INT32 value;
- float fvalue;
-
- do
- {
- if (myfgets(s, MAXLINELEN, f))
- {
- if (s[0] == '\n')
- break;
-
- tmp = strchr(s, '#');
- if (tmp)
- *tmp = '\0';
- if (s == tmp)
- continue; // Skip comment lines, but don't break.
-
- fvalue = searchfvalue(s);
- value = searchvalue(s);
-
- word = strtok(s, " ");
- if (word)
- strupr(word);
- else
- break;
-
- if (fastcmp(word, "TYPE"))
- {
- DEH_WriteUndoline(word, va("%d", lspr[num].type), UNDO_NONE);
- lspr[num].type = (UINT16)value;
- }
- else if (fastcmp(word, "OFFSETX"))
- {
- DEH_WriteUndoline(word, va("%f", lspr[num].light_xoffset), UNDO_NONE);
- lspr[num].light_xoffset = fvalue;
- }
- else if (fastcmp(word, "OFFSETY"))
- {
- DEH_WriteUndoline(word, va("%f", lspr[num].light_yoffset), UNDO_NONE);
- lspr[num].light_yoffset = fvalue;
- }
- else if (fastcmp(word, "CORONACOLOR"))
- {
- DEH_WriteUndoline(word, va("%u", lspr[num].corona_color), UNDO_NONE);
- lspr[num].corona_color = value;
- }
- else if (fastcmp(word, "CORONARADIUS"))
- {
- DEH_WriteUndoline(word, va("%f", lspr[num].corona_radius), UNDO_NONE);
- lspr[num].corona_radius = fvalue;
- }
- else if (fastcmp(word, "DYNAMICCOLOR"))
- {
- DEH_WriteUndoline(word, va("%u", lspr[num].dynamic_color), UNDO_NONE);
- lspr[num].dynamic_color = value;
- }
- else if (fastcmp(word, "DYNAMICRADIUS"))
- {
- DEH_WriteUndoline(word, va("%f", lspr[num].dynamic_radius), UNDO_NONE);
- lspr[num].dynamic_radius = fvalue;
-
- /// \note Update the sqrradius! unnecessary?
- lspr[num].dynamic_sqrradius = fvalue * fvalue;
- }
- else
- deh_warning("Light %d: unknown word '%s'", num, word);
- }
- } while (!myfeof(f)); // finish when the line is empty
-
- Z_Free(s);
-}
-
-static void readspritelight(MYFILE *f, INT32 num)
-{
- char *s = Z_Malloc(MAXLINELEN, PU_STATIC, NULL);
- char *word;
- char *tmp;
- INT32 value;
-
- do
- {
- if (myfgets(s, MAXLINELEN, f))
- {
- if (s[0] == '\n')
- break;
-
- tmp = strchr(s, '#');
- if (tmp)
- *tmp = '\0';
- if (s == tmp)
- continue; // Skip comment lines, but don't break.
-
- value = searchvalue(s);
-
- word = strtok(s, " ");
- if (word)
- strupr(word);
- else
- break;
-
- if (fastcmp(word, "LIGHTTYPE"))
- {
- INT32 oldvar;
- for (oldvar = 0; t_lspr[num] != &lspr[oldvar]; oldvar++)
- ;
- DEH_WriteUndoline(word, va("%d", oldvar), UNDO_NONE);
- t_lspr[num] = &lspr[value];
- }
- else
- deh_warning("Sprite %d: unknown word '%s'", num, word);
- }
- } while (!myfeof(f)); // finish when the line is empty
-
- Z_Free(s);
-}
-#endif // HWRENDER
-
static const struct {
const char *name;
const UINT16 flag;
@@ -3513,37 +3372,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
readAnimTex(f, i);
// This is not a major mod.
}*/
- else if (fastcmp(word, "LIGHT"))
- {
-#ifdef HWRENDER
- // TODO: Read lights by name
- if (i > 0 && i < NUMLIGHTS)
- readlight(f, i);
- else
- {
- deh_warning("Light number %d out of range (1 - %d)", i, NUMLIGHTS-1);
- ignorelines(f);
- }
- DEH_WriteUndoline(word, word2, UNDO_HEADER);
- // This is not a major mod.
-#endif
- }
- else if (fastcmp(word, "SPRITE"))
- {
-#ifdef HWRENDER
- if (i == 0 && word2[0] != '0') // If word2 isn't a number
- i = get_sprite(word2); // find a sprite by name
- if (i < NUMSPRITES && i >= 0)
- readspritelight(f, i);
- else
- {
- deh_warning("Sprite number %d out of range (0 - %d)", i, NUMSPRITES-1);
- ignorelines(f);
- }
- DEH_WriteUndoline(word, word2, UNDO_HEADER);
- // This is not a major mod.
-#endif
- }
else if (fastcmp(word, "LEVEL"))
{
// Support using the actual map name,
@@ -7391,7 +7219,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s
// Castle Eggman Scenery
"MT_CHAIN", // CEZ Chain
- "MT_FLAME", // Flame (has corona)
+ "MT_FLAME", // Flame
"MT_EGGSTATUE", // Eggman Statue
"MT_MACEPOINT", // Mace rotation point
"MT_SWINGMACEPOINT", // Mace swinging point
diff --git a/src/doomdef.h b/src/doomdef.h
index 24b52e8d..bb9c3784 100644
--- a/src/doomdef.h
+++ b/src/doomdef.h
@@ -548,6 +548,9 @@ extern INT32 cv_debug;
extern UINT8 shiftdown, ctrldown, altdown;
extern boolean capslock;
+// WARNING: a should be unsigned but to add with 2048, it isn't!
+#define AIMINGTODY(a) (FINETANGENT((2048+(((INT32)a)>>ANGLETOFINESHIFT)) & FINEMASK)*160)
+
// if we ever make our alloc stuff...
#define ZZ_Alloc(x) Z_Malloc(x, PU_STATIC, NULL)
@@ -633,11 +636,6 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
/// Most modifications should probably enable this.
//#define SAVEGAME_OTHERVERSIONS
-#if !defined (_NDS) && !defined (_PSP)
-/// Shuffle's incomplete OpenGL sorting code.
-#define SHUFFLE // This has nothing to do with sorting, why was it disabled?
-#endif
-
#if !defined (_NDS) && !defined (_PSP)
/// Allow the use of the SOC RESETINFO command.
/// \note Builds that are tight on memory should disable this.
@@ -674,6 +672,9 @@ extern const char *compdate, *comptime, *comprevision, *compbranch;
/// on the bright side it fixes some weird issues with translucent walls
/// \note SRB2CB port.
/// SRB2CB itself ported this from PrBoom+
-#define NEWCLIP
+//#define NEWCLIP
+
+/// Hardware renderer: OpenGL
+#define GL_SHADERS
#endif // __DOOMDEF__
diff --git a/src/hardware/hw_bsp.c b/src/hardware/hw_bsp.c
index 9e454bcd..da802aaf 100644
--- a/src/hardware/hw_bsp.c
+++ b/src/hardware/hw_bsp.c
@@ -1,17 +1,12 @@
-// Emacs style mode select -*- C++ -*-
+// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
-//
+// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
+// Copyright (C) 1999-2019 by Sonic Team Junior.
//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file
/// \brief convert SRB2 map
@@ -19,6 +14,7 @@
#include "../doomdef.h"
#include "../doomstat.h"
#ifdef HWRENDER
+#include "hw_main.h"
#include "hw_glob.h"
#include "../r_local.h"
#include "../z_zone.h"
@@ -60,77 +56,12 @@ static INT32 totalsubsecpolys = 0;
// --------------------------------------------------------------------------
// Polygon fast alloc / free
// --------------------------------------------------------------------------
-//hurdler: quick fix for those who wants to play with larger wad
-
-#define ZPLANALLOC
-#ifndef ZPLANALLOC
-//#define POLYPOOLSIZE 1024000 // may be much over what is needed
-/// \todo check out how much is used
-static size_t POLYPOOLSIZE = 1024000;
-
-static UINT8 *gr_polypool = NULL;
-static UINT8 *gr_ppcurrent;
-static size_t gr_ppfree;
-#endif
-
-// only between levels, clear poly pool
-static void HWR_ClearPolys(void)
-{
-#ifndef ZPLANALLOC
- gr_ppcurrent = gr_polypool;
- gr_ppfree = POLYPOOLSIZE;
-#endif
-}
-
-// allocate pool for fast alloc of polys
-void HWR_InitPolyPool(void)
-{
-#ifndef ZPLANALLOC
- INT32 pnum;
-
- //hurdler: quick fix for those who wants to play with larger wad
- if ((pnum = M_CheckParm("-polypoolsize")))
- POLYPOOLSIZE = atoi(myargv[pnum+1])*1024; // (in kb)
-
- CONS_Debug(DBG_RENDER, "HWR_InitPolyPool(): allocating %d bytes\n", POLYPOOLSIZE);
- gr_polypool = malloc(POLYPOOLSIZE);
- if (!gr_polypool)
- I_Error("HWR_InitPolyPool(): couldn't malloc polypool\n");
- HWR_ClearPolys();
-#endif
-}
-
-void HWR_FreePolyPool(void)
-{
-#ifndef ZPLANALLOC
- if (gr_polypool)
- free(gr_polypool);
- gr_polypool = NULL;
-#endif
-}
static poly_t *HWR_AllocPoly(INT32 numpts)
{
poly_t *p;
size_t size = sizeof (poly_t) + sizeof (polyvertex_t) * numpts;
-#ifdef ZPLANALLOC
p = Z_Malloc(size, PU_HWRPLANE, NULL);
-#else
-#ifdef PARANOIA
- if (!gr_polypool)
- I_Error("Used gr_polypool without init!\n");
- if (!gr_ppcurrent)
- I_Error("gr_ppcurrent == NULL!\n");
-#endif
-
- if (gr_ppfree < size)
- I_Error("HWR_AllocPoly(): no more memory %u bytes left, %u bytes needed\n\n%s\n",
- gr_ppfree, size, "You can try the param -polypoolsize 2048 (or higher if needed)");
-
- p = (poly_t *)gr_ppcurrent;
- gr_ppcurrent += size;
- gr_ppfree -= size;
-#endif
p->numpts = numpts;
return p;
}
@@ -139,17 +70,7 @@ static polyvertex_t *HWR_AllocVertex(void)
{
polyvertex_t *p;
size_t size = sizeof (polyvertex_t);
-#ifdef ZPLANALLOC
p = Z_Malloc(size, PU_HWRPLANE, NULL);
-#else
- if (gr_ppfree < size)
- I_Error("HWR_AllocVertex(): no more memory %u bytes left, %u bytes needed\n\n%s\n",
- gr_ppfree, size, "You can try the param -polypoolsize 2048 (or higher if needed)");
-
- p = (polyvertex_t *)gr_ppcurrent;
- gr_ppcurrent += size;
- gr_ppfree -= size;
-#endif
return p;
}
@@ -157,16 +78,9 @@ static polyvertex_t *HWR_AllocVertex(void)
/// for now don't free because it doesn't free in reverse order
static void HWR_FreePoly(poly_t *poly)
{
-#ifdef ZPLANALLOC
Z_Free(poly);
-#else
- const size_t size = sizeof (poly_t) + sizeof (polyvertex_t) * poly->numpts;
- memset(poly, 0x00, size);
- //mempoly -= polysize;
-#endif
}
-
// Return interception along bsp line,
// with the polygon segment
//
@@ -577,8 +491,8 @@ static inline void SearchDivline(node_t *bsp, fdivline_t *divline)
divline->dy = FIXED_TO_FLOAT(bsp->dy);
}
-#ifdef HWR_LOADING_SCREEN
//Hurdler: implement a loading status
+#ifdef HWR_LOADING_SCREEN
static size_t ls_count = 0;
static UINT8 ls_percent = 0;
@@ -836,8 +750,6 @@ static INT32 SolveTProblem(void)
return 0;
CONS_Debug(DBG_RENDER, "Solving T-joins. This may take a while. Please wait...\n");
- CON_Drawer(); //let the user know what we are doing
- I_FinishUpdate(); // page flip or blit buffer
numsplitpoly = 0;
@@ -964,11 +876,9 @@ void HWR_CreatePlanePolygons(INT32 bspnum)
CONS_Debug(DBG_RENDER, "Creating polygons, please wait...\n");
#ifdef HWR_LOADING_SCREEN
ls_count = ls_percent = 0; // reset the loading status
-#endif
CON_Drawer(); //let the user know what we are doing
I_FinishUpdate(); // page flip or blit buffer
-
- HWR_ClearPolys();
+#endif
// find min/max boundaries of map
//CONS_Debug(DBG_RENDER, "Looking for boundaries of map...\n");
diff --git a/src/hardware/hw_cache.c b/src/hardware/hw_cache.c
index d49531bd..b3077e9a 100644
--- a/src/hardware/hw_cache.c
+++ b/src/hardware/hw_cache.c
@@ -1,18 +1,12 @@
-// Emacs style mode select -*- C++ -*-
+// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
-//
+// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
+// Copyright (C) 1999-2019 by Sonic Team Junior.
//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file
/// \brief load and convert graphics to the hardware format
@@ -20,6 +14,7 @@
#include "../doomdef.h"
#ifdef HWRENDER
+#include "hw_main.h"
#include "hw_glob.h"
#include "hw_drv.h"
@@ -31,10 +26,6 @@
#include "../v_video.h"
#include "../r_draw.h"
-//Hurdler: 25/04/2000: used for new colormap code in hardware mode
-//static UINT8 *gr_colormap = NULL; // by default it must be NULL ! (because colormap tables are not initialized)
-boolean firetranslucent = false;
-
// Values set after a call to HWR_ResizeBlock()
static INT32 blocksize, blockwidth, blockheight;
@@ -139,17 +130,17 @@ static void HWR_DrawPatchInCache(GLMipmap_t *mipmap,
count--;
texel = source[yfrac>>FRACBITS];
-
- if (firetranslucent && (transtables[(texel<<8)+0x40000]!=texel))
- alpha = 0x80;
- else
- alpha = 0xff;
+ alpha = 0xff;
//Hurdler: not perfect, but better than holes
if (texel == HWR_PATCHES_CHROMAKEY_COLORINDEX && (mipmap->flags & TF_CHROMAKEYED))
- texel = HWR_CHROMAKEY_EQUIVALENTCOLORINDEX;
+ alpha = 0x00;
+
+ //texel = HWR_CHROMAKEY_EQUIVALENTCOLORINDEX;
+ // Lat: Don't do that, some weirdos still use CYAN on their WALLTEXTURES for translucency :V
+
//Hurdler: 25/04/2000: now support colormap in hardware mode
- else if (mipmap->colormap)
+ if (mipmap->colormap)
texel = mipmap->colormap[texel];
// hope compiler will get this switch out of the loops (dreams...)
@@ -181,16 +172,16 @@ static void HWR_DrawPatchInCache(GLMipmap_t *mipmap,
}
-// resize the patch to be 3dfx compliant
+// resize the patch
// set : blocksize = blockwidth * blockheight (no bpp used)
// blockwidth
// blockheight
//note : 8bit (1 byte per pixel) palettized format
static void HWR_ResizeBlock(INT32 originalwidth, INT32 originalheight,
- GrTexInfo *grInfo)
+ GLTexInfo *grInfo)
{
// Build the full textures from patches.
- static const GrLOD_t gr_lods[9] =
+ static const GLlod_t gr_lods[9] =
{
GR_LOD_LOG2_256,
GR_LOD_LOG2_128,
@@ -205,7 +196,7 @@ static void HWR_ResizeBlock(INT32 originalwidth, INT32 originalheight,
typedef struct
{
- GrAspectRatio_t aspect;
+ GLAspectRatio_t aspect;
float max_s;
float max_t;
} booring_aspect_t;
@@ -226,41 +217,21 @@ static void HWR_ResizeBlock(INT32 originalwidth, INT32 originalheight,
INT32 j,k;
INT32 max,min;
- // find a power of 2 width/height
- if (cv_grrounddown.value)
- {
- blockwidth = 256;
- while (originalwidth < blockwidth)
- blockwidth >>= 1;
- if (blockwidth < 1)
- I_Error("3D GenerateTexture : too small");
+ // size up to nearest power of 2
+ blockwidth = 1;
+ while (blockwidth < originalwidth)
+ blockwidth <<= 1;
+ // scale down the original graphics to fit in 2048
+ if (blockwidth > 2048)
+ blockwidth = 2048;
- 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 > 2048)
- blockwidth = 2048;
- //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 > 2048)
- blockheight = 2048;
- //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 2048
+ if (blockheight > 2048)
+ blockheight = 2048;
// do the boring LOD stuff.. blech!
if (blockwidth >= blockheight)
@@ -324,7 +295,7 @@ static UINT8 *MakeBlock(GLMipmap_t *grMipmap)
{
UINT8 *block;
INT32 bpp, i;
- UINT16 bu16 = ((0x00 <<8) | HWR_CHROMAKEY_EQUIVALENTCOLORINDEX);
+ UINT16 bu16 = ((0x00 <<8) | HWR_PATCHES_CHROMAKEY_COLORINDEX);
bpp = format2bpp[grMipmap->grInfo.format];
block = Z_Malloc(blocksize*bpp, PU_HWRCACHE, &(grMipmap->grInfo.data));
@@ -335,8 +306,8 @@ static UINT8 *MakeBlock(GLMipmap_t *grMipmap)
case 2:
// fill background with chromakey, alpha = 0
for (i = 0; i < blocksize; i++)
- //[segabor]
memcpy(block+i*sizeof(UINT16), &bu16, sizeof(UINT16));
+
break;
case 4: memset(block, 0x00, blocksize*sizeof(UINT32)); break;
}
@@ -379,6 +350,13 @@ static void HWR_GenerateTexture(INT32 texnum, GLTexture_t *grtex)
grtex->mipmap.height = (UINT16)blockheight;
grtex->mipmap.grInfo.format = textureformat;
+ grtex->mipmap.colormap = colormaps;
+
+#ifdef GLENCORE
+ if (encoremap)
+ grtex->mipmap.colormap += (256*32);
+#endif
+
block = MakeBlock(&grtex->mipmap);
if (skyspecial) //Hurdler: not efficient, but better than holes in the sky (and it's done only at level loading)
@@ -430,7 +408,7 @@ static void HWR_GenerateTexture(INT32 texnum, GLTexture_t *grtex)
}
// patch may be NULL if grMipmap has been initialised already and makebitmap is false
-void HWR_MakePatch (const patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipmap, boolean makebitmap)
+void HWR_MakePatch (patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipmap, boolean makebitmap)
{
INT32 newwidth, newheight;
@@ -445,8 +423,8 @@ void HWR_MakePatch (const patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipm
grPatch->leftoffset = SHORT(patch->leftoffset);
grPatch->topoffset = SHORT(patch->topoffset);
- // find the good 3dfx size (boring spec)
- HWR_ResizeBlock (SHORT(patch->width), SHORT(patch->height), &grMipmap->grInfo);
+ // resize patch
+ HWR_ResizeBlock(SHORT(patch->width), SHORT(patch->height), &grMipmap->grInfo);
grMipmap->width = (UINT16)blockwidth;
grMipmap->height = (UINT16)blockheight;
@@ -465,23 +443,12 @@ void HWR_MakePatch (const patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipm
Z_Free(grMipmap->grInfo.data);
grMipmap->grInfo.data = NULL;
- // if rounddown, rounddown patches as well as textures
- if (cv_grrounddown.value)
- {
- newwidth = blockwidth;
- newheight = blockheight;
- }
- else
- {
- // no rounddown, do not size up patches, so they don't look 'scaled'
- newwidth = min(grPatch->width, blockwidth);
- newheight = min(grPatch->height, blockheight);
- }
+ newwidth = min(grPatch->width, blockwidth);
+ newheight = min(grPatch->height, blockheight);
if (makebitmap)
{
MakeBlock(grMipmap);
-
HWR_DrawPatchInCache(grMipmap,
newwidth, newheight,
blockwidth*format2bpp[grMipmap->grInfo.format],
@@ -495,7 +462,6 @@ void HWR_MakePatch (const patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipm
grPatch->max_t = (float)newheight / (float)blockheight;
}
-
// =================================================
// CACHING HANDLING
// =================================================
@@ -562,7 +528,7 @@ void HWR_PrepLevelCache(size_t pnumtextures)
gr_numtextures = pnumtextures;
gr_textures = calloc(pnumtextures, sizeof (*gr_textures));
if (gr_textures == NULL)
- I_Error("3D can't alloc gr_textures");
+ I_Error("HWR_PrepLevelCache: can't alloc gr_textures");
}
void HWR_SetPalette(RGBA_t *palette)
@@ -593,7 +559,7 @@ GLTexture_t *HWR_GetTexture(INT32 tex)
GLTexture_t *grtex;
#ifdef PARANOIA
if ((unsigned)tex >= gr_numtextures)
- I_Error(" HWR_GetTexture: tex >= numtextures\n");
+ I_Error("HWR_GetTexture: tex >= numtextures\n");
#endif
grtex = &gr_textures[tex];
@@ -611,6 +577,10 @@ GLTexture_t *HWR_GetTexture(INT32 tex)
static void HWR_CacheFlat(GLMipmap_t *grMipmap, lumpnum_t flatlumpnum)
{
+#ifdef GLENCORE
+ UINT8 *flat;
+ INT32 steppy;
+#endif
size_t size, pflatsize;
// setup the texture info
@@ -652,15 +622,29 @@ static void HWR_CacheFlat(GLMipmap_t *grMipmap, lumpnum_t flatlumpnum)
// the flat raw data needn't be converted with palettized textures
W_ReadLump(flatlumpnum, Z_Malloc(W_LumpLength(flatlumpnum),
PU_HWRCACHE, &grMipmap->grInfo.data));
+
+#ifdef GLENCORE
+ flat = grMipmap->grInfo.data;
+ for (steppy = 0; steppy < size; steppy++)
+ if (flat[steppy] != HWR_PATCHES_CHROMAKEY_COLORINDEX)
+ flat[steppy] = grMipmap->colormap[flat[steppy]];
+#endif
}
// Download a Doom 'flat' to the hardware cache and make it ready for use
-void HWR_GetFlat(lumpnum_t flatlumpnum)
+void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap)
{
GLMipmap_t *grmip;
grmip = &HWR_GetCachedGLPatch(flatlumpnum)->mipmap;
+
+ grmip->colormap = colormaps;
+
+#ifdef GLENCORE
+ if (!noencoremap && encoremap)
+ grmip->colormap += (256*32);
+#endif
if (!grmip->downloaded && !grmip->grInfo.data)
HWR_CacheFlat(grmip, flatlumpnum);
@@ -701,12 +685,12 @@ void HWR_GetPatch(GLPatch_t *gpatch)
{
// load the software patch, PU_STATIC or the Z_Malloc for hardware patch will
// flush the software patch before the conversion! oh yeah I suffered
- patch_t *ptr = W_CacheLumpNumPwad(gpatch->wadnum, gpatch->lumpnum, PU_STATIC);
- HWR_MakePatch(ptr, gpatch, &gpatch->mipmap, true);
+ patch_t *patch = W_CacheLumpNumPwad(gpatch->wadnum, gpatch->lumpnum, PU_STATIC);
+ HWR_MakePatch(patch, gpatch, &gpatch->mipmap, true);
// this is inefficient.. but the hardware patch in heap is purgeable so it should
// not fragment memory, and besides the REAL cache here is the hardware memory
- Z_Free(ptr);
+ Z_Free(patch);
}
HWD.pfnSetTexture(&gpatch->mipmap);
@@ -766,160 +750,6 @@ void HWR_UnlockCachedPatch(GLPatch_t *gpatch)
Z_ChangeTag(gpatch, PU_HWRPATCHINFO_UNLOCKED);
}
-static const INT32 picmode2GR[] =
-{
- GR_TEXFMT_P_8, // PALETTE
- 0, // INTENSITY (unsupported yet)
- GR_TEXFMT_ALPHA_INTENSITY_88, // INTENSITY_ALPHA (corona use this)
- 0, // RGB24 (unsupported yet)
- GR_RGBA, // RGBA32 (opengl only)
-};
-
-static void HWR_DrawPicInCache(UINT8 *block, INT32 pblockwidth, INT32 pblockheight,
- INT32 blockmodulo, pic_t *pic, INT32 bpp)
-{
- INT32 i,j;
- fixed_t posx, posy, stepx, stepy;
- UINT8 *dest, *src, texel;
- UINT16 texelu16;
- INT32 picbpp;
- RGBA_t col;
-
- stepy = ((INT32)SHORT(pic->height)<width)<mode]];
- posy = 0;
- for (j = 0; j < pblockheight; j++)
- {
- posx = 0;
- dest = &block[j*blockmodulo];
- src = &pic->data[(posy>>FRACBITS)*SHORT(pic->width)*picbpp];
- for (i = 0; i < pblockwidth;i++)
- {
- switch (pic->mode)
- { // source bpp
- case PALETTE :
- texel = src[(posx+FRACUNIT/2)>>FRACBITS];
- switch (bpp)
- { // destination bpp
- case 1 :
- *dest++ = texel; break;
- case 2 :
- texelu16 = (UINT16)(texel | 0xff00);
- memcpy(dest, &texelu16, sizeof(UINT16));
- dest += sizeof(UINT16);
- break;
- case 3 :
- col = V_GetColor(texel);
- memcpy(dest, &col, sizeof(RGBA_t)-sizeof(UINT8));
- dest += sizeof(RGBA_t)-sizeof(UINT8);
- break;
- case 4 :
- memcpy(dest, &V_GetColor(texel), sizeof(RGBA_t));
- dest += sizeof(RGBA_t);
- break;
- }
- break;
- case INTENSITY :
- *dest++ = src[(posx+FRACUNIT/2)>>FRACBITS];
- break;
- case INTENSITY_ALPHA : // assume dest bpp = 2
- memcpy(dest, src + ((posx+FRACUNIT/2)>>FRACBITS)*sizeof(UINT16), sizeof(UINT16));
- dest += sizeof(UINT16);
- break;
- case RGB24 :
- break; // not supported yet
- case RGBA32 : // assume dest bpp = 4
- dest += sizeof(UINT32);
- memcpy(dest, src + ((posx+FRACUNIT/2)>>FRACBITS)*sizeof(UINT32), sizeof(UINT32));
- break;
- }
- posx += stepx;
- }
- posy += stepy;
- }
-}
-
-// -----------------+
-// HWR_GetPic : Download a Doom pic (raw row encoded with no 'holes')
-// Returns :
-// -----------------+
-GLPatch_t *HWR_GetPic(lumpnum_t lumpnum)
-{
- GLPatch_t *grpatch;
-
- grpatch = HWR_GetCachedGLPatch(lumpnum);
-
- if (!grpatch->mipmap.downloaded && !grpatch->mipmap.grInfo.data)
- {
- pic_t *pic;
- UINT8 *block;
- size_t len;
- INT32 newwidth, newheight;
-
- pic = W_CacheLumpNum(lumpnum, PU_CACHE);
- grpatch->width = SHORT(pic->width);
- grpatch->height = SHORT(pic->height);
- len = W_LumpLength(lumpnum) - sizeof (pic_t);
-
- grpatch->leftoffset = 0;
- grpatch->topoffset = 0;
-
- // find the good 3dfx size (boring spec)
- HWR_ResizeBlock (grpatch->width, grpatch->height, &grpatch->mipmap.grInfo);
- grpatch->mipmap.width = (UINT16)blockwidth;
- grpatch->mipmap.height = (UINT16)blockheight;
-
- if (pic->mode == PALETTE)
- grpatch->mipmap.grInfo.format = textureformat; // can be set by driver
- else
- grpatch->mipmap.grInfo.format = picmode2GR[pic->mode];
-
- Z_Free(grpatch->mipmap.grInfo.data);
-
- // allocate block
- block = MakeBlock(&grpatch->mipmap);
-
- // if rounddown, rounddown patches as well as textures
- if (cv_grrounddown.value)
- {
- newwidth = blockwidth;
- newheight = blockheight;
- }
- else
- {
- // 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 (grpatch->width == blockwidth &&
- grpatch->height == blockheight &&
- format2bpp[grpatch->mipmap.grInfo.format] == format2bpp[picmode2GR[pic->mode]])
- {
- // no conversion needed
- M_Memcpy(grpatch->mipmap.grInfo.data, pic->data,len);
- }
- else
- HWR_DrawPicInCache(block, newwidth, newheight,
- blockwidth*format2bpp[grpatch->mipmap.grInfo.format],
- pic,
- format2bpp[grpatch->mipmap.grInfo.format]);
-
- Z_Unlock(pic);
- Z_ChangeTag(block, PU_HWRCACHE_UNLOCKED);
-
- grpatch->mipmap.flags = 0;
- grpatch->max_s = (float)newwidth / (float)blockwidth;
- grpatch->max_t = (float)newheight / (float)blockheight;
- }
- HWD.pfnSetTexture(&grpatch->mipmap);
- //CONS_Debug(DBG_RENDER, "picloaded at %x as texture %d\n",grpatch->mipmap.grInfo.data, grpatch->mipmap.downloaded);
-
- return grpatch;
-}
-
GLPatch_t *HWR_GetCachedGLPatchPwad(UINT16 wadnum, UINT16 lumpnum)
{
aatree_t *hwrcache = wadfiles[wadnum]->hwrcache;
diff --git a/src/hardware/hw_clip.c b/src/hardware/hw_clip.c
index a6352708..8ef5636a 100644
--- a/src/hardware/hw_clip.c
+++ b/src/hardware/hw_clip.c
@@ -70,16 +70,17 @@
#include
#include "../v_video.h"
+#include "hw_main.h"
#include "hw_clip.h"
#include "hw_glob.h"
-#include "../r_main.h"
#include "../r_state.h"
#include "../tables.h"
#include "r_opengl/r_opengl.h"
+#include "../r_main.h" // for cv_fov
#ifdef HAVE_SPHEREFRUSTRUM
-static GLfloat viewMatrix[16];
-static GLfloat projMatrix[16];
+static GLdouble viewMatrix[16];
+static GLdouble projMatrix[16];
float frustum[6][4];
#endif
@@ -320,12 +321,12 @@ void gld_clipper_Clear(void)
#define RMUL (1.6f/1.333333f)
-angle_t gld_FrustumAngle(void)
+angle_t gld_FrustumAngle(angle_t tiltangle)
{
double floatangle;
angle_t a1;
- float tilt = (float)fabs(((double)(int)aimingangle) / ANG1);
+ float tilt = (float)fabs(((double)(int)tiltangle) / ANG1);
// NEWCLIP TODO: SRB2CBTODO: make a global render_fov for this function
@@ -334,12 +335,10 @@ angle_t gld_FrustumAngle(void)
float render_multiplier = 64.0f / render_fovratio / RMUL;
if (tilt > 90.0f)
- {
tilt = 90.0f;
- }
// If the pitch is larger than this you can look all around at a FOV of 90
- if (abs((signed)aimingangle) > 46 * ANG1)
+ if (abs((signed)tiltangle) > 46 * ANG1)
return 0xffffffff;
// ok, this is a gross hack that barely works...
@@ -352,7 +351,7 @@ angle_t gld_FrustumAngle(void)
}
// SRB2CB I don't think used any of this stuff, let's disable for now since SRB2 probably doesn't want it either
-// compiler complains about (p)glGetDoublev anyway, in case anyone wants this
+// compiler complains about (p)glGetFloatv anyway, in case anyone wants this
// only r_opengl.c can use the base gl funcs as it turns out, that's a problem for whoever wants sphere frustum checks
// btw to renable define HAVE_SPHEREFRUSTRUM in hw_clip.h
#ifdef HAVE_SPHEREFRUSTRUM
@@ -381,7 +380,7 @@ void gld_FrustrumSetup(void)
float t;
float clip[16];
- pglGeFloatv(GL_PROJECTION_MATRIX, projMatrix);
+ pglGetFloatv(GL_PROJECTION_MATRIX, projMatrix);
pglGetFloatv(GL_MODELVIEW_MATRIX, viewMatrix);
clip[0] = CALCMATRIX(0, 0, 1, 4, 2, 8, 3, 12);
@@ -463,4 +462,4 @@ boolean gld_SphereInFrustum(float x, float y, float z, float radius)
}
return true;
}
-#endif
+#endif
\ No newline at end of file
diff --git a/src/hardware/hw_clip.h b/src/hardware/hw_clip.h
index 3ba26e5e..27a2ed1e 100644
--- a/src/hardware/hw_clip.h
+++ b/src/hardware/hw_clip.h
@@ -17,7 +17,7 @@
boolean gld_clipper_SafeCheckRange(angle_t startAngle, angle_t endAngle);
void gld_clipper_SafeAddClipRange(angle_t startangle, angle_t endangle);
void gld_clipper_Clear(void);
-angle_t gld_FrustumAngle(void);
+angle_t gld_FrustumAngle(angle_t tiltangle);
#ifdef HAVE_SPHEREFRUSTRUM
void gld_FrustrumSetup(void);
boolean gld_SphereInFrustum(float x, float y, float z, float radius);
diff --git a/src/hardware/hw_data.h b/src/hardware/hw_data.h
index 4bbc578e..b80f5de8 100644
--- a/src/hardware/hw_data.h
+++ b/src/hardware/hw_data.h
@@ -1,77 +1,101 @@
-// Emacs style mode select -*- C++ -*-
+// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
-//
+// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
+// Copyright (C) 1999-2019 by Sonic Team Junior.
//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file
-/// \brief defines structures and exports for the standard 3D driver DLL used by Doom Legacy
+/// \brief defines structures and exports for the standard GPU driver
#ifndef _HWR_DATA_
#define _HWR_DATA_
-#if defined (_WIN32) && !defined (__CYGWIN__) && !defined (_XBOX)
-//#define WIN32_LEAN_AND_MEAN
-#define RPC_NO_WINDOWS_H
-#include
-#endif
-
#include "../doomdef.h"
-//THIS MUST DISAPPEAR!!!
-#include "hw_glide.h"
#include "../screen.h"
-
// ==========================================================================
// TEXTURE INFO
// ==========================================================================
+//
+// hw_glide.h
+//
+
+typedef long GLAspectRatio_t;
+#define GR_ASPECT_LOG2_8x1 3 /* 8W x 1H */
+#define GR_ASPECT_LOG2_4x1 2 /* 4W x 1H */
+#define GR_ASPECT_LOG2_2x1 1 /* 2W x 1H */
+#define GR_ASPECT_LOG2_1x1 0 /* 1W x 1H */
+#define GR_ASPECT_LOG2_1x2 -1 /* 1W x 2H */
+#define GR_ASPECT_LOG2_1x4 -2 /* 1W x 4H */
+#define GR_ASPECT_LOG2_1x8 -3 /* 1W x 8H */
+
+typedef long GLlod_t;
+#define GR_LOD_LOG2_256 0x8
+#define GR_LOD_LOG2_128 0x7
+#define GR_LOD_LOG2_64 0x6
+#define GR_LOD_LOG2_32 0x5
+#define GR_LOD_LOG2_16 0x4
+#define GR_LOD_LOG2_8 0x3
+#define GR_LOD_LOG2_4 0x2
+#define GR_LOD_LOG2_2 0x1
+#define GR_LOD_LOG2_1 0x0
+
+typedef long GLTextureFormat_t;
+#define GR_TEXFMT_ALPHA_8 0x2 /* (0..0xFF) alpha */
+#define GR_TEXFMT_INTENSITY_8 0x3 /* (0..0xFF) intensity */
+#define GR_TEXFMT_ALPHA_INTENSITY_44 0x4
+#define GR_TEXFMT_P_8 0x5 /* 8-bit palette */
+#define GR_TEXFMT_RGB_565 0xa
+#define GR_TEXFMT_ARGB_1555 0xb
+#define GR_TEXFMT_ARGB_4444 0xc
+#define GR_TEXFMT_ALPHA_INTENSITY_88 0xd
+#define GR_TEXFMT_AP_88 0xe /* 8-bit alpha 8-bit palette */
+#define GR_RGBA 0x6 // 32 bit RGBA !
+
+typedef struct
+{
+ GLlod_t smallLodLog2;
+ GLlod_t largeLodLog2;
+ GLAspectRatio_t aspectRatioLog2;
+ GLTextureFormat_t format;
+ void *data;
+} GLTexInfo;
+
// grInfo.data holds the address of the graphics data cached in heap memory
// NULL if the texture is not in Doom heap cache.
struct GLMipmap_s
{
- GrTexInfo grInfo; //for TexDownloadMipMap
- FxU32 flags;
- UINT16 height;
- UINT16 width;
- UINT32 downloaded; // the dll driver have it in there cache ?
+ GLTexInfo grInfo;
+ unsigned long flags;
+ UINT16 width, height;
+ UINT32 downloaded; // tex_downloaded
- struct GLMipmap_s *nextcolormap;
- const UINT8 *colormap;
-
- // opengl
- struct GLMipmap_s *nextmipmap; // opengl : liste of all texture in opengl driver
+ struct GLMipmap_s *nextmipmap;
+ struct GLMipmap_s *nextcolormap;
+ const UINT8 *colormap;
};
typedef struct GLMipmap_s GLMipmap_t;
-
//
// Doom texture info, as cached for hardware rendering
//
struct GLTexture_s
{
- GLMipmap_t mipmap;
- float scaleX; //used for scaling textures on walls
- float scaleY;
+ GLMipmap_t mipmap;
+ float scaleX; //used for scaling textures on walls
+ float scaleY;
};
typedef struct GLTexture_s GLTexture_t;
-
// a cached patch as converted to hardware format, holding the original patch_t
// header so that the existing code can retrieve ->width, ->height as usual
// This is returned by W_CachePatchNum()/W_CachePatchName(), when rendermode
// is 'render_opengl'. Else it returns the normal patch_t data.
-
struct GLPatch_s
{
// the 4 first fields come right away from the original patch_t
diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h
index b37850bb..f5839520 100644
--- a/src/hardware/hw_defs.h
+++ b/src/hardware/hw_defs.h
@@ -19,6 +19,7 @@
#ifndef _HWR_DEFS_
#define _HWR_DEFS_
#include "../doomtype.h"
+#include "../r_defs.h"
#define ZCLIP_PLANE 4.0f // Used for the actual game drawing
#define NZCLIP_PLANE 0.9f // Seems to be only used for the HUD and screen textures
@@ -41,17 +42,8 @@ typedef unsigned char FBOOLEAN;
// ==========================================================================
// byte value for paletted graphics, which represent the transparent color
-#ifdef _NDS
-// NDS is hardwired to use zero as transparent color
-#define HWR_PATCHES_CHROMAKEY_COLORINDEX 0
-#define HWR_CHROMAKEY_EQUIVALENTCOLORINDEX 1
-#else
#define HWR_PATCHES_CHROMAKEY_COLORINDEX 247
#define HWR_CHROMAKEY_EQUIVALENTCOLORINDEX 220
-#endif
-
-// the chroma key color shows on border sprites, set it to black
-#define HWR_PATCHES_CHROMAKEY_COLORVALUE (0x00000000) //RGBA format as in grSstWinOpen()
// RGBA Color components with float type ranging [ 0 ... 1 ]
struct FRGBAFloat
@@ -73,8 +65,6 @@ struct FColorARGB
typedef struct FColorARGB ARGB_t;
typedef struct FColorARGB FColorARGB;
-
-
// ==========================================================================
// VECTORS
// ==========================================================================
@@ -85,22 +75,65 @@ typedef struct
FLOAT x,y;
} F2DCoord, v2d_t;
-// Simple 3D vector
-typedef struct FVector
-{
- FLOAT x,y,z;
-} FVector;
+// ======================
+// wallVert3D
+// ----------------------
+// :crab: IS GONE! :crab:
+// ======================
-// 3D model vector (coords + texture coords)
+// -----------
+// structures
+// -----------
+
+// a vertex of a Doom 'plane' polygon
typedef struct
{
- //FVector Point;
- FLOAT x,y,z;
- FLOAT s,t,w; // texture coordinates
-} v3d_t, wallVert3D;
+ float x;
+ float y;
+ float z;
+} polyvertex_t;
-//Hurdler: Transform (coords + angles)
-//BP: transform order : scale(rotation_x(rotation_y(translation(v))))
+#ifdef _MSC_VER
+#pragma warning(disable : 4200)
+#endif
+
+// a convex 'plane' polygon, clockwise order
+typedef struct
+{
+ INT32 numpts;
+ polyvertex_t pts[0];
+} poly_t;
+
+#ifdef _MSC_VER
+#pragma warning(default : 4200)
+#endif
+
+// holds extra info for 3D render, for each subsector in subsectors[]
+typedef struct
+{
+ poly_t *planepoly; // the generated convex polygon
+} extrasubsector_t;
+
+// needed for sprite rendering
+// equivalent of the software renderer's vissprites
+typedef struct gr_vissprite_s
+{
+ // Doubly linked list
+ struct gr_vissprite_s *prev;
+ struct gr_vissprite_s *next;
+ float x1, x2;
+ float z1, z2;
+ float tz, ty;
+ lumpnum_t patchlumpnum;
+ boolean flip;
+ UINT8 translucency; //alpha level 0-255
+ mobj_t *mobj;
+ boolean precip; // Tails 08-25-2002
+ boolean vflip;
+ //Hurdler: 25/04/2000: now support colormap in hardware mode
+ UINT8 *colormap;
+ INT32 dispoffset; // copy of info->dispoffset, affects ordering but not drawing
+} gr_vissprite_t;
// Kart features
#define USE_FTRANSFORM_ANGLEZ
@@ -124,18 +157,17 @@ typedef struct
#ifdef USE_FTRANSFORM_MIRROR
boolean mirror; // SRB2Kart: Encore Mode
#endif
+ boolean shearing; // 14042019
+ angle_t viewaiming; // 17052019
} FTransform;
// Transformed vector, as passed to HWR API
typedef struct
{
FLOAT x,y,z;
- FUINT argb; // flat-shaded color
- FLOAT sow; // s texture ordinate (s over w)
- FLOAT tow; // t texture ordinate (t over w)
+ FLOAT s,t;
} FOutVector;
-
// ==========================================================================
// RENDER MODES
// ==========================================================================
@@ -144,7 +176,7 @@ typedef struct
// You pass a combination of these flags to DrawPolygon()
enum EPolyFlags
{
- // the first 5 are mutually exclusive
+ // the first 5 are mutually exclusive
PF_Masked = 0x00000001, // Poly is alpha scaled and 0 alpha pels are discarded (holes in texture)
PF_Translucent = 0x00000002, // Poly is transparent, alpha = level of transparency
@@ -156,7 +188,7 @@ enum EPolyFlags
PF_Fog = 0x00000040, // Fog blocks
PF_Blending = (PF_Environment|PF_Additive|PF_Translucent|PF_Masked|PF_Substractive|PF_Fog)&~PF_NoAlphaTest,
- // other flag bits
+ // other flag bits
PF_Occlude = 0x00000100, // Update the depth buffer
PF_NoDepthTest = 0x00000200, // Disable the depth test mode
@@ -164,21 +196,15 @@ enum EPolyFlags
PF_Decal = 0x00000800, // Enable polygon offset
PF_Modulated = 0x00001000, // Modulation (multiply output with constant ARGB)
// When set, pass the color constant into the FSurfaceInfo -> FlatColor
- PF_NoTexture = 0x00002000, // Use the small white texture
- PF_Corona = 0x00004000, // Tell the rendrer we are drawing a corona
- PF_Unused = 0x00008000, // Unused
+ PF_NoTexture = 0x00002000, // Disable texture
+ PF_Ripple = 0x00004000, // Water shader effect
+ // 0x00008000
PF_RemoveYWrap = 0x00010000, // Force clamp texture on Y
PF_ForceWrapX = 0x00020000, // Force repeat texture on X
PF_ForceWrapY = 0x00040000, // Force repeat texture on Y
- PF_Clip = 0x40000000, // clip to frustum and nearz plane (glide only, automatic in opengl)
- PF_NoZClip = 0x20000000, // in conjonction with PF_Clip
- PF_Debug = 0x80000000 // print debug message in driver :)
-};
-
-
-enum ESurfFlags
-{
- SF_DYNLIGHT = 0x00000001,
+ // 0x20000000
+ // 0x40000000
+ // 0x80000000
};
@@ -191,46 +217,42 @@ enum ETextureFlags
TF_TRANSPARENT = 0x00000040, // texture with some alpha == 0
};
-#ifdef TODO
-struct FTextureInfo
-{
- FUINT Width; // Pixels
- FUINT Height; // Pixels
- FUBYTE *TextureData; // Image data
- FUINT Format; // FORMAT_RGB, ALPHA ...
- FBITFIELD Flags; // Flags to tell driver about texture (see ETextureFlags)
- void DriverExtra; // (OpenGL texture object nr, ...)
- // chromakey enabled,...
-
- struct FTextureInfo *Next; // Manage list of downloaded textures.
-};
-#else
typedef struct GLMipmap_s FTextureInfo;
-#endif
+
+// jimita 14032019
+struct FLightInfo
+{
+ FUINT light_level;
+};
+typedef struct FLightInfo FLightInfo;
// Description of a renderable surface
struct FSurfaceInfo
{
- FUINT PolyFlags; // Surface flags -- UNUSED YET --
- RGBA_t FlatColor; // Flat-shaded color used with PF_Modulated mode
+ FUINT PolyFlags;
+ RGBA_t PolyColor;
+ RGBA_t FadeColor;
+ FLightInfo LightInfo; // jimita 14032019
};
typedef struct FSurfaceInfo FSurfaceInfo;
-//Hurdler: added for backward compatibility
enum hwdsetspecialstate
{
- HWD_SET_FOG_TABLE = 1,
+ HWD_SET_SHADERS,
+
HWD_SET_FOG_MODE,
- HWD_SET_FOG_COLOR,
HWD_SET_FOG_DENSITY,
- HWD_SET_FOV,
+
HWD_SET_TEXTUREFILTERMODE,
HWD_SET_TEXTUREANISOTROPICMODE,
+
HWD_NUMSTATE
};
-
typedef enum hwdsetspecialstate hwdspecialstate_t;
+#define GL_NORMALFOG 0x00000000
+#define GL_FADEFOG 0x19000000
+
enum hwdfiltermode
{
HWD_SET_TEXTUREFILTER_POINTSAMPLED,
@@ -241,5 +263,4 @@ enum hwdfiltermode
HWD_SET_TEXTUREFILTER_MIXED3,
};
-
#endif //_HWR_DEFS_
diff --git a/src/hardware/hw_dll.h b/src/hardware/hw_dll.h
index 46645278..14040432 100644
--- a/src/hardware/hw_dll.h
+++ b/src/hardware/hw_dll.h
@@ -54,8 +54,6 @@
#endif
#endif
-typedef void (*I_Error_t) (const char *error, ...) FUNCIERROR;
-
// ==========================================================================
// MATHS
// ==========================================================================
@@ -63,7 +61,8 @@ typedef void (*I_Error_t) (const char *error, ...) FUNCIERROR;
// Constants
#define DEGREE (0.017453292519943295769236907684883l) // 2*PI/360
-void DBG_Printf(const char *lpFmt, ...) /*FUNCPRINTF*/;
+void GL_DBG_Printf(const char *format, ...) /*FUNCPRINTF*/;
+#define DBG_Printf GL_DBG_Printf
#ifdef _WINDOWS
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);
diff --git a/src/hardware/hw_draw.c b/src/hardware/hw_draw.c
index b39103ee..4a0c0380 100644
--- a/src/hardware/hw_draw.c
+++ b/src/hardware/hw_draw.c
@@ -1,17 +1,12 @@
-// Emacs style mode select -*- C++ -*-
+// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
-//
+// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
+// Copyright (C) 1999-2019 by Sonic Team Junior.
//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file
/// \brief miscellaneous drawing (mainly 2d)
@@ -23,6 +18,7 @@
#include "../doomdef.h"
#ifdef HWRENDER
+#include "hw_main.h"
#include "hw_glob.h"
#include "hw_drv.h"
@@ -41,9 +37,6 @@
#define O_BINARY 0
#endif
-float gr_patch_scalex;
-float gr_patch_scaley;
-
#if defined(_MSC_VER)
#pragma pack(1)
#endif
@@ -63,9 +56,6 @@ typedef struct
#if defined(_MSC_VER)
#pragma pack()
#endif
-typedef UINT8 GLRGB[3];
-
-#define BLENDMODE PF_Translucent
static UINT8 softwaretranstogl[11] = { 0, 25, 51, 76,102,127,153,178,204,229,255};
static UINT8 softwaretranstogl_hi[11] = { 0, 51,102,153,204,255,255,255,255,255,255};
@@ -119,12 +109,12 @@ void HWR_DrawPatch(GLPatch_t *gpatch, INT32 x, INT32 y, INT32 option)
v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
- v[0].sow = v[3].sow = 0.0f;
- v[2].sow = v[1].sow = gpatch->max_s;
- v[0].tow = v[1].tow = 0.0f;
- v[2].tow = v[3].tow = gpatch->max_t;
+ v[0].s = v[3].s = 0.0f;
+ v[2].s = v[1].s = gpatch->max_s;
+ v[0].t = v[1].t = 0.0f;
+ v[2].t = v[3].t = gpatch->max_t;
- flags = BLENDMODE|PF_Clip|PF_NoZClip|PF_NoDepthTest;
+ flags = PF_Translucent|PF_NoDepthTest;
if (option & V_WRAPX)
flags |= PF_ForceWrapX;
@@ -220,7 +210,7 @@ void HWR_DrawFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
// if it's meant to cover the whole screen, black out the rest
// cx and cy are possibly *slightly* off from float maths
// This is done before here compared to software because we directly alter cx and cy to centre
- /*if (cx >= -0.1f && cx <= 0.1f && SHORT(gpatch->width) == BASEVIDWIDTH && cy >= -0.1f && cy <= 0.1f && SHORT(gpatch->height) == BASEVIDHEIGHT)
+ if (cx >= -0.1f && cx <= 0.1f && SHORT(gpatch->width) == BASEVIDWIDTH && cy >= -0.1f && cy <= 0.1f && SHORT(gpatch->height) == BASEVIDHEIGHT)
{
// Need to temporarily cache the real patch to get the colour of the top left pixel
patch_t *realpatch = W_CacheLumpNumPwad(gpatch->wadnum, gpatch->lumpnum, PU_STATIC);
@@ -228,7 +218,7 @@ void HWR_DrawFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
const UINT8 *source = (const UINT8 *)(column) + 3;
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (column->topdelta == 0xff ? 31 : source[0]));
Z_Free(realpatch);
- }*/
+ }
// centre screen
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f)
{
@@ -279,19 +269,19 @@ void HWR_DrawFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
if (option & V_FLIP)
{
- v[0].sow = v[3].sow = gpatch->max_s;
- v[2].sow = v[1].sow = 0.0f;
+ v[0].s = v[3].s = gpatch->max_s;
+ v[2].s = v[1].s = 0.0f;
}
else
{
- v[0].sow = v[3].sow = 0.0f;
- v[2].sow = v[1].sow = gpatch->max_s;
+ v[0].s = v[3].s = 0.0f;
+ v[2].s = v[1].s = gpatch->max_s;
}
- v[0].tow = v[1].tow = 0.0f;
- v[2].tow = v[3].tow = gpatch->max_t;
+ v[0].t = v[1].t = 0.0f;
+ v[2].t = v[3].t = gpatch->max_t;
- flags = BLENDMODE|PF_Clip|PF_NoZClip|PF_NoDepthTest;
+ flags = PF_Translucent|PF_NoDepthTest;
if (option & V_WRAPX)
flags |= PF_ForceWrapX;
@@ -302,11 +292,11 @@ void HWR_DrawFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale,
if (alphalevel)
{
FSurfaceInfo Surf;
- Surf.FlatColor.s.red = Surf.FlatColor.s.green = Surf.FlatColor.s.blue = 0xff;
- if (alphalevel == 13) Surf.FlatColor.s.alpha = softwaretranstogl_lo[hudtrans];
- else if (alphalevel == 14) Surf.FlatColor.s.alpha = softwaretranstogl[hudtrans];
- else if (alphalevel == 15) Surf.FlatColor.s.alpha = softwaretranstogl_hi[hudtrans];
- else Surf.FlatColor.s.alpha = softwaretranstogl[10-alphalevel];
+ Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff;
+ if (alphalevel == 13) Surf.PolyColor.s.alpha = softwaretranstogl_lo[cv_translucenthud.value];
+ else if (alphalevel == 14) Surf.PolyColor.s.alpha = softwaretranstogl[cv_translucenthud.value];
+ else if (alphalevel == 15) Surf.PolyColor.s.alpha = softwaretranstogl_hi[cv_translucenthud.value];
+ else Surf.PolyColor.s.alpha = softwaretranstogl[10-alphalevel];
flags |= PF_Modulated;
HWD.pfnDrawPolygon(&Surf, v, 4, flags);
}
@@ -368,7 +358,7 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal
// if it's meant to cover the whole screen, black out the rest
// cx and cy are possibly *slightly* off from float maths
// This is done before here compared to software because we directly alter cx and cy to centre
- /*if (cx >= -0.1f && cx <= 0.1f && SHORT(gpatch->width) == BASEVIDWIDTH && cy >= -0.1f && cy <= 0.1f && SHORT(gpatch->height) == BASEVIDHEIGHT)
+ if (cx >= -0.1f && cx <= 0.1f && SHORT(gpatch->width) == BASEVIDWIDTH && cy >= -0.1f && cy <= 0.1f && SHORT(gpatch->height) == BASEVIDHEIGHT)
{
// Need to temporarily cache the real patch to get the colour of the top left pixel
patch_t *realpatch = W_CacheLumpNumPwad(gpatch->wadnum, gpatch->lumpnum, PU_STATIC);
@@ -376,7 +366,7 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal
const UINT8 *source = (const UINT8 *)(column) + 3;
HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (column->topdelta == 0xff ? 31 : source[0]));
Z_Free(realpatch);
- }*/
+ }
// centre screen
if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f)
{
@@ -440,12 +430,12 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal
v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
- v[0].sow = v[3].sow = ((sx)/(float)SHORT(gpatch->width) )*gpatch->max_s;
- v[2].sow = v[1].sow = ((w )/(float)SHORT(gpatch->width) )*gpatch->max_s;
- v[0].tow = v[1].tow = ((sy)/(float)SHORT(gpatch->height))*gpatch->max_t;
- v[2].tow = v[3].tow = ((h )/(float)SHORT(gpatch->height))*gpatch->max_t;
+ v[0].s = v[3].s = ((sx)/(float)SHORT(gpatch->width) )*gpatch->max_s;
+ v[2].s = v[1].s = ((w )/(float)SHORT(gpatch->width) )*gpatch->max_s;
+ v[0].t = v[1].t = ((sy)/(float)SHORT(gpatch->height))*gpatch->max_t;
+ v[2].t = v[3].t = ((h )/(float)SHORT(gpatch->height))*gpatch->max_t;
- flags = BLENDMODE|PF_Clip|PF_NoZClip|PF_NoDepthTest;
+ flags = PF_Translucent|PF_NoDepthTest;
if (option & V_WRAPX)
flags |= PF_ForceWrapX;
@@ -456,11 +446,11 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal
if (alphalevel)
{
FSurfaceInfo Surf;
- Surf.FlatColor.s.red = Surf.FlatColor.s.green = Surf.FlatColor.s.blue = 0xff;
- if (alphalevel == 13) Surf.FlatColor.s.alpha = softwaretranstogl_lo[hudtrans];
- else if (alphalevel == 14) Surf.FlatColor.s.alpha = softwaretranstogl[hudtrans];
- else if (alphalevel == 15) Surf.FlatColor.s.alpha = softwaretranstogl_hi[hudtrans];
- else Surf.FlatColor.s.alpha = softwaretranstogl[10-alphalevel];
+ Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff;
+ if (alphalevel == 13) Surf.PolyColor.s.alpha = softwaretranstogl_lo[cv_translucenthud.value];
+ else if (alphalevel == 14) Surf.PolyColor.s.alpha = softwaretranstogl[cv_translucenthud.value];
+ else if (alphalevel == 15) Surf.PolyColor.s.alpha = softwaretranstogl_hi[cv_translucenthud.value];
+ else Surf.PolyColor.s.alpha = softwaretranstogl[10-alphalevel];
flags |= PF_Modulated;
HWD.pfnDrawPolygon(&Surf, v, 4, flags);
}
@@ -468,41 +458,6 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal
HWD.pfnDrawPolygon(NULL, v, 4, flags);
}
-void HWR_DrawPic(INT32 x, INT32 y, lumpnum_t lumpnum)
-{
- FOutVector v[4];
- const GLPatch_t *patch;
-
- // make pic ready in hardware cache
- patch = HWR_GetPic(lumpnum);
-
-// 3--2
-// | /|
-// |/ |
-// 0--1
-
- v[0].x = v[3].x = 2.0f * (float)x/vid.width - 1;
- v[2].x = v[1].x = 2.0f * (float)(x + patch->width*FIXED_TO_FLOAT(vid.fdupx))/vid.width - 1;
- v[0].y = v[1].y = 1.0f - 2.0f * (float)y/vid.height;
- v[2].y = v[3].y = 1.0f - 2.0f * (float)(y + patch->height*FIXED_TO_FLOAT(vid.fdupy))/vid.height;
-
- v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
-
- v[0].sow = v[3].sow = 0;
- v[2].sow = v[1].sow = patch->max_s;
- v[0].tow = v[1].tow = 0;
- v[2].tow = v[3].tow = patch->max_t;
-
-
- //Hurdler: Boris, the same comment as above... but maybe for pics
- // it not a problem since they don't have any transparent pixel
- // if I'm right !?
- // But then, the question is: why not 0 instead of PF_Masked ?
- // or maybe PF_Environment ??? (like what I said above)
- // BP: PF_Environment don't change anything ! and 0 is undifined
- HWD.pfnDrawPolygon(NULL, v, 4, BLENDMODE | PF_NoDepthTest | PF_Clip | PF_NoZClip);
-}
-
// ==========================================================================
// V_VIDEO.C STUFF
// ==========================================================================
@@ -563,12 +518,12 @@ void HWR_DrawFlatFill (INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatlumpnum
v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
// flat is 64x64 lod and texture offsets are [0.0, 1.0]
- v[0].sow = v[3].sow = (float)((x & flatflag)/dflatsize);
- v[2].sow = v[1].sow = (float)(v[0].sow + w/dflatsize);
- v[0].tow = v[1].tow = (float)((y & flatflag)/dflatsize);
- v[2].tow = v[3].tow = (float)(v[0].tow + h/dflatsize);
+ v[0].s = v[3].s = (float)((x & flatflag)/dflatsize);
+ v[2].s = v[1].s = (float)(v[0].s + w/dflatsize);
+ v[0].t = v[1].t = (float)((y & flatflag)/dflatsize);
+ v[2].t = v[3].t = (float)(v[0].t + h/dflatsize);
- HWR_GetFlat(flatlumpnum);
+ HWR_GetFlat(flatlumpnum, false); // Never Encore map drawflatfill, duh.
//Hurdler: Boris, the same comment as above... but maybe for pics
// it not a problem since they don't have any transparent pixel
@@ -598,20 +553,20 @@ void HWR_FadeScreenMenuBack(UINT16 color, UINT8 strength)
v[2].y = v[3].y = 1.0f;
v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
- v[0].sow = v[3].sow = 0.0f;
- v[2].sow = v[1].sow = 1.0f;
- v[0].tow = v[1].tow = 1.0f;
- v[2].tow = v[3].tow = 0.0f;
+ v[0].s = v[3].s = 0.0f;
+ v[2].s = v[1].s = 1.0f;
+ v[0].t = v[1].t = 1.0f;
+ v[2].t = v[3].t = 0.0f;
if (color & 0xFF00) // Do COLORMAP fade.
{
- Surf.FlatColor.rgba = UINT2RGBA(0x01010160);
- Surf.FlatColor.s.alpha = (strength*8);
+ Surf.PolyColor.rgba = UINT2RGBA(0x01010160);
+ Surf.PolyColor.s.alpha = (strength*8);
}
else // Do TRANSMAP** fade.
{
- Surf.FlatColor.rgba = pLocalPalette[color].rgba;
- Surf.FlatColor.s.alpha = (UINT8)(strength*25.5f);
+ Surf.PolyColor.rgba = pLocalPalette[color].rgba;
+ Surf.PolyColor.s.alpha = (UINT8)(strength*25.5f);
}
HWD.pfnDrawPolygon(&Surf, v, 4, PF_NoTexture|PF_Modulated|PF_Translucent|PF_NoDepthTest);
}
@@ -632,13 +587,13 @@ void HWR_DrawConsoleBack(UINT32 color, INT32 height)
v[2].y = v[3].y = 1.0f;
v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
- v[0].sow = v[3].sow = 0.0f;
- v[2].sow = v[1].sow = 1.0f;
- v[0].tow = v[1].tow = 1.0f;
- v[2].tow = v[3].tow = 0.0f;
+ v[0].s = v[3].s = 0.0f;
+ v[2].s = v[1].s = 1.0f;
+ v[0].t = v[1].t = 1.0f;
+ v[2].t = v[3].t = 0.0f;
- Surf.FlatColor.rgba = UINT2RGBA(color);
- Surf.FlatColor.s.alpha = 0x80;
+ Surf.PolyColor.rgba = UINT2RGBA(color);
+ Surf.PolyColor.s.alpha = 0x80;
HWD.pfnDrawPolygon(&Surf, v, 4, PF_NoTexture|PF_Modulated|PF_Translucent|PF_NoDepthTest);
}
@@ -773,6 +728,7 @@ void HWR_DrawViewBorder(INT32 clearlines)
}
+
// ==========================================================================
// AM_MAP.C DRAWING STUFF
// ==========================================================================
@@ -797,225 +753,6 @@ void HWR_drawAMline(const fline_t *fl, INT32 color)
HWD.pfnDraw2DLine(&v1, &v2, color_rgba);
}
-// -----------------+
-// HWR_DrawFill : draw flat coloured rectangle, with no texture
-// -----------------+
-void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
-{
- FOutVector v[4];
- FSurfaceInfo Surf;
- float fx, fy, fw, fh;
-
- if (w < 0 || h < 0)
- return; // consistency w/ software
-
-// 3--2
-// | /|
-// |/ |
-// 0--1
-
- fx = (float)x;
- fy = (float)y;
- fw = (float)w;
- fh = (float)h;
-
- if (!(color & V_NOSCALESTART))
- {
- float dupx = (float)vid.dupx, dupy = (float)vid.dupy;
-
- if (x == 0 && y == 0 && w == BASEVIDWIDTH && h == BASEVIDHEIGHT)
- {
- RGBA_t rgbaColour = V_GetColor(color);
- FRGBAFloat clearColour;
- clearColour.red = (float)rgbaColour.s.red / 255;
- clearColour.green = (float)rgbaColour.s.green / 255;
- clearColour.blue = (float)rgbaColour.s.blue / 255;
- clearColour.alpha = 1;
- HWD.pfnClearBuffer(true, false, &clearColour);
- return;
- }
-
- fx *= dupx;
- fy *= dupy;
- fw *= dupx;
- fh *= dupy;
-
- if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f)
- {
- if (color & V_SNAPTORIGHT)
- fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx));
- else if (!(color & V_SNAPTOLEFT))
- fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2;
- }
- if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f)
- {
- // same thing here
- if (color & V_SNAPTOBOTTOM)
- fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy));
- else if (!(color & V_SNAPTOTOP))
- fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2;
- }
- if (color & V_SPLITSCREEN)
- fy += ((float)BASEVIDHEIGHT * dupy)/2;
- if (color & V_HORZSCREEN)
- fx += ((float)BASEVIDWIDTH * dupx)/2;
- }
-
- if (fx >= vid.width || fy >= vid.height)
- return;
- if (fx < 0)
- {
- fw += fx;
- fx = 0;
- }
- if (fy < 0)
- {
- fh += fy;
- fy = 0;
- }
-
- if (fw <= 0 || fh <= 0)
- return;
- if (fx + fw > vid.width)
- fw = (float)vid.width - fx;
- if (fy + fh > vid.height)
- fh = (float)vid.height - fy;
-
- fx = -1 + fx / (vid.width / 2);
- fy = 1 - fy / (vid.height / 2);
- fw = fw / (vid.width / 2);
- fh = fh / (vid.height / 2);
-
- v[0].x = v[3].x = fx;
- v[2].x = v[1].x = fx + fw;
- v[0].y = v[1].y = fy;
- v[2].y = v[3].y = fy - fh;
-
- //Hurdler: do we still use this argb color? if not, we should remove it
- v[0].argb = v[1].argb = v[2].argb = v[3].argb = 0xff00ff00; //;
- v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
-
- v[0].sow = v[3].sow = 0.0f;
- v[2].sow = v[1].sow = 1.0f;
- v[0].tow = v[1].tow = 0.0f;
- v[2].tow = v[3].tow = 1.0f;
-
- Surf.FlatColor = V_GetColor(color);
-
- HWD.pfnDrawPolygon(&Surf, v, 4,
- PF_Modulated|PF_NoTexture|PF_NoDepthTest);
-}
-
-
-// -------------------+
-// HWR_DrawConsoleFill : draw flat coloured transparent rectangle because that's cool, and hw sucks less than sw for that.
-// -------------------+
-void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32 options)
-{
- FOutVector v[4];
- FSurfaceInfo Surf;
- float fx, fy, fw, fh;
-
- if (w < 0 || h < 0)
- return; // consistency w/ software
-
-// 3--2
-// | /|
-// |/ |
-// 0--1
-
- fx = (float)x;
- fy = (float)y;
- fw = (float)w;
- fh = (float)h;
-
- if (!(options & V_NOSCALESTART))
- {
- float dupx = (float)vid.dupx, dupy = (float)vid.dupy;
-
- if (x == 0 && y == 0 && w == BASEVIDWIDTH && h == BASEVIDHEIGHT)
- {
- RGBA_t rgbaColour = V_GetColor(color);
- FRGBAFloat clearColour;
- clearColour.red = (float)rgbaColour.s.red / 255;
- clearColour.green = (float)rgbaColour.s.green / 255;
- clearColour.blue = (float)rgbaColour.s.blue / 255;
- clearColour.alpha = 1;
- HWD.pfnClearBuffer(true, false, &clearColour);
- return;
- }
-
- fx *= dupx;
- fy *= dupy;
- fw *= dupx;
- fh *= dupy;
-
- if (fabsf((float)vid.width - ((float)BASEVIDWIDTH * dupx)) > 1.0E-36f)
- {
- if (options & V_SNAPTORIGHT)
- fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx));
- else if (!(options & V_SNAPTOLEFT))
- fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2;
- }
- if (fabsf((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) > 1.0E-36f)
- {
- // same thing here
- if (options & V_SNAPTOBOTTOM)
- fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy));
- else if (!(options & V_SNAPTOTOP))
- fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2;
- }
- if (options & V_SPLITSCREEN)
- fy += ((float)BASEVIDHEIGHT * dupy)/2;
- if (options & V_HORZSCREEN)
- fx += ((float)BASEVIDWIDTH * dupx)/2;
- }
-
- if (fx >= vid.width || fy >= vid.height)
- return;
- if (fx < 0)
- {
- fw += fx;
- fx = 0;
- }
- if (fy < 0)
- {
- fh += fy;
- fy = 0;
- }
-
- if (fw <= 0 || fh <= 0)
- return;
- if (fx + fw > vid.width)
- fw = (float)vid.width - fx;
- if (fy + fh > vid.height)
- fh = (float)vid.height - fy;
-
- fx = -1 + fx / (vid.width / 2);
- fy = 1 - fy / (vid.height / 2);
- fw = fw / (vid.width / 2);
- fh = fh / (vid.height / 2);
-
- v[0].x = v[3].x = fx;
- v[2].x = v[1].x = fx + fw;
- v[0].y = v[1].y = fy;
- v[2].y = v[3].y = fy - fh;
-
- //Hurdler: do we still use this argb color? if not, we should remove it
- v[0].argb = v[1].argb = v[2].argb = v[3].argb = 0xff00ff00; //;
- v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
-
- v[0].sow = v[3].sow = 0.0f;
- v[2].sow = v[1].sow = 1.0f;
- v[0].tow = v[1].tow = 0.0f;
- v[2].tow = v[3].tow = 1.0f;
-
- Surf.FlatColor.rgba = UINT2RGBA(color);
- Surf.FlatColor.s.alpha = 0x80;
-
- HWD.pfnDrawPolygon(&Surf, v, 4, PF_NoTexture|PF_Modulated|PF_Translucent|PF_NoDepthTest);
-}
-
// -----------------+
// HWR_DrawDiag : draw flat coloured rectangle, with no texture
// -----------------+
@@ -1097,22 +834,234 @@ void HWR_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 color)
v[3].y = fy - fh;
v[2].y = fy - fwait;
- //Hurdler: do we still use this argb color? if not, we should remove it
- v[0].argb = v[1].argb = v[2].argb = v[3].argb = 0xff00ff00; //;
v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
- v[0].sow = v[3].sow = 0.0f;
- v[2].sow = v[1].sow = 1.0f;
- v[0].tow = v[1].tow = 0.0f;
- v[2].tow = v[3].tow = 1.0f;
+ v[0].s = v[3].s = 0.0f;
+ v[2].s = v[1].s = 1.0f;
+ v[0].t = v[1].t = 0.0f;
+ v[2].t = v[3].t = 1.0f;
- Surf.FlatColor = V_GetColor(color);
+ Surf.PolyColor = V_GetColor(color);
HWD.pfnDrawPolygon(&Surf, v, 4,
PF_Modulated|PF_NoTexture|PF_NoDepthTest);
}
+// -------------------+
+// HWR_DrawConsoleFill : draw flat coloured transparent rectangle because that's cool, and hw sucks less than sw for that.
+// -------------------+
+void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32 options)
+{
+ FOutVector v[4];
+ FSurfaceInfo Surf;
+ float fx, fy, fw, fh;
+ if (w < 0 || h < 0)
+ return; // consistency w/ software
+
+// 3--2
+// | /|
+// |/ |
+// 0--1
+
+ fx = (float)x;
+ fy = (float)y;
+ fw = (float)w;
+ fh = (float)h;
+
+ if (!(options & V_NOSCALESTART))
+ {
+ float dupx = (float)vid.dupx, dupy = (float)vid.dupy;
+
+ if (x == 0 && y == 0 && w == BASEVIDWIDTH && h == BASEVIDHEIGHT)
+ {
+ RGBA_t rgbaColour = V_GetColor(color);
+ FRGBAFloat clearColour;
+ clearColour.red = (float)rgbaColour.s.red / 255;
+ clearColour.green = (float)rgbaColour.s.green / 255;
+ clearColour.blue = (float)rgbaColour.s.blue / 255;
+ clearColour.alpha = 1;
+ HWD.pfnClearBuffer(true, false, &clearColour);
+ return;
+ }
+
+ fx *= dupx;
+ fy *= dupy;
+ fw *= dupx;
+ fh *= dupy;
+
+ if (fabsf((float)vid.width - ((float)BASEVIDWIDTH * dupx)) > 1.0E-36f)
+ {
+ if (options & V_SNAPTORIGHT)
+ fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx));
+ else if (!(options & V_SNAPTOLEFT))
+ fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2;
+ }
+ if (fabsf((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) > 1.0E-36f)
+ {
+ // same thing here
+ if (options & V_SNAPTOBOTTOM)
+ fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy));
+ else if (!(options & V_SNAPTOTOP))
+ fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2;
+ }
+ if (options & V_SPLITSCREEN)
+ fy += ((float)BASEVIDHEIGHT * dupy)/2;
+ if (options & V_HORZSCREEN)
+ fx += ((float)BASEVIDWIDTH * dupx)/2;
+
+ }
+
+ if (fx >= vid.width || fy >= vid.height)
+ return;
+ if (fx < 0)
+ {
+ fw += fx;
+ fx = 0;
+ }
+ if (fy < 0)
+ {
+ fh += fy;
+ fy = 0;
+ }
+
+ if (fw <= 0 || fh <= 0)
+ return;
+ if (fx + fw > vid.width)
+ fw = (float)vid.width - fx;
+ if (fy + fh > vid.height)
+ fh = (float)vid.height - fy;
+
+ fx = -1 + fx / (vid.width / 2);
+ fy = 1 - fy / (vid.height / 2);
+ fw = fw / (vid.width / 2);
+ fh = fh / (vid.height / 2);
+
+ v[0].x = v[3].x = fx;
+ v[2].x = v[1].x = fx + fw;
+ v[0].y = v[1].y = fy;
+ v[2].y = v[3].y = fy - fh;
+
+ v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
+
+ v[0].s = v[3].s = 0.0f;
+ v[2].s = v[1].s = 1.0f;
+ v[0].t = v[1].t = 0.0f;
+ v[2].t = v[3].t = 1.0f;
+
+ Surf.PolyColor.rgba = UINT2RGBA(color);
+ Surf.PolyColor.s.alpha = 0x80;
+
+ HWD.pfnDrawPolygon(&Surf, v, 4, PF_NoTexture|PF_Modulated|PF_Translucent|PF_NoDepthTest);
+}
+
+// -----------------+
+// HWR_DrawFill : draw flat coloured rectangle, with no texture
+// -----------------+
+void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color)
+{
+ FOutVector v[4];
+ FSurfaceInfo Surf;
+ float fx, fy, fw, fh;
+
+ if (w < 0 || h < 0)
+ return; // consistency w/ software
+
+// 3--2
+// | /|
+// |/ |
+// 0--1
+
+ fx = (float)x;
+ fy = (float)y;
+ fw = (float)w;
+ fh = (float)h;
+
+ if (!(color & V_NOSCALESTART))
+ {
+ float dupx = (float)vid.dupx, dupy = (float)vid.dupy;
+
+ if (x == 0 && y == 0 && w == BASEVIDWIDTH && h == BASEVIDHEIGHT)
+ {
+ RGBA_t rgbaColour = V_GetColor(color);
+ FRGBAFloat clearColour;
+ clearColour.red = (float)rgbaColour.s.red / 255;
+ clearColour.green = (float)rgbaColour.s.green / 255;
+ clearColour.blue = (float)rgbaColour.s.blue / 255;
+ clearColour.alpha = 1;
+ HWD.pfnClearBuffer(true, false, &clearColour);
+ return;
+ }
+
+ fx *= dupx;
+ fy *= dupy;
+ fw *= dupx;
+ fh *= dupy;
+
+ if (fabsf((float)vid.width - (float)BASEVIDWIDTH * dupx) > 1.0E-36f)
+ {
+ if (color & V_SNAPTORIGHT)
+ fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx));
+ else if (!(color & V_SNAPTOLEFT))
+ fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2;
+ }
+ if (fabsf((float)vid.height - (float)BASEVIDHEIGHT * dupy) > 1.0E-36f)
+ {
+ // same thing here
+ if (color & V_SNAPTOBOTTOM)
+ fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy));
+ else if (!(color & V_SNAPTOTOP))
+ fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2;
+ }
+ if (color & V_SPLITSCREEN)
+ fy += ((float)BASEVIDHEIGHT * dupy)/2;
+ if (color & V_HORZSCREEN)
+ fx += ((float)BASEVIDWIDTH * dupx)/2;
+
+ }
+
+ if (fx >= vid.width || fy >= vid.height)
+ return;
+ if (fx < 0)
+ {
+ fw += fx;
+ fx = 0;
+ }
+ if (fy < 0)
+ {
+ fh += fy;
+ fy = 0;
+ }
+
+ if (fw <= 0 || fh <= 0)
+ return;
+ if (fx + fw > vid.width)
+ fw = (float)vid.width - fx;
+ if (fy + fh > vid.height)
+ fh = (float)vid.height - fy;
+
+ fx = -1 + fx / (vid.width / 2);
+ fy = 1 - fy / (vid.height / 2);
+ fw = fw / (vid.width / 2);
+ fh = fh / (vid.height / 2);
+
+ v[0].x = v[3].x = fx;
+ v[2].x = v[1].x = fx + fw;
+ v[0].y = v[1].y = fy;
+ v[2].y = v[3].y = fy - fh;
+
+ v[0].z = v[1].z = v[2].z = v[3].z = 1.0f;
+
+ v[0].s = v[3].s = 0.0f;
+ v[2].s = v[1].s = 1.0f;
+ v[0].t = v[1].t = 0.0f;
+ v[2].t = v[3].t = 1.0f;
+
+ Surf.PolyColor = V_GetColor(color);
+
+ HWD.pfnDrawPolygon(&Surf, v, 4,
+ PF_Modulated|PF_NoTexture|PF_NoDepthTest);
+}
#ifdef HAVE_PNG
@@ -1196,24 +1145,27 @@ UINT8 *HWR_GetScreenshot(void)
return buf;
}
-boolean HWR_Screenshot(const char *lbmname)
+boolean HWR_Screenshot(const char *pathname)
{
boolean ret;
UINT8 *buf = malloc(vid.width * vid.height * 3 * sizeof (*buf));
if (!buf)
+ {
+ CONS_Debug(DBG_RENDER, "HWR_Screenshot: Failed to allocate memory\n");
return false;
+ }
// returns 24bit 888 RGB
HWD.pfnReadRect(0, 0, vid.width, vid.height, vid.width * 3, (void *)buf);
#ifdef USE_PNG
- ret = M_SavePNG(lbmname, buf, vid.width, vid.height, NULL);
+ ret = M_SavePNG(pathname, buf, vid.width, vid.height, NULL);
#else
- ret = saveTGA(lbmname, buf, vid.width, vid.height);
+ ret = saveTGA(pathname, buf, vid.width, vid.height);
#endif
free(buf);
return ret;
}
-#endif //HWRENDER
+#endif //HWRENDER
\ No newline at end of file
diff --git a/src/hardware/hw_drv.h b/src/hardware/hw_drv.h
index 54bd9e78..bca1dff4 100644
--- a/src/hardware/hw_drv.h
+++ b/src/hardware/hw_drv.h
@@ -1,21 +1,15 @@
-// Emacs style mode select -*- C++ -*-
+// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
-//
+// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
+// Copyright (C) 1999-2019 by Sonic Team Junior.
//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file
-/// \brief imports/exports for the 3D hardware low-level interface API
+/// \brief imports/exports for the GPU hardware low-level interface API
#ifndef __HWR_DRV_H__
#define __HWR_DRV_H__
@@ -32,13 +26,7 @@
// STANDARD DLL EXPORTS
// ==========================================================================
-EXPORT boolean HWRAPI(Init) (I_Error_t ErrorFunction);
-#ifndef HAVE_SDL
-EXPORT void HWRAPI(Shutdown) (void);
-#endif
-#ifdef _WINDOWS
-EXPORT void HWRAPI(GetModeList) (vmode_t **pvidmodes, INT32 *numvidmodes);
-#endif
+EXPORT boolean HWRAPI(Init) (void);
#if defined (PURESDL) || defined (macintosh)
EXPORT void HWRAPI(SetPalette) (INT32 *, RGBA_t *gamma);
#else
@@ -58,14 +46,11 @@ EXPORT void HWRAPI(ClearMipMapCache) (void);
EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value);
//Hurdler: added for new development
-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(DrawModel) (model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex, FTransform *pos, float scale, UINT8 flipped, FSurfaceInfo *Surface);
EXPORT void HWRAPI(CreateModelVBOs) (model_t *model);
-EXPORT void HWRAPI(SetTransform) (FTransform *ptransform);
+EXPORT void HWRAPI(SetTransform) (FTransform *stransform);
EXPORT INT32 HWRAPI(GetTextureUsed) (void);
-EXPORT INT32 HWRAPI(GetRenderVersion) (void);
-#define SCREENVERTS 10
-EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2]);
EXPORT void HWRAPI(FlushScreenTextures) (void);
EXPORT void HWRAPI(StartScreenWipe) (void);
EXPORT void HWRAPI(EndScreenWipe) (void);
@@ -74,6 +59,19 @@ EXPORT void HWRAPI(DrawIntermissionBG) (void);
EXPORT void HWRAPI(MakeScreenTexture) (void);
EXPORT void HWRAPI(MakeScreenFinalTexture) (void);
EXPORT void HWRAPI(DrawScreenFinalTexture) (int width, int height);
+
+#define SCREENVERTS 10
+EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2]);
+
+// jimita
+EXPORT void HWRAPI(LoadShaders) (void);
+EXPORT void HWRAPI(KillShaders) (void);
+EXPORT void HWRAPI(SetShader) (int shader);
+EXPORT void HWRAPI(UnSetShader) (void);
+
+EXPORT void HWRAPI(LoadCustomShader) (int number, char *shader, size_t size, boolean fragment);
+EXPORT void HWRAPI(InitCustomShaders) (void);
+
// ==========================================================================
// HWR DRIVER OBJECT, FOR CLIENT PROGRAM
// ==========================================================================
@@ -93,18 +91,11 @@ struct hwdriver_s
ReadRect pfnReadRect;
GClipRect pfnGClipRect;
ClearMipMapCache pfnClearMipMapCache;
- SetSpecialState pfnSetSpecialState;//Hurdler: added for backward compatibility
+ SetSpecialState pfnSetSpecialState;
DrawModel pfnDrawModel;
CreateModelVBOs pfnCreateModelVBOs;
SetTransform pfnSetTransform;
GetTextureUsed pfnGetTextureUsed;
- GetRenderVersion pfnGetRenderVersion;
-#ifdef _WINDOWS
- GetModeList pfnGetModeList;
-#endif
-#ifndef HAVE_SDL
- Shutdown pfnShutdown;
-#endif
PostImgRedraw pfnPostImgRedraw;
FlushScreenTextures pfnFlushScreenTextures;
StartScreenWipe pfnStartScreenWipe;
@@ -114,16 +105,20 @@ struct hwdriver_s
MakeScreenTexture pfnMakeScreenTexture;
MakeScreenFinalTexture pfnMakeScreenFinalTexture;
DrawScreenFinalTexture pfnDrawScreenFinalTexture;
+
+ LoadShaders pfnLoadShaders;
+ KillShaders pfnKillShaders;
+ SetShader pfnSetShader;
+ UnSetShader pfnUnSetShader;
+
+ LoadCustomShader pfnLoadCustomShader;
+ InitCustomShaders pfnInitCustomShaders;
};
extern struct hwdriver_s hwdriver;
-//Hurdler: 16/10/99: added for OpenGL gamma correction
-//extern RGBA_t gamma_correction;
-
#define HWD hwdriver
#endif //not defined _CREATE_DLL_
-#endif //__HWR_DRV_H__
-
+#endif //__HWR_DRV_H__
\ No newline at end of file
diff --git a/src/hardware/hw_glide.h b/src/hardware/hw_glide.h
deleted file mode 100644
index 2625d586..00000000
--- a/src/hardware/hw_glide.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Emacs style mode select -*- C++ -*-
-//-----------------------------------------------------------------------------
-//
-// Copyright (C) 1998-2000 by DooM Legacy Team.
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//-----------------------------------------------------------------------------
-/// \file
-/// \brief Declaration needed by Glide renderer
-/// !!! To be replaced by our own def in the future !!!
-
-#ifndef _GLIDE_H_
-#define _GLIDE_H_
-
-#ifndef __GLIDE_H__
-
-typedef unsigned long FxU32;
-typedef long FxI32;
-
-typedef FxI32 GrAspectRatio_t;
-#define GR_ASPECT_LOG2_8x1 3 /* 8W x 1H */
-#define GR_ASPECT_LOG2_4x1 2 /* 4W x 1H */
-#define GR_ASPECT_LOG2_2x1 1 /* 2W x 1H */
-#define GR_ASPECT_LOG2_1x1 0 /* 1W x 1H */
-#define GR_ASPECT_LOG2_1x2 -1 /* 1W x 2H */
-#define GR_ASPECT_LOG2_1x4 -2 /* 1W x 4H */
-#define GR_ASPECT_LOG2_1x8 -3 /* 1W x 8H */
-
-typedef FxI32 GrLOD_t;
-#define GR_LOD_LOG2_256 0x8
-#define GR_LOD_LOG2_128 0x7
-#define GR_LOD_LOG2_64 0x6
-#define GR_LOD_LOG2_32 0x5
-#define GR_LOD_LOG2_16 0x4
-#define GR_LOD_LOG2_8 0x3
-#define GR_LOD_LOG2_4 0x2
-#define GR_LOD_LOG2_2 0x1
-#define GR_LOD_LOG2_1 0x0
-
-typedef FxI32 GrTextureFormat_t;
-#define GR_TEXFMT_ALPHA_8 0x2 /* (0..0xFF) alpha */
-#define GR_TEXFMT_INTENSITY_8 0x3 /* (0..0xFF) intensity */
-#define GR_TEXFMT_ALPHA_INTENSITY_44 0x4
-#define GR_TEXFMT_P_8 0x5 /* 8-bit palette */
-#define GR_TEXFMT_RGB_565 0xa
-#define GR_TEXFMT_ARGB_1555 0xb
-#define GR_TEXFMT_ARGB_4444 0xc
-#define GR_TEXFMT_ALPHA_INTENSITY_88 0xd
-#define GR_TEXFMT_AP_88 0xe /* 8-bit alpha 8-bit palette */
-#define GR_RGBA 0x6 // 32 bit RGBA !
-
-typedef struct
-{
- GrLOD_t smallLodLog2;
- GrLOD_t largeLodLog2;
- GrAspectRatio_t aspectRatioLog2;
- GrTextureFormat_t format;
- void *data;
-} GrTexInfo;
-
-#endif // __GLIDE_H__ (defined in )
-
-#endif // _GLIDE_H_
diff --git a/src/hardware/hw_glob.h b/src/hardware/hw_glob.h
index 9656e54e..b3f058c4 100644
--- a/src/hardware/hw_glob.h
+++ b/src/hardware/hw_glob.h
@@ -1,18 +1,12 @@
-// Emacs style mode select -*- C++ -*-
+// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
-//
+// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
+// Copyright (C) 1999-2019 by Sonic Team Junior.
//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file
/// \brief globals (shared data & code) for hw_ modules
@@ -21,78 +15,18 @@
#define _HWR_GLOB_H_
#include "hw_defs.h"
-#include "hw_main.h"
#include "../m_misc.h"
-
-// the original aspect ratio of Doom graphics isn't square
-#define ORIGINAL_ASPECT (320.0f/200.0f)
+#include "../r_defs.h"
// Uncomment this to enable the OpenGL loading screen
//#define HWR_LOADING_SCREEN
-// -----------
-// structures
-// -----------
-
-// a vertex of a Doom 'plane' polygon
-typedef struct
-{
- float x;
- float y;
- float z;
-} polyvertex_t;
-
-#ifdef _MSC_VER
-#pragma warning(disable : 4200)
-#endif
-
-// a convex 'plane' polygon, clockwise order
-typedef struct
-{
- INT32 numpts;
- polyvertex_t pts[0];
-} poly_t;
-
-#ifdef _MSC_VER
-#pragma warning(default : 4200)
-#endif
-
-// holds extra info for 3D render, for each subsector in subsectors[]
-typedef struct
-{
- poly_t *planepoly; // the generated convex polygon
-} extrasubsector_t;
-
-// needed for sprite rendering
-// equivalent of the software renderer's vissprites
-typedef struct gr_vissprite_s
-{
- // Doubly linked list
- struct gr_vissprite_s *prev;
- struct gr_vissprite_s *next;
- float x1, x2;
- float tz, ty;
- lumpnum_t patchlumpnum;
- boolean flip;
- UINT8 translucency; //alpha level 0-255
- mobj_t *mobj;
- boolean precip; // Tails 08-25-2002
- boolean vflip;
- //Hurdler: 25/04/2000: now support colormap in hardware mode
- UINT8 *colormap;
- INT32 dispoffset; // copy of info->dispoffset, affects ordering but not drawing
- float z1, z2;
-} gr_vissprite_t;
-
// --------
// hw_bsp.c
// --------
extern extrasubsector_t *extrasubsectors;
extern size_t addsubsector;
-void HWR_InitPolyPool(void);
-void HWR_FreePolyPool(void);
-
// --------
// hw_cache.c
// --------
@@ -100,27 +34,28 @@ void HWR_InitTextureCache(void);
void HWR_FreeTextureCache(void);
void HWR_FreeExtraSubsectors(void);
-void HWR_GetFlat(lumpnum_t flatlumpnum);
+void HWR_GetFlat(lumpnum_t flatlumpnum, boolean noencoremap);
+// ^ some flats must NOT be remapped to encore, since we remap them as we cache them for ease, adding a toggle here seems wise.
+
GLTexture_t *HWR_GetTexture(INT32 tex);
void HWR_GetPatch(GLPatch_t *gpatch);
void HWR_GetMappedPatch(GLPatch_t *gpatch, const UINT8 *colormap);
+void HWR_MakePatch(patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipmap, boolean makebitmap);
void HWR_UnlockCachedPatch(GLPatch_t *gpatch);
-GLPatch_t *HWR_GetPic(lumpnum_t lumpnum);
void HWR_SetPalette(RGBA_t *palette);
GLPatch_t *HWR_GetCachedGLPatchPwad(UINT16 wad, UINT16 lump);
GLPatch_t *HWR_GetCachedGLPatch(lumpnum_t lumpnum);
void HWR_GetFadeMask(lumpnum_t fademasklumpnum);
+// hardware driver
+extern INT32 gl_leveltime;
+
// --------
// hw_draw.c
// --------
-extern float gr_patch_scalex;
-extern float gr_patch_scaley;
-
extern consvar_t cv_grrounddown; // on/off
extern INT32 patchformat;
extern INT32 textureformat;
-extern boolean firetranslucent;
-#endif //_HW_GLOB_
+#endif //_HW_GLOB_
\ No newline at end of file
diff --git a/src/hardware/hw_light.c b/src/hardware/hw_light.c
index ee0cca74..702e286e 100644
--- a/src/hardware/hw_light.c
+++ b/src/hardware/hw_light.c
@@ -1,21 +1,14 @@
-// Emacs style mode select -*- C++ -*-
+// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
-//
+// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
+// Copyright (C) 1999-2019 by Sonic Team Junior.
//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file
-/// \brief Corona/Dynamic/Static lighting add on by Hurdler
-/// !!! Under construction !!!
#include "../doomdef.h"
@@ -31,1346 +24,4 @@
#include "../r_main.h"
#include "../p_local.h"
-//=============================================================================
-// DEFINES
-//=============================================================================
-
-#define DL_SQRRADIUS(x) dynlights->p_lspr[(x)]->dynamic_sqrradius
-#define DL_RADIUS(x) dynlights->p_lspr[(x)]->dynamic_radius
-#define LIGHT_POS(i) dynlights->position[(i)]
-
-#define DL_HIGH_QUALITY
-//#define STATICLIGHT //Hurdler: TODO!
-//#define LIGHTMAPFLAGS (PF_Masked|PF_Clip|PF_NoAlphaTest) // debug see overdraw
-#define LIGHTMAPFLAGS (PF_Modulated|PF_Additive|PF_Clip)
-
-#ifdef ALAM_LIGHTING
-static dynlights_t view_dynlights[4]; // 4 players for splitscreen modes
-static dynlights_t *dynlights = &view_dynlights[0];
-#endif
-
-#define UNDEFINED_SPR 0x0 // actually just for testing
-#define CORONA_SPR 0x1 // a light source which only emit a corona
-#define DYNLIGHT_SPR 0x2 // a light source which is only used for dynamic lighting
-#define LIGHT_SPR (DYNLIGHT_SPR|CORONA_SPR)
-#define ROCKET_SPR (DYNLIGHT_SPR|CORONA_SPR|0x10)
-//#define MONSTER_SPR 4
-//#define AMMO_SPR 8
-//#define BONUS_SPR 16
-
-//Hurdler: now we can change those values via FS :)
-light_t lspr[NUMLIGHTS] =
-{
- // type offset x, y coronas color, c_size,light color,l_radius, sqr radius computed at init
- // UNDEFINED: 0
- { UNDEFINED_SPR, 0.0f, 0.0f, 0x00000000, 24.0f, 0x00000000, 0.0f, 0.0f},
- // weapons
- // RINGSPARK_L
- { LIGHT_SPR, 0.0f, 0.0f, 0x0000e0ff, 16.0f, 0x0000e0ff, 32.0f, 0.0f}, // Tails 09-08-2002
- // SUPERSONIC_L
- { DYNLIGHT_SPR, 0.0f, 0.0f, 0xff00e0ff, 32.0f, 0xff00e0ff, 128.0f, 0.0f}, // Tails 09-08-2002
- // SUPERSPARK_L
- { LIGHT_SPR, 0.0f, 0.0f, 0xe0ffffff, 8.0f, 0xe0ffffff, 64.0f, 0.0f},
- // INVINCIBLE_L
- { DYNLIGHT_SPR, 0.0f, 0.0f, 0x10ffaaaa, 16.0f, 0x10ffaaaa, 128.0f, 0.0f},
- // GREENSHIELD_L
- { DYNLIGHT_SPR, 0.0f, 0.0f, 0x602b7337, 32.0f, 0x602b7337, 128.0f, 0.0f},
- // BLUESHIELD_L
- { DYNLIGHT_SPR, 0.0f, 0.0f, 0x60cb0000, 32.0f, 0x60cb0000, 128.0f, 0.0f},
-
- // tall lights
- // YELLOWSHIELD_L
- { DYNLIGHT_SPR, 0.0f, 0.0f, 0x601f7baf, 32.0f, 0x601f7baf, 128.0f, 0.0f},
-
- // REDSHIELD_L
- { DYNLIGHT_SPR, 0.0f, 0.0f, 0x600000cb, 32.0f, 0x600000cb, 128.0f, 0.0f},
-
- // BLACKSHIELD_L // Black light? lol
- { DYNLIGHT_SPR, 0.0f, 0.0f, 0x60010101, 32.0f, 0x60ff00ff, 128.0f, 0.0f},
-
- // WHITESHIELD_L
- { DYNLIGHT_SPR, 0.0f, 0.0f, 0x60ffffff, 32.0f, 0x60ffffff, 128.0f, 0.0f},
-
- // SMALLREDBALL_L
- { DYNLIGHT_SPR, 0.0f, 0.0f, 0x606060f0, 0.0f, 0x302070ff, 32.0f, 0.0f},
-
- // small lights
- // RINGLIGHT_L
- { DYNLIGHT_SPR, 0.0f, 0.0f, 0x60b0f0f0, 0.0f, 0x30b0f0f0, 100.0f, 0.0f},
- // GREENSMALL_L
- { LIGHT_SPR, 0.0f, 14.0f, 0x6070ff70, 60.0f, 0x4070ff70, 100.0f, 0.0f},
- // REDSMALL_L
- { LIGHT_SPR, 0.0f, 14.0f, 0x705070ff, 60.0f, 0x405070ff, 100.0f, 0.0f},
-
- // type offset x, y coronas color, c_size,light color,l_radius, sqr radius computed at init
- // GREENSHINE_L
- { LIGHT_SPR, 0.0f, 0.0f, 0xff00ff00, 64.0f, 0xff00ff00, 256.0f, 0.0f},
- // ORANGESHINE_L
- { LIGHT_SPR, 0.0f, 0.0f, 0xff0080ff, 64.0f, 0xff0080ff, 256.0f, 0.0f},
- // PINKSHINE_L
- { LIGHT_SPR, 0.0f, 0.0f, 0xffe080ff, 64.0f, 0xffe080ff, 256.0f, 0.0f},
- // BLUESHINE_L
- { LIGHT_SPR, 0.0f, 0.0f, 0xffff0000, 64.0f, 0xffff0000, 256.0f, 0.0f},
- // REDSHINE_L
- { LIGHT_SPR, 0.0f, 0.0f, 0xff0000ff, 64.0f, 0xff0000ff, 256.0f, 0.0f},
- // LBLUESHINE_L
- { LIGHT_SPR, 0.0f, 0.0f, 0xffff8080, 64.0f, 0xffff8080, 256.0f, 0.0f},
- // GREYSHINE_L
- { LIGHT_SPR, 0.0f, 0.0f, 0xffe0e0e0, 64.0f, 0xffe0e0e0, 256.0f, 0.0f},
-
- // monsters
- // REDBALL_L
- { DYNLIGHT_SPR, 0.0f, 0.0f, 0x606060ff, 0.0f, 0x606060ff, 100.0f, 0.0f},
- // GREENBALL_L
- { DYNLIGHT_SPR, 0.0f, 0.0f, 0x6060ff60, 120.0f, 0x6060ff60, 100.0f, 0.0f},
- // BLUEBALL_L
- { DYNLIGHT_SPR, 0.0f, 0.0f, 0x60ff6060, 120.0f, 0x60ff6060, 100.0f, 0.0f},
-
- // NIGHTSLIGHT_L
- { LIGHT_SPR, 0.0f, 6.0f, 0x60ffffff, 16.0f, 0x30ffffff, 32.0f, 0.0f},
-
- // JETLIGHT_L
- { DYNLIGHT_SPR, 0.0f, 6.0f, 0x60ffaaaa, 16.0f, 0x30ffaaaa, 64.0f, 0.0f},
-
- // GOOPLIGHT_L
- { DYNLIGHT_SPR, 0.0f, 6.0f, 0x60ff00ff, 16.0f, 0x30ff00ff, 32.0f, 0.0f},
-
- // STREETLIGHT_L
- { LIGHT_SPR, 0.0f, 0.0f, 0xe0ffffff, 64.0f, 0xe0ffffff, 384.0f, 0.0f},
-};
-
-light_t *t_lspr[NUMSPRITES] =
-{
- &lspr[NOLIGHT], // SPR_NULL
- &lspr[NOLIGHT], // SPR_UNKN
-
- &lspr[NOLIGHT], // SPR_THOK
- &lspr[SUPERSONIC_L],// SPR_PLAY
-
- // Enemies
- &lspr[NOLIGHT], // SPR_POSS
- &lspr[NOLIGHT], // SPR_SPOS
- &lspr[NOLIGHT], // SPR_FISH
- &lspr[NOLIGHT], // SPR_BUZZ Graue 03-10-2004
- &lspr[NOLIGHT], // SPR_RBUZ Graue 03-10-2004
- &lspr[NOLIGHT], // SPR_JETB
- &lspr[NOLIGHT], // SPR_JETW
- &lspr[NOLIGHT], // SPR_JETG
- &lspr[NOLIGHT], // SPR_CCOM
- &lspr[NOLIGHT], // SPR_DETN
- &lspr[NOLIGHT], // SPR_SKIM
- &lspr[NOLIGHT], // SPR_TRET
- &lspr[NOLIGHT], // SPR_TURR
- &lspr[NOLIGHT], // SPR_SHRP
- &lspr[NOLIGHT], // SPR_JJAW
- &lspr[NOLIGHT], // SPR_SNLR
- &lspr[NOLIGHT], // SPR_VLTR
- &lspr[NOLIGHT], // SPR_PNTY
- &lspr[NOLIGHT], // SPR_ARCH
- &lspr[NOLIGHT], // SPR_CBFS
- &lspr[NOLIGHT], // SPR_SPSH
- &lspr[NOLIGHT], // SPR_ESHI
- &lspr[NOLIGHT], // SPR_GSNP
- &lspr[NOLIGHT], // SPR_MNUS
- &lspr[NOLIGHT], // SPR_SSHL
- &lspr[NOLIGHT], // SPR_UNID
- &lspr[NOLIGHT], // SPR_BBUZ
-
- // Generic Boos Items
- &lspr[JETLIGHT_L], // SPR_JETF // Boss jet fumes
-
- // Boss 1, (Greenflower)
- &lspr[NOLIGHT], // SPR_EGGM
-
- // Boss 2, (Techno Hill)
- &lspr[NOLIGHT], // SPR_EGGN
- &lspr[NOLIGHT], // SPR_TNKA
- &lspr[NOLIGHT], // SPR_TNKB
- &lspr[NOLIGHT], // SPR_SPNK
- &lspr[NOLIGHT], // SPR_GOOP
-
- // Boss 3 (Deep Sea)
- &lspr[NOLIGHT], // SPR_EGGO
- &lspr[NOLIGHT], // SPR_PRPL
- &lspr[NOLIGHT], // SPR_FAKE
-
- // Boss 4 (Castle Eggman)
- &lspr[NOLIGHT], // SPR_EGGP
- &lspr[REDBALL_L], // SPR_EFIR
-
- // Boss 5 (Arid Canyon)
- &lspr[NOLIGHT], // SPR_EGGQ
-
- // Boss 6 (Red Volcano)
- &lspr[NOLIGHT], // SPR_EEGR
-
- // Boss 7 (Dark City)
- &lspr[NOLIGHT], // SPR_BRAK
- &lspr[NOLIGHT], // SPR_BGOO
- &lspr[NOLIGHT], // SPR_BMSL
-
- // Boss 8 (Egg Rock)
- &lspr[NOLIGHT], // SPR_EGGT
-
- &lspr[NOLIGHT], //SPR_RCKT
- &lspr[NOLIGHT], //SPR_ELEC
- &lspr[NOLIGHT], //SPR_TARG
- &lspr[NOLIGHT], //SPR_NPLM
- &lspr[NOLIGHT], //SPR_MNPL
-
- // Metal Sonic
- &lspr[NOLIGHT], // SPR_METL
- &lspr[NOLIGHT], // SPR_MSCF
- &lspr[NOLIGHT], // SPR_MSCB
-
- // Collectible Items
- &lspr[NOLIGHT], // SPR_RING
- &lspr[NOLIGHT], // SPR_TRNG
- &lspr[NOLIGHT], // SPR_EMMY
- &lspr[BLUEBALL_L], // SPR_TOKE
- &lspr[REDBALL_L], // SPR_RFLG
- &lspr[BLUEBALL_L], // SPR_BFLG
- &lspr[NOLIGHT], // SPR_NWNG
- &lspr[NOLIGHT], // SPR_EMBM
- &lspr[NOLIGHT], // SPR_CEMG
- &lspr[NOLIGHT], // SPR_EMER
-
- // Interactive Objects
- &lspr[NOLIGHT], // SPR_FANS
- &lspr[NOLIGHT], // SPR_BUBL
- &lspr[NOLIGHT], // SPR_SIGN
- &lspr[NOLIGHT], // SPR_STEM
- &lspr[NOLIGHT], // SPR_SPIK
- &lspr[NOLIGHT], // SPR_SFLM
- &lspr[NOLIGHT], // SPR_USPK
- &lspr[NOLIGHT], // SPR_STPT
- &lspr[NOLIGHT], // SPR_BMNE
-
- // Monitor Boxes
- &lspr[NOLIGHT], // SPR_SRBX
- &lspr[NOLIGHT], // SPR_RRBX
- &lspr[NOLIGHT], // SPR_BRBX
- &lspr[NOLIGHT], // SPR_SHTV
- &lspr[NOLIGHT], // SPR_PINV
- &lspr[NOLIGHT], // SPR_YLTV
- &lspr[NOLIGHT], // SPR_BLTV
- &lspr[NOLIGHT], // SPR_BKTV
- &lspr[NOLIGHT], // SPR_WHTV
- &lspr[NOLIGHT], // SPR_GRTV
- &lspr[NOLIGHT], // SPR_ELTV
- &lspr[NOLIGHT], // SPR_EGGB
- &lspr[NOLIGHT], // SPR_MIXU
- &lspr[NOLIGHT], // SPR_RECY
- &lspr[NOLIGHT], // SPR_QUES
- &lspr[NOLIGHT], // SPR_GBTV
- &lspr[NOLIGHT], // SPR_PRUP
- &lspr[NOLIGHT], // SPR_PTTV
-
- // Monitor Miscellany
- &lspr[NOLIGHT], // SPR_MTEX
-
- // Projectiles
- &lspr[NOLIGHT], // SPR_MISL
- &lspr[NOLIGHT], // SPR_TORP
- &lspr[NOLIGHT], // SPR_ENRG
- &lspr[NOLIGHT], // SPR_MINE
- &lspr[NOLIGHT], // SPR_JBUL
- &lspr[SMALLREDBALL_L], // SPR_TRLS
- &lspr[NOLIGHT], // SPR_CBLL
- &lspr[NOLIGHT], // SPR_AROW
- &lspr[NOLIGHT], // SPR_CFIR
-
- // Greenflower Scenery
- &lspr[NOLIGHT], // SPR_FWR1
- &lspr[NOLIGHT], // SPR_FWR2
- &lspr[NOLIGHT], // SPR_FWR3
- &lspr[NOLIGHT], // SPR_FWR4
- &lspr[NOLIGHT], // SPR_BUS1
- &lspr[NOLIGHT], // SPR_BUS2
-
- // Techno Hill Scenery
- &lspr[NOLIGHT], // SPR_THZP
- &lspr[REDBALL_L], // SPR_ALRM
-
- // Deep Sea Scenery
- &lspr[NOLIGHT], // SPR_GARG
- &lspr[NOLIGHT], // SPR_SEWE
- &lspr[NOLIGHT], // SPR_DRIP
- &lspr[NOLIGHT], // SPR_CRL1
- &lspr[NOLIGHT], // SPR_CRL2
- &lspr[NOLIGHT], // SPR_CRL3
- &lspr[NOLIGHT], // SPR_BCRY
-
- // Castle Eggman Scenery
- &lspr[NOLIGHT], // SPR_CHAN
- &lspr[REDBALL_L], // SPR_FLAM
- &lspr[NOLIGHT], // SPR_ESTA
- &lspr[NOLIGHT], // SPR_SMCH
- &lspr[NOLIGHT], // SPR_BMCH
- &lspr[NOLIGHT], // SPR_SMCE
- &lspr[NOLIGHT], // SPR_BMCE
-
- // Arid Canyon Scenery
- &lspr[NOLIGHT], // SPR_BTBL
- &lspr[NOLIGHT], // SPR_STBL
- &lspr[NOLIGHT], // SPR_CACT
-
- // Red Volcano Scenery
- &lspr[REDBALL_L], // SPR_FLME
- &lspr[REDBALL_L], // SPR_DFLM
-
- // Dark City Scenery
-
- // Egg Rock Scenery
-
- // Christmas Scenery
- &lspr[NOLIGHT], // SPR_XMS1
- &lspr[NOLIGHT], // SPR_XMS2
- &lspr[NOLIGHT], // SPR_XMS3
-
- // Botanic Serenity Scenery
- &lspr[NOLIGHT], // SPR_BSZ1
- &lspr[NOLIGHT], // SPR_BSZ2
- &lspr[NOLIGHT], // SPR_BSZ3
- &lspr[NOLIGHT], // SPR_BSZ4
- &lspr[NOLIGHT], // SPR_BSZ5
- &lspr[NOLIGHT], // SPR_BSZ6
- &lspr[NOLIGHT], // SPR_BSZ7
- &lspr[NOLIGHT], // SPR_BSZ8
-
- // Stalagmites
- &lspr[NOLIGHT], // SPR_STLG
-
- // Disco Ball
- &lspr[NOLIGHT], // SPR_DBAL
-
- // ATZ Red Crystal
- &lspr[NOLIGHT], // SPR_RCRY
-
- // Powerup Indicators
- &lspr[NOLIGHT], // SPR_ARMA
- &lspr[NOLIGHT], // SPR_ARMF
- &lspr[NOLIGHT], // SPR_ARMB
- &lspr[NOLIGHT], // SPR_WIND
- &lspr[NOLIGHT], // SPR_MAGN
- &lspr[NOLIGHT], // SPR_ELEM
- &lspr[NOLIGHT], // SPR_FORC
- &lspr[NOLIGHT], // SPR_PITY
- &lspr[INVINCIBLE_L], // SPR_IVSP
- &lspr[SUPERSPARK_L], // SPR_SSPK
-
- &lspr[NOLIGHT], // SPR_GOAL
-
- // Freed Animals
- &lspr[NOLIGHT], // SPR_BIRD
- &lspr[NOLIGHT], // SPR_BUNY
- &lspr[NOLIGHT], // SPR_MOUS
- &lspr[NOLIGHT], // SPR_CHIC
- &lspr[NOLIGHT], // SPR_COWZ
- &lspr[NOLIGHT], // SPR_RBRD
-
- // Springs
- &lspr[NOLIGHT], // SPR_SPRY
- &lspr[NOLIGHT], // SPR_SPRR
- &lspr[NOLIGHT], // SPR_SPRB Graue
- &lspr[NOLIGHT], // SPR_YSPR
- &lspr[NOLIGHT], // SPR_RSPR
-
- // Environmentals Effects
- &lspr[NOLIGHT], // SPR_RAIN
- &lspr[NOLIGHT], // SPR_SNO1
- &lspr[NOLIGHT], // SPR_SPLH
- &lspr[NOLIGHT], // SPR_SPLA
- &lspr[NOLIGHT], // SPR_SMOK
- &lspr[NOLIGHT], // SPR_BUBP
- &lspr[NOLIGHT], // SPR_BUBO
- &lspr[NOLIGHT], // SPR_BUBN
- &lspr[NOLIGHT], // SPR_BUBM
- &lspr[NOLIGHT], // SPR_POPP
- &lspr[SUPERSPARK_L], // SPR_TFOG
- &lspr[NIGHTSLIGHT_L], // SPR_SEED // Sonic CD flower seed
- &lspr[NOLIGHT], // SPR_PRTL
-
- // Game Indicators
- &lspr[NOLIGHT], // SPR_SCOR
- &lspr[NOLIGHT], // SPR_DRWN
- &lspr[NOLIGHT], // SPR_TTAG
- &lspr[NOLIGHT], // SPR_GFLG
-
- // Ring Weapons
- &lspr[RINGLIGHT_L], // SPR_RRNG
- &lspr[RINGLIGHT_L], // SPR_RNGB
- &lspr[RINGLIGHT_L], // SPR_RNGR
- &lspr[RINGLIGHT_L], // SPR_RNGI
- &lspr[RINGLIGHT_L], // SPR_RNGA
- &lspr[RINGLIGHT_L], // SPR_RNGE
- &lspr[RINGLIGHT_L], // SPR_RNGS
- &lspr[RINGLIGHT_L], // SPR_RNGG
-
- &lspr[RINGLIGHT_L], // SPR_PIKB
- &lspr[RINGLIGHT_L], // SPR_PIKR
- &lspr[RINGLIGHT_L], // SPR_PIKA
- &lspr[RINGLIGHT_L], // SPR_PIKE
- &lspr[RINGLIGHT_L], // SPR_PIKS
- &lspr[RINGLIGHT_L], // SPR_PIKG
-
- &lspr[RINGLIGHT_L], // SPR_TAUT
- &lspr[RINGLIGHT_L], // SPR_TGRE
- &lspr[RINGLIGHT_L], // SPR_TSCR
-
- // Mario-specific stuff
- &lspr[NOLIGHT], // SPR_COIN
- &lspr[NOLIGHT], // SPR_CPRK
- &lspr[NOLIGHT], // SPR_GOOM
- &lspr[NOLIGHT], // SPR_BGOM
- &lspr[REDBALL_L], // SPR_FFWR
- &lspr[SMALLREDBALL_L], // SPR_FBLL
- &lspr[NOLIGHT], // SPR_SHLL
- &lspr[REDBALL_L], // SPR_PUMA
- &lspr[NOLIGHT], // SPR_HAMM
- &lspr[NOLIGHT], // SPR_KOOP
- &lspr[REDBALL_L], // SPR_BFLM
- &lspr[NOLIGHT], // SPR_MAXE
- &lspr[NOLIGHT], // SPR_MUS1
- &lspr[NOLIGHT], // SPR_MUS2
- &lspr[NOLIGHT], // SPR_TOAD
-
- // NiGHTS Stuff
- &lspr[SUPERSONIC_L], // SPR_NDRN // NiGHTS drone
- &lspr[SUPERSONIC_L], // SPR_SUPE // NiGHTS character flying
- &lspr[SUPERSONIC_L], // SPR_SUPZ // NiGHTS hurt
- &lspr[SUPERSONIC_L], // SPR_NDRL // NiGHTS character drilling
- &lspr[NOLIGHT], // SPR_NSPK
- &lspr[NOLIGHT], // SPR_NBMP
- &lspr[NOLIGHT], // SPR_HOOP
- &lspr[NOLIGHT], // SPR_HSCR
- &lspr[NOLIGHT], // SPR_NPRU
- &lspr[NOLIGHT], // SPR_CAPS
- &lspr[SUPERSONIC_L], // SPR_SUPT
-
- // Debris
- &lspr[RINGSPARK_L], // SPR_SPRK
- &lspr[NOLIGHT], // SPR_BOM1
- &lspr[SUPERSPARK_L], // SPR_BOM2
- &lspr[SUPERSPARK_L], // SPR_BOM3
- &lspr[NOLIGHT], // SPR_BOM4
-
- // Crumbly rocks
- &lspr[NOLIGHT], // SPR_ROIA
- &lspr[NOLIGHT], // SPR_ROIB
- &lspr[NOLIGHT], // SPR_ROIC
- &lspr[NOLIGHT], // SPR_ROID
- &lspr[NOLIGHT], // SPR_ROIE
- &lspr[NOLIGHT], // SPR_ROIF
- &lspr[NOLIGHT], // SPR_ROIG
- &lspr[NOLIGHT], // SPR_ROIH
- &lspr[NOLIGHT], // SPR_ROII
- &lspr[NOLIGHT], // SPR_ROIJ
- &lspr[NOLIGHT], // SPR_ROIK
- &lspr[NOLIGHT], // SPR_ROIL
- &lspr[NOLIGHT], // SPR_ROIM
- &lspr[NOLIGHT], // SPR_ROIN
- &lspr[NOLIGHT], // SPR_ROIO
- &lspr[NOLIGHT], // SPR_ROIP
-
- // Blue Spheres
- &lspr[NOLIGHT], // SPR_BBAL
-
- // Gravity Well Objects
- &lspr[NOLIGHT], // SPR_GWLG
- &lspr[NOLIGHT], // SPR_GWLR
-
- // SRB1 Sprites
- &lspr[NOLIGHT], // SPR_SRBA
- &lspr[NOLIGHT], // SPR_SRBB
- &lspr[NOLIGHT], // SPR_SRBC
- &lspr[NOLIGHT], // SPR_SRBD
- &lspr[NOLIGHT], // SPR_SRBE
- &lspr[NOLIGHT], // SPR_SRBF
- &lspr[NOLIGHT], // SPR_SRBG
- &lspr[NOLIGHT], // SPR_SRBH
- &lspr[NOLIGHT], // SPR_SRBI
- &lspr[NOLIGHT], // SPR_SRBJ
- &lspr[NOLIGHT], // SPR_SRBK
- &lspr[NOLIGHT], // SPR_SRBL
- &lspr[NOLIGHT], // SPR_SRBM
- &lspr[NOLIGHT], // SPR_SRBN
- &lspr[NOLIGHT], // SPR_SRBO
-
- &lspr[NOLIGHT], //"SPRG",
- &lspr[NOLIGHT], //"BSPR",
-
- &lspr[NOLIGHT], //"RNDM",
- &lspr[NOLIGHT], //"KFRE",
- &lspr[NOLIGHT], //"DRIF",
- &lspr[NOLIGHT], //"DSMO",
-
- &lspr[NOLIGHT], //"FITM",
- &lspr[NOLIGHT], //"BANA",
- &lspr[NOLIGHT], //"GSHE",
- &lspr[NOLIGHT], //"RSHE",
- &lspr[NOLIGHT], //"SSMN",
- &lspr[NOLIGHT], //"BLIG",
- &lspr[NOLIGHT], //"LIGH",
- &lspr[NOLIGHT], //"SINK",
- &lspr[NOLIGHT], //"SITR",
- &lspr[NOLIGHT], //"KBLN",
-
- &lspr[NOLIGHT], //"LAKI",
-
- &lspr[NOLIGHT], //"POKE",
- &lspr[NOLIGHT], //"AUDI",
- &lspr[NOLIGHT], //"DECO",
- &lspr[NOLIGHT], //"DOOD",
- &lspr[NOLIGHT], //"SNES",
- &lspr[NOLIGHT], //"GBAS",
- &lspr[NOLIGHT], //"SPRS",
- &lspr[NOLIGHT], //"BUZB",
- &lspr[NOLIGHT], //"CHOM",
- &lspr[NOLIGHT], //"SACO",
- &lspr[NOLIGHT], //"CRAB",
- &lspr[NOLIGHT], //"SHAD",
-
- &lspr[NOLIGHT], //"BUMP",
- &lspr[NOLIGHT], //"FLEN",
- &lspr[NOLIGHT], //"CLAS",
- &lspr[NOLIGHT], //"PSHW",
-
- &lspr[NOLIGHT], //"ARRO",
-
- &lspr[NOLIGHT], //"PBOM"
-
- // Free slots
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
- &lspr[NOLIGHT],
-};
-
-#ifdef ALAM_LIGHTING
-
-//=============================================================================
-// PROTOS
-//=============================================================================
-
-static void HWR_SetLight(void);
-
-// --------------------------------------------------------------------------
-// calcul la projection d'un point sur une droite (determin� par deux
-// points) et ensuite calcul la distance (au carr� de ce point au point
-// project�sur cette droite
-// --------------------------------------------------------------------------
-static float HWR_DistP2D(FOutVector *p1, FOutVector *p2, FVector *p3, FVector *inter)
-{
- if (p1->z == p2->z)
- {
- inter->x = p3->x;
- inter->z = p1->z;
- }
- else if (p1->x == p2->x)
- {
- inter->x = p1->x;
- inter->z = p3->z;
- }
- else
- {
- register float local, pente;
- // Wat een mooie formula! Hurdler's math;-)
- pente = (p1->z-p2->z) / (p1->x-p2->x);
- local = p1->z - p1->x*pente;
- inter->x = (p3->z - local + p3->x/pente) * (pente/(pente*pente+1));
- inter->z = inter->x*pente + local;
- }
-
- return (p3->x-inter->x)*(p3->x-inter->x) + (p3->z-inter->z)*(p3->z-inter->z);
-}
-
-// check if sphere (radius r) centred in p3 touch the bounding box defined by p1, p2
-static boolean SphereTouchBBox3D(FOutVector *p1, FOutVector *p2, FVector *p3, float r)
-{
- float minx = p1->x,maxx = p2->x,miny = p2->y,maxy = p1->y,minz = p2->z,maxz = p1->z;
-
- if (minx > maxx)
- {
- minx = maxx;
- maxx = p1->x;
- }
- if (miny > maxy)
- {
- miny = maxy;
- maxy = p2->y;
- }
- if (minz > maxz)
- {
- minz = maxz;
- maxz = p2->z;
- }
-
- if (minx-r > p3->x) return false;
- if (maxx+r < p3->x) return false;
- if (miny-r > p3->y) return false;
- if (maxy+r < p3->y) return false;
- if (minz-r > p3->z) return false;
- if (maxz+r < p3->z) return false;
- return true;
-}
-
-// Hurdler: The old code was removed by me because I don't think it will be used one day.
-// (It's still available on the CVS for educational purpose: Revision 1.8)
-
-// --------------------------------------------------------------------------
-// calcul du dynamic lighting sur les murs
-// lVerts contient les coords du mur sans le mlook (up/down)
-// --------------------------------------------------------------------------
-void HWR_WallLighting(FOutVector *wlVerts)
-{
- int i, j;
-
- // dynlights->nb == 0 if cv_grdynamiclighting.value is not set
- for (j = 0; j < dynlights->nb; j++)
- {
- FVector inter;
- FSurfaceInfo Surf;
- float dist_p2d, d[4], s;
-
- // check bounding box first
- if (SphereTouchBBox3D(&wlVerts[2], &wlVerts[0], &LIGHT_POS(j), DL_RADIUS(j))==false)
- continue;
- d[0] = wlVerts[2].x - wlVerts[0].x;
- d[1] = wlVerts[2].z - wlVerts[0].z;
- d[2] = LIGHT_POS(j).x - wlVerts[0].x;
- d[3] = LIGHT_POS(j).z - wlVerts[0].z;
- // backface cull
- if (d[2]*d[1] - d[3]*d[0] < 0)
- continue;
- // check exact distance
- dist_p2d = HWR_DistP2D(&wlVerts[2], &wlVerts[0], &LIGHT_POS(j), &inter);
- if (dist_p2d >= DL_SQRRADIUS(j))
- continue;
-
- d[0] = (float)sqrt((wlVerts[0].x-inter.x)*(wlVerts[0].x-inter.x)
- + (wlVerts[0].z-inter.z)*(wlVerts[0].z-inter.z));
- d[1] = (float)sqrt((wlVerts[2].x-inter.x)*(wlVerts[2].x-inter.x)
- + (wlVerts[2].z-inter.z)*(wlVerts[2].z-inter.z));
- //dAB = sqrtf((wlVerts[0].x-wlVerts[2].x)*(wlVerts[0].x-wlVerts[2].x)+(wlVerts[0].z-wlVerts[2].z)*(wlVerts[0].z-wlVerts[2].z));
- //if ((d[0] < dAB) && (d[1] < dAB)) // test if the intersection is on the wall
- //{
- // d[0] = -d[0]; // if yes, the left distcance must be negative for texcoord
- //}
- // test if the intersection is on the wall
- if ((wlVerts[0].x < inter.x && wlVerts[2].x > inter.x) ||
- (wlVerts[0].x > inter.x && wlVerts[2].x < inter.x) ||
- (wlVerts[0].z < inter.z && wlVerts[2].z > inter.z) ||
- (wlVerts[0].z > inter.z && wlVerts[2].z < inter.z))
- {
- d[0] = -d[0]; // if yes, the left distcance must be negative for texcoord
- }
- d[2] = d[1]; d[3] = d[0];
-#ifdef DL_HIGH_QUALITY
- s = 0.5f / DL_RADIUS(j);
-#else
- s = 0.5f / sqrtf(DL_SQRRADIUS(j)-dist_p2d);
-#endif
- for (i = 0; i < 4; i++)
- {
- wlVerts[i].sow = (float)(0.5f + d[i]*s);
- wlVerts[i].tow = (float)(0.5f + (wlVerts[i].y-LIGHT_POS(j).y)*s*1.2f);
- }
-
- HWR_SetLight();
-
- Surf.FlatColor.rgba = LONG(dynlights->p_lspr[j]->dynamic_color);
-#ifdef DL_HIGH_QUALITY
- Surf.FlatColor.s.alpha = (UINT8)((1-dist_p2d/DL_SQRRADIUS(j))*Surf.FlatColor.s.alpha);
-#endif
- if (!dynlights->mo[j]->state)
- return;
- // next state is null so fade out with alpha
- if (dynlights->mo[j]->state->nextstate == S_NULL)
- Surf.FlatColor.s.alpha = (UINT8)(((float)dynlights->mo[j]->tics/(float)dynlights->mo[j]->state->tics)*Surf.FlatColor.s.alpha);
-
- HWD.pfnDrawPolygon (&Surf, wlVerts, 4, LIGHTMAPFLAGS);
-
- } // end for (j = 0; j < dynlights->nb; j++)
-}
-
-// --------------------------------------------------------------------------
-// calcul du dynamic lighting sur le sol
-// clVerts contient les coords du sol avec le mlook (up/down)
-// --------------------------------------------------------------------------
-void HWR_PlaneLighting(FOutVector *clVerts, int nrClipVerts)
-{
- int i, j;
- FOutVector p1,p2;
-
- p1.z = FIXED_TO_FLOAT(hwbbox[BOXTOP ]);
- p1.x = FIXED_TO_FLOAT(hwbbox[BOXLEFT ]);
- p2.z = FIXED_TO_FLOAT(hwbbox[BOXBOTTOM]);
- p2.x = FIXED_TO_FLOAT(hwbbox[BOXRIGHT ]);
- p2.y = clVerts[0].y;
- p1.y = clVerts[0].y;
-
- for (j = 0; j < dynlights->nb; j++)
- {
- FSurfaceInfo Surf;
- float dist_p2d, s;
-
- // BP: The kickass Optimization: check if light touch bounding box
- if (SphereTouchBBox3D(&p1, &p2, &dynlights->position[j], DL_RADIUS(j))==false)
- continue;
- // backface cull
- //Hurdler: doesn't work with new TANDL code
- if ((clVerts[0].y > atransform.z) // true mean it is a ceiling false is a floor
- ^ (LIGHT_POS(j).y < clVerts[0].y)) // true mean light is down plane false light is up plane
- continue;
- dist_p2d = (clVerts[0].y-LIGHT_POS(j).y);
- dist_p2d *= dist_p2d;
- // done in SphereTouchBBox3D
- //if (dist_p2d >= DL_SQRRADIUS(j))
- // continue;
-
-#ifdef DL_HIGH_QUALITY
- s = 0.5f / DL_RADIUS(j);
-#else
- s = 0.5f / sqrtf(DL_SQRRADIUS(j)-dist_p2d);
-#endif
- for (i = 0; i < nrClipVerts; i++)
- {
- clVerts[i].sow = 0.5f + (clVerts[i].x-LIGHT_POS(j).x)*s;
- clVerts[i].tow = 0.5f + (clVerts[i].z-LIGHT_POS(j).z)*s*1.2f;
- }
-
- HWR_SetLight();
-
- Surf.FlatColor.rgba = LONG(dynlights->p_lspr[j]->dynamic_color);
-#ifdef DL_HIGH_QUALITY
- Surf.FlatColor.s.alpha = (unsigned char)((1 - dist_p2d/DL_SQRRADIUS(j))*Surf.FlatColor.s.alpha);
-#endif
- if (!dynlights->mo[j]->state)
- return;
- // next state is null so fade out with alpha
- if ((dynlights->mo[j]->state->nextstate == S_NULL))
- Surf.FlatColor.s.alpha = (unsigned char)(((float)dynlights->mo[j]->tics/(float)dynlights->mo[j]->state->tics)*Surf.FlatColor.s.alpha);
-
- HWD.pfnDrawPolygon (&Surf, clVerts, nrClipVerts, LIGHTMAPFLAGS);
-
- } // end for (j = 0; j < dynlights->nb; j++)
-}
-
-
-static lumpnum_t coronalumpnum = LUMPERROR;
-#ifndef NEWCORONAS
-// --------------------------------------------------------------------------
-// coronas lighting
-// --------------------------------------------------------------------------
-void HWR_DoCoronasLighting(FOutVector *outVerts, gr_vissprite_t *spr)
-{
- light_t *p_lspr;
-
- if (coronalumpnum == LUMPERROR)
- return;
-
- //CONS_Debug(DBG_RENDER, "sprite (type): %d (%s)\n", spr->type, sprnames[spr->type]);
- p_lspr = t_lspr[spr->mobj->sprite];
- if ((spr->mobj->state>=&states[S_EXPLODE1] && spr->mobj->state<=&states[S_EXPLODE3])
- || (spr->mobj->state>=&states[S_FATSHOTX1] && spr->mobj->state<=&states[S_FATSHOTX3]))
- {
- p_lspr = &lspr[ROCKETEXP_L];
- }
-
- if (cv_grcoronas.value && (p_lspr->type & CORONA_SPR))
- { // it's an object which emits light
- FOutVector light[4];
- FSurfaceInfo Surf;
- float cx = 0.0f, cy = 0.0f, cz = 0.0f; // gravity center
- float size;
- UINT8 i;
-
- switch (p_lspr->type)
- {
- case LIGHT_SPR:
- size = p_lspr->corona_radius * ((outVerts[0].z+120.0f)/950.0f); // d'ou vienne ces constante ?
- break;
- case ROCKET_SPR:
- p_lspr->corona_color = (((M_RandomByte()>>1)&0xff)<<24)|0x0040ff;
- // don't need a break
- case CORONA_SPR:
- size = p_lspr->corona_radius * ((outVerts[0].z+60.0f)/100.0f); // d'ou vienne ces constante ?
- break;
- default:
- I_Error("HWR_DoCoronasLighting: unknow light type %d",p_lspr->type);
- return;
- }
- if (size > p_lspr->corona_radius)
- size = p_lspr->corona_radius;
- size *= FIXED_TO_FLOAT(cv_grcoronasize.value<<1);
-
- // compute position doing average
- for (i = 0; i < 4; i++)
- {
- cx += outVerts[i].x;
- cy += outVerts[i].y;
- cz += outVerts[i].z;
- }
- cx /= 4.0f; cy /= 4.0f; cz /= 4.0f;
-
- // more realistique corona !
- if (cz >= 255*8+250)
- return;
- Surf.FlatColor.rgba = p_lspr->corona_color;
- if (cz > 250.0f)
- Surf.FlatColor.s.alpha = 0xff-((int)cz-250)/8;
- else
- Surf.FlatColor.s.alpha = 0xff;
-
- // do not be hide by sprite of the light itself !
- cz = cz - 2.0f;
-
- // Bp; je comprend pas, ou est la rotation haut/bas ?
- // tu ajoute un offset a y mais si la tu la reguarde de haut
- // sa devrais pas marcher ... comprend pas :(
- // (...) bon je croit que j'ai comprit il est tout pourit le code ?
- // car comme l'offset est minime sa ce voit pas !
- light[0].x = cx-size; light[0].z = cz;
- light[0].y = cy-size*1.33f+p_lspr->light_yoffset;
- light[0].sow = 0.0f; light[0].tow = 0.0f;
-
- light[1].x = cx+size; light[1].z = cz;
- light[1].y = cy-size*1.33f+p_lspr->light_yoffset;
- light[1].sow = 1.0f; light[1].tow = 0.0f;
-
- light[2].x = cx+size; light[2].z = cz;
- light[2].y = cy+size*1.33f+p_lspr->light_yoffset;
- light[2].sow = 1.0f; light[2].tow = 1.0f;
-
- light[3].x = cx-size; light[3].z = cz;
- light[3].y = cy+size*1.33f+p_lspr->light_yoffset;
- light[3].sow = 0.0f; light[3].tow = 1.0f;
-
- HWR_GetPic(coronalumpnum); /// \todo use different coronas
-
- HWD.pfnDrawPolygon (&Surf, light, 4, PF_Modulated | PF_Additive | PF_Clip | PF_Corona | PF_NoDepthTest);
- }
-}
-#endif
-
-#ifdef NEWCORONAS
-// use the lightlist of the frame to draw the coronas at the top of everythink
-void HWR_DrawCoronas(void)
-{
- int j;
-
- if (!cv_grcoronas.value || dynlights->nb <= 0 || coronalumpnum == LUMPERROR)
- return;
-
- HWR_GetPic(coronalumpnum); /// \todo use different coronas
- for (j = 0;j < dynlights->nb;j++)
- {
- FOutVector light[4];
- FSurfaceInfo Surf;
- float cx = LIGHT_POS(j).x;
- float cy = LIGHT_POS(j).y;
- float cz = LIGHT_POS(j).z; // gravity center
- float size;
- light_t *p_lspr = dynlights->p_lspr[j];
-
- // it's an object which emits light
- if (!(p_lspr->type & CORONA_SPR))
- continue;
-
- transform(&cx,&cy,&cz);
-
- // more realistique corona !
- if (cz >= 255*8+250)
- continue;
- Surf.FlatColor.rgba = p_lspr->corona_color;
- if (cz > 250.0f)
- Surf.FlatColor.s.alpha = (UINT8)(0xff-(UINT8)(((int)cz-250)/8));
- else
- Surf.FlatColor.s.alpha = 0xff;
-
- switch (p_lspr->type)
- {
- case LIGHT_SPR:
- size = p_lspr->corona_radius * ((cz+120.0f)/950.0f); // d'ou vienne ces constante ?
- break;
- case ROCKET_SPR:
- Surf.FlatColor.s.alpha = (UINT8)((M_RandomByte()>>1)&0xff);
- // don't need a break
- case CORONA_SPR:
- size = p_lspr->corona_radius * ((cz+60.0f)/100.0f); // d'ou vienne ces constante ?
- break;
- default:
- I_Error("HWR_DoCoronasLighting: unknow light type %d",p_lspr->type);
- continue;
- }
- if (size > p_lspr->corona_radius)
- size = p_lspr->corona_radius;
- size = (float)(FIXED_TO_FLOAT(cv_grcoronasize.value<<1)*size);
-
- // put light little forward the sprite so there is no
- // z-buffer problem (coplanar polygons)
- // BP: use PF_Decal do not help :(
- cz = cz - 5.0f;
-
- light[0].x = cx-size; light[0].z = cz;
- light[0].y = cy-size*1.33f;
- light[0].sow = 0.0f; light[0].tow = 0.0f;
-
- light[1].x = cx+size; light[1].z = cz;
- light[1].y = cy-size*1.33f;
- light[1].sow = 1.0f; light[1].tow = 0.0f;
-
- light[2].x = cx+size; light[2].z = cz;
- light[2].y = cy+size*1.33f;
- light[2].sow = 1.0f; light[2].tow = 1.0f;
-
- light[3].x = cx-size; light[3].z = cz;
- light[3].y = cy+size*1.33f;
- light[3].sow = 0.0f; light[3].tow = 1.0f;
-
- HWD.pfnDrawPolygon (&Surf, light, 4, PF_Modulated | PF_Additive | PF_Clip | PF_NoDepthTest | PF_Corona);
- }
-}
-#endif
-
-// --------------------------------------------------------------------------
-// Remove all the dynamic lights at eatch frame
-// --------------------------------------------------------------------------
-void HWR_ResetLights(void)
-{
- dynlights->nb = 0;
-}
-
-// --------------------------------------------------------------------------
-// Change view, thus change lights (splitscreen)
-// --------------------------------------------------------------------------
-void HWR_SetLights(int viewnumber)
-{
- dynlights = &view_dynlights[viewnumber];
-}
-
-// --------------------------------------------------------------------------
-// Add a light for dynamic lighting
-// The light position is already transformed execpt for mlook
-// --------------------------------------------------------------------------
-void HWR_DL_AddLight(gr_vissprite_t *spr, GLPatch_t *patch)
-{
- light_t *p_lspr;
-
- //Hurdler: moved here because it's better;-)
- (void)patch;
- if (!cv_grdynamiclighting.value)
- return;
-
- if (!spr->mobj)
-#ifdef PARANOIA
- I_Error("vissprite without mobj !!!");
-#else
- return;
-#endif
-
- // check if sprite contain dynamic light
- p_lspr = t_lspr[spr->mobj->sprite];
- if ((p_lspr->type&DYNLIGHT_SPR)
- && ((p_lspr->type != LIGHT_SPR) || cv_grstaticlighting.value)
- && (dynlights->nb < DL_MAX_LIGHT)
-
- && spr->mobj->state)
- {
- LIGHT_POS(dynlights->nb).x = FIXED_TO_FLOAT(spr->mobj->x);
- LIGHT_POS(dynlights->nb).y = FIXED_TO_FLOAT(spr->mobj->z)+FIXED_TO_FLOAT(spr->mobj->height>>1)+p_lspr->light_yoffset;
- LIGHT_POS(dynlights->nb).z = FIXED_TO_FLOAT(spr->mobj->y);
-
- P_SetTarget(&dynlights->mo[dynlights->nb], spr->mobj);
-
- dynlights->p_lspr[dynlights->nb] = p_lspr;
-
- dynlights->nb++;
- }
-}
-
-static GLPatch_t lightmappatch;
-
-void HWR_InitLight(void)
-{
- size_t i;
-
- // precalculate sqr radius
- for (i = 0;i < NUMLIGHTS;i++)
- lspr[i].dynamic_sqrradius = lspr[i].dynamic_radius*lspr[i].dynamic_radius;
-
- lightmappatch.mipmap.downloaded = false;
- coronalumpnum = W_CheckNumForName("CORONA");
-}
-
-// -----------------+
-// HWR_SetLight : Download a disc shaped alpha map for rendering fake lights
-// -----------------+
-static void HWR_SetLight(void)
-{
- int i, j;
-
- if (!lightmappatch.mipmap.downloaded && !lightmappatch.mipmap.grInfo.data)
- {
-
- UINT16 *Data = Z_Malloc(129*128*sizeof (UINT16), PU_HWRCACHE, &lightmappatch.mipmap.grInfo.data);
-
- for (i = 0; i < 128; i++)
- {
- for (j = 0; j < 128; j++)
- {
- int pos = ((i-64)*(i-64))+((j-64)*(j-64));
- if (pos <= 63*63)
- Data[i*128+j] = (UINT16)(((UINT8)(255-(4*(float)sqrt((float)pos)))) << 8 | 0xff);
- else
- Data[i*128+j] = 0;
- }
- }
- lightmappatch.mipmap.grInfo.format = GR_TEXFMT_ALPHA_INTENSITY_88;
-
- lightmappatch.width = 128;
- lightmappatch.height = 128;
- lightmappatch.mipmap.width = 128;
- lightmappatch.mipmap.height = 128;
- lightmappatch.mipmap.grInfo.smallLodLog2 = GR_LOD_LOG2_128;
- lightmappatch.mipmap.grInfo.largeLodLog2 = GR_LOD_LOG2_128;
- lightmappatch.mipmap.grInfo.aspectRatioLog2 = GR_ASPECT_LOG2_1x1;
- lightmappatch.mipmap.flags = 0; //TF_WRAPXY; // DEBUG: view the overdraw !
- }
- HWD.pfnSetTexture(&lightmappatch.mipmap);
-
- // The system-memory data can be purged now.
- Z_ChangeTag(lightmappatch.mipmap.grInfo.data, PU_HWRCACHE_UNLOCKED);
-}
-
-//**********************************************************
-// Hurdler: new code for faster static lighting and and T&L
-//**********************************************************
-
-#ifdef STATICLIGHT
-// is this really necessary?
-static sector_t *lgr_backsector;
-static seg_t *lgr_curline;
-#endif
-
-// p1 et p2 c'est le deux bou du seg en float
-static inline void HWR_BuildWallLightmaps(FVector *p1, FVector *p2, int lighnum, seg_t *line)
-{
- lightmap_t *lp;
-
- // (...) calcul presit de la projection et de la distance
-
-// if (dist_p2d >= DL_SQRRADIUS(lightnum))
-// return;
-
- // (...) attention faire le backfase cull histoir de faire mieux que Q3 !
-
- (void)lighnum;
- (void)p1;
- (void)p2;
- lp = malloc(sizeof (*lp));
- lp->next = line->lightmaps;
- line->lightmaps = lp;
-
- // (...) encore des b�calcul bien lourd et on stock tout sa dans la lightmap
-}
-
-#ifdef STATICLIGHT
-static void HWR_AddLightMapForLine(int lightnum, seg_t *line)
-{
- /*
- int x1;
- int x2;
- angle_t angle1;
- angle_t angle2;
- angle_t span;
- angle_t tspan;
- */
- FVector p1,p2;
-
- lgr_curline = line;
- lgr_backsector = line->backsector;
-
- // Reject empty lines used for triggers and special events.
- // Identical floor and ceiling on both sides,
- // identical light levels on both sides,
- // and no middle texture.
-/*
- if ( lgr_backsector->ceilingpic == gr_frontsector->ceilingpic
- && lgr_backsector->floorpic == gr_frontsector->floorpic
- && lgr_backsector->lightlevel == gr_frontsector->lightlevel
- && lgr_curline->sidedef->midtexture == 0)
- {
- return;
- }
-*/
-
- p1.y = FIXED_TO_FLOAT(lgr_curline->v1->y);
- p1.x = FIXED_TO_FLOAT(lgr_curline->v1->x);
- p2.y = FIXED_TO_FLOAT(lgr_curline->v2->y);
- p2.x = FIXED_TO_FLOAT(lgr_curline->v2->x);
-
- // check bbox of the seg
-// if (CircleTouchBBox(&p1, &p2, &LIGHT_POS(lightnum), DL_RADIUS(lightnum))==false)
-// return;
-
- HWR_BuildWallLightmaps(&p1, &p2, lightnum, line);
-}
-
-/// \todo see what HWR_AddLine does
-static void HWR_CheckSubsector(size_t num, fixed_t *bbox)
-{
- int count;
- seg_t *line;
- subsector_t *sub;
- FVector p1,p2;
- int lightnum;
-
- p1.y = FIXED_TO_FLOAT(bbox[BOXTOP ]);
- p1.x = FIXED_TO_FLOAT(bbox[BOXLEFT ]);
- p2.y = FIXED_TO_FLOAT(bbox[BOXBOTTOM]);
- p2.x = FIXED_TO_FLOAT(bbox[BOXRIGHT ]);
-
-
- if (num < numsubsectors)
- {
- sub = &subsectors[num]; // subsector
- for (lightnum = 0; lightnum < dynlights->nb; lightnum++)
- {
-// if (CircleTouchBBox(&p1, &p2, &LIGHT_POS(lightnum), DL_RADIUS(lightnum))==false)
-// continue;
-
- count = sub->numlines; // how many linedefs
- line = &segs[sub->firstline]; // first line seg
- while (count--)
- {
- HWR_AddLightMapForLine (lightnum, line); // compute lightmap
- line++;
- }
- }
- }
-}
-
-
-// --------------------------------------------------------------------------
-// Hurdler: this adds lights by mobj.
-// --------------------------------------------------------------------------
-static void HWR_AddMobjLights(mobj_t *thing)
-{
- if (t_lspr[thing->sprite]->type & CORONA_SPR)
- {
- LIGHT_POS(dynlights->nb).x = FIXED_TO_FLOAT(thing->x);
- LIGHT_POS(dynlights->nb).y = FIXED_TO_FLOAT(thing->z) + t_lspr[thing->sprite]->light_yoffset;
- LIGHT_POS(dynlights->nb).z = FIXED_TO_FLOAT(thing->y);
-
- dynlights->p_lspr[dynlights->nb] = t_lspr[thing->sprite];
-
- dynlights->nb++;
- if (dynlights->nb > DL_MAX_LIGHT)
- dynlights->nb = DL_MAX_LIGHT;
- }
-}
-
-//Hurdler: The goal of this function is to walk through all the bsp starting
-// on the top.
-// We need to do that to know all the lights in the map and all the walls
-static void HWR_ComputeLightMapsInBSPNode(int bspnum, fixed_t *bbox)
-{
- if (bspnum & NF_SUBSECTOR) // Found a subsector?
- {
- if (bspnum == -1)
- HWR_CheckSubsector(0, bbox); // probably unecessary: see boris' comment in hw_bsp
- else
- HWR_CheckSubsector(bspnum&(~NF_SUBSECTOR), bbox);
- return;
- }
- HWR_ComputeLightMapsInBSPNode(nodes[bspnum].children[0], nodes[bspnum].bbox[0]);
- HWR_ComputeLightMapsInBSPNode(nodes[bspnum].children[1], nodes[bspnum].bbox[1]);
-}
-
-static void HWR_SearchLightsInMobjs(void)
-{
- thinker_t * th;
- //mobj_t * mobj;
-
- // search in the list of thinkers
- for (th = thinkercap.next; th != &thinkercap; th = th->next)
- {
- // a mobj ?
- if (th->function.acp1 == (actionf_p1)P_MobjThinker)
- HWR_AddMobjLights((mobj_t *)th);
- }
-}
-#endif
-
-//
-// HWR_CreateStaticLightmaps()
-//
-void HWR_CreateStaticLightmaps(int bspnum)
-{
-#ifdef STATICLIGHT
- CONS_Debug(DBG_RENDER, "HWR_CreateStaticLightmaps\n");
-
- dynlights->nb = 0;
-
- // First: Searching for lights
- // BP: if i was you, I will make it in create mobj since mobj can be create
- // at runtime now with fragle scipt
- HWR_SearchLightsInMobjs();
- CONS_Debug(DBG_RENDER, "%d lights found\n", dynlights->nb);
-
- // Second: Build all lightmap for walls covered by lights
- validcount++; // to be sure
- HWR_ComputeLightMapsInBSPNode(bspnum, NULL);
-
- dynlights->nb = 0;
-#else
- (void)bspnum;
-#endif
-}
-
-/**
- \todo
-
- - Les coronas ne sont pas g�er avec le nouveau systeme, seul le dynamic lighting l'est
- - calculer l'offset des coronas au chargement du level et non faire la moyenne
- au moment de l'afficher
- BP: euh non en fait il faux encoder la position de la light dans le sprite
- car c'est pas focement au mileux de plus il peut en y avoir plusieur (chandelier)
- - changer la comparaison pour l'affichage des coronas (+ un epsilon)
- BP: non non j'ai trouver mieux :) : lord du AddSprite tu rajoute aussi la coronas
- dans la sprite list ! avec un z de epsilon (attention au ZCLIP_PLANE) et donc on
- l'affiche en dernier histoir qu'il puisse etre cacher par d'autre sprite :)
- Bon fait metre pas mal de code special dans hwr_project sprite mais sa vaux le
- coup
- - gerer dynamic et static : retenir le nombre de lightstatic et clearer toute les
- light > lightstatic (les dynamique) et les lightmap correspondant dans les segs
- puit refaire une passe avec le code si dessus mais rien que pour les dynamiques
- (tres petite modification)
- - finalement virer le hack splitscreen, il n'est plus necessaire !
-*/
-#endif
-#endif // HWRENDER
+#endif // HWRENDER
\ No newline at end of file
diff --git a/src/hardware/hw_light.h b/src/hardware/hw_light.h
index 2733cc69..fbc1d1f2 100644
--- a/src/hardware/hw_light.h
+++ b/src/hardware/hw_light.h
@@ -1,17 +1,12 @@
-// Emacs style mode select -*- C++ -*-
+// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
-//
+// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
+// Copyright (C) 1999-2019 by Sonic Team Junior.
//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file
/// \brief Dynamic lighting & coronas add on by Hurdler
@@ -22,79 +17,4 @@
#include "hw_glob.h"
#include "hw_defs.h"
-#define NUMLIGHTFREESLOTS 32 // Free light slots (for SOCs)
-
-#ifdef ALAM_LIGHTING
-#define NEWCORONAS
-
-#define DL_MAX_LIGHT 256 // maximum number of lights (extra lights are ignored)
-
-void HWR_InitLight(void);
-void HWR_DL_AddLight(gr_vissprite_t *spr, GLPatch_t *patch);
-void HWR_PlaneLighting(FOutVector *clVerts, int nrClipVerts);
-void HWR_WallLighting(FOutVector *wlVerts);
-void HWR_ResetLights(void);
-void HWR_SetLights(int viewnumber);
-
-#ifdef NEWCORONAS
-void HWR_DrawCoronas(void);
-#else
-void HWR_DoCoronasLighting(FOutVector *outVerts, gr_vissprite_t *spr);
-#endif
-
-typedef struct
-{
- int nb;
- light_t *p_lspr[DL_MAX_LIGHT];
- FVector position[DL_MAX_LIGHT]; // actually maximum DL_MAX_LIGHT lights
- mobj_t *mo[DL_MAX_LIGHT];
-} dynlights_t;
-
-#endif
-
-typedef enum
-{
- NOLIGHT = 0,
- RINGSPARK_L,
- SUPERSONIC_L, // Cool. =)
- SUPERSPARK_L,
- INVINCIBLE_L,
- GREENSHIELD_L,
- BLUESHIELD_L,
- YELLOWSHIELD_L,
- REDSHIELD_L,
- BLACKSHIELD_L,
- WHITESHIELD_L,
- SMALLREDBALL_L,
- RINGLIGHT_L,
- GREENSMALL_L,
- REDSMALL_L,
- GREENSHINE_L,
- ORANGESHINE_L,
- PINKSHINE_L,
- BLUESHINE_L,
- REDSHINE_L,
- LBLUESHINE_L,
- GREYSHINE_L,
- REDBALL_L,
- GREENBALL_L,
- BLUEBALL_L,
- NIGHTSLIGHT_L,
- JETLIGHT_L,
- GOOPLIGHT_L,
- STREETLIGHT_L,
-
- // free slots for SOCs at run-time --------------------
- FREESLOT0_L,
- //
- // ... 32 free lights here ...
- //
- LASTFREESLOT_L = (FREESLOT0_L+NUMLIGHTFREESLOTS-1),
- // end of freeslots ---------------------------------------------
-
- NUMLIGHTS
-} lightspritenum_t;
-
-extern light_t lspr[NUMLIGHTS];
-extern light_t *t_lspr[NUMSPRITES];
#endif
diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c
index 6a08b1c7..31ea0760 100644
--- a/src/hardware/hw_main.c
+++ b/src/hardware/hw_main.c
@@ -1,17 +1,12 @@
-// Emacs style mode select -*- C++ -*-
+// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
-//
+// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
+// Copyright (C) 1999-2019 by Sonic Team Junior.
//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file
/// \brief hardware renderer, using the standard HardWareRender driver DLL for SRB2
@@ -21,16 +16,20 @@
#include "../doomstat.h"
#ifdef HWRENDER
+#include "hw_main.h"
#include "hw_glob.h"
-#include "hw_light.h"
#include "hw_drv.h"
+#include "hw_md2.h"
+#include "hw_clip.h"
+#include "hw_light.h"
#include "../i_video.h" // for rendermode == render_glide
#include "../v_video.h"
#include "../p_local.h"
#include "../p_setup.h"
#include "../r_local.h"
-#include "../r_bsp.h"
+#include "../r_bsp.h" // R_NoEncore
+#include "../r_main.h" // cv_fov
#include "../d_clisrv.h"
#include "../w_wad.h"
#include "../z_zone.h"
@@ -39,19 +38,12 @@
#include "../st_stuff.h"
#include "../i_system.h"
#include "../m_cheat.h"
+
#ifdef ESLOPE
#include "../p_slopes.h"
#endif
-#include "hw_md2.h"
-#ifdef NEWCLIP
-#include "hw_clip.h"
-#endif
-
-#define R_FAKEFLOORS
-#define HWPRECIP
-#define SORTING
-//#define POLYSKY
+#define ABS(x) ((x) < 0 ? -(x) : (x))
// ==========================================================================
// the hardware driver object
@@ -59,36 +51,11 @@
struct hwdriver_s hwdriver;
// ==========================================================================
-// PROTOS
+// Commands and console variables
// ==========================================================================
-
-static void HWR_AddSprites(sector_t *sec);
-static void HWR_ProjectSprite(mobj_t *thing);
-#ifdef HWPRECIP
-static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing);
-#endif
-
-#ifdef SORTING
-void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight,
- INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap);
-void HWR_AddTransparentPolyobjectFloor(lumpnum_t lumpnum, polyobj_t *polysector, boolean isceiling, fixed_t fixedheight,
- INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, extracolormap_t *planecolormap);
-#else
-static void HWR_Add3DWater(lumpnum_t lumpnum, extrasubsector_t *xsub, fixed_t fixedheight,
- INT32 lightlevel, INT32 alpha, sector_t *FOFSector);
-static void HWR_Render3DWater(void);
-static void HWR_RenderTransparentWalls(void);
-#endif
-static void HWR_FoggingOn(void);
-static UINT32 atohex(const char *s);
-
static void CV_filtermode_ONChange(void);
static void CV_anisotropic_ONChange(void);
-static void CV_FogDensity_ONChange(void);
-// ==========================================================================
-// 3D ENGINE COMMANDS & CONSOLE VARS
-// ==========================================================================
static CV_PossibleValue_t grfiltermode_cons_t[]= {{HWD_SET_TEXTUREFILTER_POINTSAMPLED, "Nearest"},
{HWD_SET_TEXTUREFILTER_BILINEAR, "Bilinear"}, {HWD_SET_TEXTUREFILTER_TRILINEAR, "Trilinear"},
@@ -98,35 +65,16 @@ static CV_PossibleValue_t grfiltermode_cons_t[]= {{HWD_SET_TEXTUREFILTER_POINTSA
{0, NULL}};
CV_PossibleValue_t granisotropicmode_cons_t[] = {{1, "MIN"}, {16, "MAX"}, {0, NULL}};
-boolean drawsky = true;
-
-// needs fix: walls are incorrectly clipped one column less
-#ifndef NEWCLIP
-static consvar_t cv_grclipwalls = {"gr_clipwalls", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
-#endif
-//development variables for diverse uses
-static consvar_t cv_gralpha = {"gr_alpha", "160", 0, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
-static consvar_t cv_grbeta = {"gr_beta", "0", 0, CV_Unsigned, NULL, 0, NULL, NULL, 0, 0, NULL};
-
-static float HWRWipeCounter = 1.0f;
consvar_t cv_grrounddown = {"gr_rounddown", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
-consvar_t cv_grfogdensity = {"gr_fogdensity", "150", CV_CALL|CV_NOINIT, CV_Unsigned,
- CV_FogDensity_ONChange, 0, NULL, NULL, 0, 0, NULL};
// Unfortunately, this can no longer be saved..
consvar_t cv_grfiltermode = {"gr_filtermode", "Nearest", CV_CALL, grfiltermode_cons_t,
CV_filtermode_ONChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_granisotropicmode = {"gr_anisotropicmode", "1", CV_CALL, granisotropicmode_cons_t,
CV_anisotropic_ONChange, 0, NULL, NULL, 0, 0, NULL};
-//static consvar_t cv_grzbuffer = {"gr_zbuffer", "On", 0, CV_OnOff};
consvar_t cv_grcorrecttricks = {"gr_correcttricks", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
-static void CV_FogDensity_ONChange(void)
-{
- HWD.pfnSetSpecialState(HWD_SET_FOG_DENSITY, cv_grfogdensity.value);
-}
-
static void CV_filtermode_ONChange(void)
{
HWD.pfnSetSpecialState(HWD_SET_TEXTUREFILTERMODE, cv_grfiltermode.value);
@@ -137,193 +85,9 @@ static void CV_anisotropic_ONChange(void)
HWD.pfnSetSpecialState(HWD_SET_TEXTUREANISOTROPICMODE, cv_granisotropicmode.value);
}
-/*
- * lookuptable for lightvalues
- * calculated as follow:
- * floatlight = (1.0-exp((light^3)*gamma)) / (1.0-exp(1.0*gamma));
- * gamma=-0,2;-2,0;-4,0;-6,0;-8,0
- * light = 0,0 .. 1,0
- */
-static const float lighttable[5][256] =
-{
- {
- 0.00000f,0.00000f,0.00000f,0.00000f,0.00000f,0.00001f,0.00001f,0.00002f,0.00003f,0.00004f,
- 0.00006f,0.00008f,0.00010f,0.00013f,0.00017f,0.00020f,0.00025f,0.00030f,0.00035f,0.00041f,
- 0.00048f,0.00056f,0.00064f,0.00073f,0.00083f,0.00094f,0.00106f,0.00119f,0.00132f,0.00147f,
- 0.00163f,0.00180f,0.00198f,0.00217f,0.00237f,0.00259f,0.00281f,0.00305f,0.00331f,0.00358f,
- 0.00386f,0.00416f,0.00447f,0.00479f,0.00514f,0.00550f,0.00587f,0.00626f,0.00667f,0.00710f,
- 0.00754f,0.00800f,0.00848f,0.00898f,0.00950f,0.01003f,0.01059f,0.01117f,0.01177f,0.01239f,
- 0.01303f,0.01369f,0.01437f,0.01508f,0.01581f,0.01656f,0.01734f,0.01814f,0.01896f,0.01981f,
- 0.02069f,0.02159f,0.02251f,0.02346f,0.02444f,0.02544f,0.02647f,0.02753f,0.02862f,0.02973f,
- 0.03088f,0.03205f,0.03325f,0.03448f,0.03575f,0.03704f,0.03836f,0.03971f,0.04110f,0.04252f,
- 0.04396f,0.04545f,0.04696f,0.04851f,0.05009f,0.05171f,0.05336f,0.05504f,0.05676f,0.05852f,
- 0.06031f,0.06214f,0.06400f,0.06590f,0.06784f,0.06981f,0.07183f,0.07388f,0.07597f,0.07810f,
- 0.08027f,0.08248f,0.08473f,0.08702f,0.08935f,0.09172f,0.09414f,0.09659f,0.09909f,0.10163f,
- 0.10421f,0.10684f,0.10951f,0.11223f,0.11499f,0.11779f,0.12064f,0.12354f,0.12648f,0.12946f,
- 0.13250f,0.13558f,0.13871f,0.14188f,0.14511f,0.14838f,0.15170f,0.15507f,0.15850f,0.16197f,
- 0.16549f,0.16906f,0.17268f,0.17635f,0.18008f,0.18386f,0.18769f,0.19157f,0.19551f,0.19950f,
- 0.20354f,0.20764f,0.21179f,0.21600f,0.22026f,0.22458f,0.22896f,0.23339f,0.23788f,0.24242f,
- 0.24702f,0.25168f,0.25640f,0.26118f,0.26602f,0.27091f,0.27587f,0.28089f,0.28596f,0.29110f,
- 0.29630f,0.30156f,0.30688f,0.31226f,0.31771f,0.32322f,0.32879f,0.33443f,0.34013f,0.34589f,
- 0.35172f,0.35761f,0.36357f,0.36960f,0.37569f,0.38185f,0.38808f,0.39437f,0.40073f,0.40716f,
- 0.41366f,0.42022f,0.42686f,0.43356f,0.44034f,0.44718f,0.45410f,0.46108f,0.46814f,0.47527f,
- 0.48247f,0.48974f,0.49709f,0.50451f,0.51200f,0.51957f,0.52721f,0.53492f,0.54271f,0.55058f,
- 0.55852f,0.56654f,0.57463f,0.58280f,0.59105f,0.59937f,0.60777f,0.61625f,0.62481f,0.63345f,
- 0.64217f,0.65096f,0.65984f,0.66880f,0.67783f,0.68695f,0.69615f,0.70544f,0.71480f,0.72425f,
- 0.73378f,0.74339f,0.75308f,0.76286f,0.77273f,0.78268f,0.79271f,0.80283f,0.81304f,0.82333f,
- 0.83371f,0.84417f,0.85472f,0.86536f,0.87609f,0.88691f,0.89781f,0.90880f,0.91989f,0.93106f,
- 0.94232f,0.95368f,0.96512f,0.97665f,0.98828f,1.00000f
- },
- {
- 0.00000f,0.00000f,0.00000f,0.00000f,0.00001f,0.00002f,0.00003f,0.00005f,0.00007f,0.00010f,
- 0.00014f,0.00019f,0.00024f,0.00031f,0.00038f,0.00047f,0.00057f,0.00069f,0.00081f,0.00096f,
- 0.00112f,0.00129f,0.00148f,0.00170f,0.00193f,0.00218f,0.00245f,0.00274f,0.00306f,0.00340f,
- 0.00376f,0.00415f,0.00456f,0.00500f,0.00547f,0.00597f,0.00649f,0.00704f,0.00763f,0.00825f,
- 0.00889f,0.00957f,0.01029f,0.01104f,0.01182f,0.01264f,0.01350f,0.01439f,0.01532f,0.01630f,
- 0.01731f,0.01836f,0.01945f,0.02058f,0.02176f,0.02298f,0.02424f,0.02555f,0.02690f,0.02830f,
- 0.02974f,0.03123f,0.03277f,0.03436f,0.03600f,0.03768f,0.03942f,0.04120f,0.04304f,0.04493f,
- 0.04687f,0.04886f,0.05091f,0.05301f,0.05517f,0.05738f,0.05964f,0.06196f,0.06434f,0.06677f,
- 0.06926f,0.07181f,0.07441f,0.07707f,0.07979f,0.08257f,0.08541f,0.08831f,0.09126f,0.09428f,
- 0.09735f,0.10048f,0.10368f,0.10693f,0.11025f,0.11362f,0.11706f,0.12056f,0.12411f,0.12773f,
- 0.13141f,0.13515f,0.13895f,0.14281f,0.14673f,0.15072f,0.15476f,0.15886f,0.16303f,0.16725f,
- 0.17153f,0.17587f,0.18028f,0.18474f,0.18926f,0.19383f,0.19847f,0.20316f,0.20791f,0.21272f,
- 0.21759f,0.22251f,0.22748f,0.23251f,0.23760f,0.24274f,0.24793f,0.25318f,0.25848f,0.26383f,
- 0.26923f,0.27468f,0.28018f,0.28573f,0.29133f,0.29697f,0.30266f,0.30840f,0.31418f,0.32001f,
- 0.32588f,0.33179f,0.33774f,0.34374f,0.34977f,0.35585f,0.36196f,0.36810f,0.37428f,0.38050f,
- 0.38675f,0.39304f,0.39935f,0.40570f,0.41207f,0.41847f,0.42490f,0.43136f,0.43784f,0.44434f,
- 0.45087f,0.45741f,0.46398f,0.47057f,0.47717f,0.48379f,0.49042f,0.49707f,0.50373f,0.51041f,
- 0.51709f,0.52378f,0.53048f,0.53718f,0.54389f,0.55061f,0.55732f,0.56404f,0.57075f,0.57747f,
- 0.58418f,0.59089f,0.59759f,0.60429f,0.61097f,0.61765f,0.62432f,0.63098f,0.63762f,0.64425f,
- 0.65086f,0.65746f,0.66404f,0.67060f,0.67714f,0.68365f,0.69015f,0.69662f,0.70307f,0.70948f,
- 0.71588f,0.72224f,0.72857f,0.73488f,0.74115f,0.74739f,0.75359f,0.75976f,0.76589f,0.77199f,
- 0.77805f,0.78407f,0.79005f,0.79599f,0.80189f,0.80774f,0.81355f,0.81932f,0.82504f,0.83072f,
- 0.83635f,0.84194f,0.84747f,0.85296f,0.85840f,0.86378f,0.86912f,0.87441f,0.87964f,0.88482f,
- 0.88995f,0.89503f,0.90005f,0.90502f,0.90993f,0.91479f,0.91959f,0.92434f,0.92903f,0.93366f,
- 0.93824f,0.94276f,0.94723f,0.95163f,0.95598f,0.96027f,0.96451f,0.96868f,0.97280f,0.97686f,
- 0.98086f,0.98481f,0.98869f,0.99252f,0.99629f,1.00000f
- },
- {
- 0.00000f,0.00000f,0.00000f,0.00001f,0.00002f,0.00003f,0.00005f,0.00008f,0.00013f,0.00018f,
- 0.00025f,0.00033f,0.00042f,0.00054f,0.00067f,0.00083f,0.00101f,0.00121f,0.00143f,0.00168f,
- 0.00196f,0.00227f,0.00261f,0.00299f,0.00339f,0.00383f,0.00431f,0.00483f,0.00538f,0.00598f,
- 0.00661f,0.00729f,0.00802f,0.00879f,0.00961f,0.01048f,0.01140f,0.01237f,0.01340f,0.01447f,
- 0.01561f,0.01680f,0.01804f,0.01935f,0.02072f,0.02215f,0.02364f,0.02520f,0.02682f,0.02850f,
- 0.03026f,0.03208f,0.03397f,0.03594f,0.03797f,0.04007f,0.04225f,0.04451f,0.04684f,0.04924f,
- 0.05172f,0.05428f,0.05691f,0.05963f,0.06242f,0.06530f,0.06825f,0.07129f,0.07441f,0.07761f,
- 0.08089f,0.08426f,0.08771f,0.09125f,0.09487f,0.09857f,0.10236f,0.10623f,0.11019f,0.11423f,
- 0.11836f,0.12257f,0.12687f,0.13125f,0.13571f,0.14027f,0.14490f,0.14962f,0.15442f,0.15931f,
- 0.16427f,0.16932f,0.17445f,0.17966f,0.18496f,0.19033f,0.19578f,0.20130f,0.20691f,0.21259f,
- 0.21834f,0.22417f,0.23007f,0.23605f,0.24209f,0.24820f,0.25438f,0.26063f,0.26694f,0.27332f,
- 0.27976f,0.28626f,0.29282f,0.29944f,0.30611f,0.31284f,0.31962f,0.32646f,0.33334f,0.34027f,
- 0.34724f,0.35426f,0.36132f,0.36842f,0.37556f,0.38273f,0.38994f,0.39718f,0.40445f,0.41174f,
- 0.41907f,0.42641f,0.43378f,0.44116f,0.44856f,0.45598f,0.46340f,0.47084f,0.47828f,0.48573f,
- 0.49319f,0.50064f,0.50809f,0.51554f,0.52298f,0.53042f,0.53784f,0.54525f,0.55265f,0.56002f,
- 0.56738f,0.57472f,0.58203f,0.58932f,0.59658f,0.60381f,0.61101f,0.61817f,0.62529f,0.63238f,
- 0.63943f,0.64643f,0.65339f,0.66031f,0.66717f,0.67399f,0.68075f,0.68746f,0.69412f,0.70072f,
- 0.70726f,0.71375f,0.72017f,0.72653f,0.73282f,0.73905f,0.74522f,0.75131f,0.75734f,0.76330f,
- 0.76918f,0.77500f,0.78074f,0.78640f,0.79199f,0.79751f,0.80295f,0.80831f,0.81359f,0.81880f,
- 0.82393f,0.82898f,0.83394f,0.83883f,0.84364f,0.84836f,0.85301f,0.85758f,0.86206f,0.86646f,
- 0.87078f,0.87502f,0.87918f,0.88326f,0.88726f,0.89118f,0.89501f,0.89877f,0.90245f,0.90605f,
- 0.90957f,0.91301f,0.91638f,0.91966f,0.92288f,0.92601f,0.92908f,0.93206f,0.93498f,0.93782f,
- 0.94059f,0.94329f,0.94592f,0.94848f,0.95097f,0.95339f,0.95575f,0.95804f,0.96027f,0.96244f,
- 0.96454f,0.96658f,0.96856f,0.97049f,0.97235f,0.97416f,0.97591f,0.97760f,0.97924f,0.98083f,
- 0.98237f,0.98386f,0.98530f,0.98669f,0.98803f,0.98933f,0.99058f,0.99179f,0.99295f,0.99408f,
- 0.99516f,0.99620f,0.99721f,0.99817f,0.99910f,1.00000f
- },
- {
- 0.00000f,0.00000f,0.00000f,0.00001f,0.00002f,0.00005f,0.00008f,0.00012f,0.00019f,0.00026f,
- 0.00036f,0.00048f,0.00063f,0.00080f,0.00099f,0.00122f,0.00148f,0.00178f,0.00211f,0.00249f,
- 0.00290f,0.00335f,0.00386f,0.00440f,0.00500f,0.00565f,0.00636f,0.00711f,0.00793f,0.00881f,
- 0.00975f,0.01075f,0.01182f,0.01295f,0.01416f,0.01543f,0.01678f,0.01821f,0.01971f,0.02129f,
- 0.02295f,0.02469f,0.02652f,0.02843f,0.03043f,0.03252f,0.03469f,0.03696f,0.03933f,0.04178f,
- 0.04433f,0.04698f,0.04973f,0.05258f,0.05552f,0.05857f,0.06172f,0.06498f,0.06834f,0.07180f,
- 0.07537f,0.07905f,0.08283f,0.08672f,0.09072f,0.09483f,0.09905f,0.10337f,0.10781f,0.11236f,
- 0.11701f,0.12178f,0.12665f,0.13163f,0.13673f,0.14193f,0.14724f,0.15265f,0.15817f,0.16380f,
- 0.16954f,0.17538f,0.18132f,0.18737f,0.19351f,0.19976f,0.20610f,0.21255f,0.21908f,0.22572f,
- 0.23244f,0.23926f,0.24616f,0.25316f,0.26023f,0.26739f,0.27464f,0.28196f,0.28935f,0.29683f,
- 0.30437f,0.31198f,0.31966f,0.32740f,0.33521f,0.34307f,0.35099f,0.35896f,0.36699f,0.37506f,
- 0.38317f,0.39133f,0.39952f,0.40775f,0.41601f,0.42429f,0.43261f,0.44094f,0.44929f,0.45766f,
- 0.46604f,0.47443f,0.48283f,0.49122f,0.49962f,0.50801f,0.51639f,0.52476f,0.53312f,0.54146f,
- 0.54978f,0.55807f,0.56633f,0.57457f,0.58277f,0.59093f,0.59905f,0.60713f,0.61516f,0.62314f,
- 0.63107f,0.63895f,0.64676f,0.65452f,0.66221f,0.66984f,0.67739f,0.68488f,0.69229f,0.69963f,
- 0.70689f,0.71407f,0.72117f,0.72818f,0.73511f,0.74195f,0.74870f,0.75536f,0.76192f,0.76839f,
- 0.77477f,0.78105f,0.78723f,0.79331f,0.79930f,0.80518f,0.81096f,0.81664f,0.82221f,0.82768f,
- 0.83305f,0.83832f,0.84347f,0.84853f,0.85348f,0.85832f,0.86306f,0.86770f,0.87223f,0.87666f,
- 0.88098f,0.88521f,0.88933f,0.89334f,0.89726f,0.90108f,0.90480f,0.90842f,0.91194f,0.91537f,
- 0.91870f,0.92193f,0.92508f,0.92813f,0.93109f,0.93396f,0.93675f,0.93945f,0.94206f,0.94459f,
- 0.94704f,0.94941f,0.95169f,0.95391f,0.95604f,0.95810f,0.96009f,0.96201f,0.96386f,0.96564f,
- 0.96735f,0.96900f,0.97059f,0.97212f,0.97358f,0.97499f,0.97634f,0.97764f,0.97888f,0.98007f,
- 0.98122f,0.98231f,0.98336f,0.98436f,0.98531f,0.98623f,0.98710f,0.98793f,0.98873f,0.98949f,
- 0.99021f,0.99090f,0.99155f,0.99218f,0.99277f,0.99333f,0.99387f,0.99437f,0.99486f,0.99531f,
- 0.99575f,0.99616f,0.99654f,0.99691f,0.99726f,0.99759f,0.99790f,0.99819f,0.99847f,0.99873f,
- 0.99897f,0.99920f,0.99942f,0.99963f,0.99982f,1.00000f
- },
- {
- 0.00000f,0.00000f,0.00000f,0.00001f,0.00003f,0.00006f,0.00010f,0.00017f,0.00025f,0.00035f,
- 0.00048f,0.00064f,0.00083f,0.00106f,0.00132f,0.00163f,0.00197f,0.00237f,0.00281f,0.00330f,
- 0.00385f,0.00446f,0.00513f,0.00585f,0.00665f,0.00751f,0.00845f,0.00945f,0.01054f,0.01170f,
- 0.01295f,0.01428f,0.01569f,0.01719f,0.01879f,0.02048f,0.02227f,0.02415f,0.02614f,0.02822f,
- 0.03042f,0.03272f,0.03513f,0.03765f,0.04028f,0.04303f,0.04589f,0.04887f,0.05198f,0.05520f,
- 0.05855f,0.06202f,0.06561f,0.06933f,0.07318f,0.07716f,0.08127f,0.08550f,0.08987f,0.09437f,
- 0.09900f,0.10376f,0.10866f,0.11369f,0.11884f,0.12414f,0.12956f,0.13512f,0.14080f,0.14662f,
- 0.15257f,0.15865f,0.16485f,0.17118f,0.17764f,0.18423f,0.19093f,0.19776f,0.20471f,0.21177f,
- 0.21895f,0.22625f,0.23365f,0.24117f,0.24879f,0.25652f,0.26435f,0.27228f,0.28030f,0.28842f,
- 0.29662f,0.30492f,0.31329f,0.32175f,0.33028f,0.33889f,0.34756f,0.35630f,0.36510f,0.37396f,
- 0.38287f,0.39183f,0.40084f,0.40989f,0.41897f,0.42809f,0.43723f,0.44640f,0.45559f,0.46479f,
- 0.47401f,0.48323f,0.49245f,0.50167f,0.51088f,0.52008f,0.52927f,0.53843f,0.54757f,0.55668f,
- 0.56575f,0.57479f,0.58379f,0.59274f,0.60164f,0.61048f,0.61927f,0.62799f,0.63665f,0.64524f,
- 0.65376f,0.66220f,0.67056f,0.67883f,0.68702f,0.69511f,0.70312f,0.71103f,0.71884f,0.72655f,
- 0.73415f,0.74165f,0.74904f,0.75632f,0.76348f,0.77053f,0.77747f,0.78428f,0.79098f,0.79756f,
- 0.80401f,0.81035f,0.81655f,0.82264f,0.82859f,0.83443f,0.84013f,0.84571f,0.85117f,0.85649f,
- 0.86169f,0.86677f,0.87172f,0.87654f,0.88124f,0.88581f,0.89026f,0.89459f,0.89880f,0.90289f,
- 0.90686f,0.91071f,0.91445f,0.91807f,0.92157f,0.92497f,0.92826f,0.93143f,0.93450f,0.93747f,
- 0.94034f,0.94310f,0.94577f,0.94833f,0.95081f,0.95319f,0.95548f,0.95768f,0.95980f,0.96183f,
- 0.96378f,0.96565f,0.96744f,0.96916f,0.97081f,0.97238f,0.97388f,0.97532f,0.97669f,0.97801f,
- 0.97926f,0.98045f,0.98158f,0.98266f,0.98369f,0.98467f,0.98560f,0.98648f,0.98732f,0.98811f,
- 0.98886f,0.98958f,0.99025f,0.99089f,0.99149f,0.99206f,0.99260f,0.99311f,0.99359f,0.99404f,
- 0.99446f,0.99486f,0.99523f,0.99559f,0.99592f,0.99623f,0.99652f,0.99679f,0.99705f,0.99729f,
- 0.99751f,0.99772f,0.99792f,0.99810f,0.99827f,0.99843f,0.99857f,0.99871f,0.99884f,0.99896f,
- 0.99907f,0.99917f,0.99926f,0.99935f,0.99943f,0.99951f,0.99958f,0.99964f,0.99970f,0.99975f,
- 0.99980f,0.99985f,0.99989f,0.99993f,0.99997f,1.00000f
- }
-};
-
-#define gld_CalcLightLevel(lightlevel) (lighttable[1][max(min((lightlevel),255),0)])
-
// ==========================================================================
-// VIEW GLOBALS
+// Globals
// ==========================================================================
-// Fineangles in the SCREENWIDTH wide window.
-#define FIELDOFVIEW ANGLE_90
-#define ABS(x) ((x) < 0 ? -(x) : (x))
-
-static angle_t gr_clipangle;
-
-// The viewangletox[viewangle + FINEANGLES/4] lookup
-// maps the visible view angles to screen X coordinates,
-// flattening the arc to a flat projection plane.
-// There will be many angles mapped to the same X.
-static INT32 gr_viewangletox[FINEANGLES/2];
-
-// The xtoviewangleangle[] table maps a screen pixel
-// to the lowest viewangle that maps back to x ranges
-// from clipangle to -clipangle.
-static angle_t gr_xtoviewangle[MAXVIDWIDTH+1];
-
-// ==========================================================================
-// GLOBALS
-// ==========================================================================
-
-// uncomment to remove the plane rendering
-#define DOPLANES
-//#define DOWALLS
-
-// test of drawing sky by polygons like in software with visplane, unfortunately
-// this doesn't work since we must have z for pixel and z for texture (not like now with z = oow)
-//#define POLYSKY
-
-// test change fov when looking up/down but bsp projection messup :(
-//#define NOCRAPPYMLOOK
// base values set at SetViewSize
static float gr_basecentery;
@@ -343,160 +107,160 @@ static float gr_windowcentery;
static float gr_pspritexscale, gr_pspriteyscale;
+
static seg_t *gr_curline;
static side_t *gr_sidedef;
static line_t *gr_linedef;
static sector_t *gr_frontsector;
static sector_t *gr_backsector;
-// --------------------------------------------------------------------------
-// STUFF FOR THE PROJECTION CODE
-// --------------------------------------------------------------------------
+// ==========================================================================
+// View position
+// ==========================================================================
FTransform atransform;
-// duplicates of the main code, set after R_SetupFrame() passed them into sharedstruct,
-// copied here for local use
-static fixed_t dup_viewx, dup_viewy, dup_viewz;
-static angle_t dup_viewangle;
+// Float variants of viewx, viewy, viewz, etc.
static float gr_viewx, gr_viewy, gr_viewz;
static float gr_viewsin, gr_viewcos;
-// Maybe not necessary with the new T&L code (needs to be checked!)
-static float gr_viewludsin, gr_viewludcos; // look up down kik test
-static float gr_fovlud;
+static angle_t gr_aimingangle;
+static float gr_viewludsin, gr_viewludcos;
+
+static INT32 drawcount = 0;
// ==========================================================================
-// LIGHT stuffs
+// Lighting
// ==========================================================================
-static UINT8 lightleveltonumlut[256];
-
-// added to SRB2's sector lightlevel to make things a bit brighter (sprites/walls/planes)
-FUNCMATH UINT8 LightLevelToLum(INT32 l)
-{
- return (UINT8)(255*gld_CalcLightLevel(l));
-}
-
-static inline void InitLumLut(void)
-{
- INT32 i, k = 0;
- for (i = 0; i < 256; i++)
- {
- if (i > 128)
- k += 2;
- else
- k = 1;
- lightleveltonumlut[i] = (UINT8)(k);
- }
-}
-
-//#define FOGFACTOR 300 //was 600 >> Covered by cv_grfogdensity
-#define NORMALFOG 0x00000000
-#define FADEFOG 0x19000000
-#define CALCFOGDENSITY(x) ((float)((5220.0f*(1.0f/((x)/41.0f+1.0f)))-(5220.0f*(1.0f/(255.0f/41.0f+1.0f))))) // Approximate fog calculation based off of software walls
-#define CALCFOGDENSITYFLOOR(x) ((float)((40227.0f*(1.0f/((x)/11.0f+1.0f)))-(40227.0f*(1.0f/(255.0f/11.0f+1.0f))))) // Approximate fog calculation based off of software floors
#define CALCLIGHT(x,y) ((float)(x)*((y)/255.0f))
-UINT32 HWR_Lighting(INT32 light, UINT32 color, UINT32 fadecolor, boolean fogblockpoly, boolean plane)
-{
- RGBA_t realcolor, fogcolor, surfcolor;
- INT32 alpha, fogalpha;
- (void)fogblockpoly;
+void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, UINT32 mixcolor, UINT32 fadecolor)
+{
+ RGBA_t mix_color, fog_color, final_color;
+ INT32 mix;
+ float fog_alpha;
+
+ mix_color.rgba = mixcolor;
+ fog_color.rgba = fadecolor;
+
+ mix = mix_color.s.alpha*10/5;
+ if (mix > 25) mix = 25;
+ mix *= 255;
+ mix /= 25;
+
+ // Modulate the colors by alpha.
+ mix_color.s.red = (UINT8)(CALCLIGHT(mix,mix_color.s.red));
+ mix_color.s.green = (UINT8)(CALCLIGHT(mix,mix_color.s.green));
+ mix_color.s.blue = (UINT8)(CALCLIGHT(mix,mix_color.s.blue));
+
+ // Set the surface colors and further modulate the colors by light.
+ final_color.s.red = (UINT8)(CALCLIGHT((0xFF-mix),0xFF)+CALCLIGHT(mix_color.s.red,0xFF));
+ final_color.s.green = (UINT8)(CALCLIGHT((0xFF-mix),0xFF)+CALCLIGHT(mix_color.s.green,0xFF));
+ final_color.s.blue = (UINT8)(CALCLIGHT((0xFF-mix),0xFF)+CALCLIGHT(mix_color.s.blue,0xFF));
+ final_color.s.alpha = 0xFF;
+
+ // Fog.
+ fog_alpha = (0xFF - fog_color.s.alpha) / 255.0f;
+
+ // Set the surface colors and further modulate the colors by light.
+ fog_color.s.red = (UINT8)(((float)fog_color.s.red) * fog_alpha);
+ fog_color.s.green = (UINT8)(((float)fog_color.s.green) * fog_alpha);
+ fog_color.s.blue = (UINT8)(((float)fog_color.s.blue) * fog_alpha);
+
+ if (cv_grfog.value)
+ {
+ // be careful, this may get negative for high lightlevel values.
+ float fog = (fog_alpha - (light_level/255.0f))*3/2;
+ if (fog < 0)
+ fog = 0;
+
+ float red = ((fog_color.s.red/255.0f) * fog) + ((final_color.s.red/255.0f) * (1.0f - fog));
+ float green = ((fog_color.s.green/255.0f) * fog) + ((final_color.s.green/255.0f) * (1.0f - fog));
+ float blue = ((fog_color.s.blue/255.0f) * fog) + ((final_color.s.blue/255.0f) * (1.0f - fog));
+ final_color.s.red = (UINT8)(red*255.0f);
+ final_color.s.green = (UINT8)(green*255.0f);
+ final_color.s.blue = (UINT8)(blue*255.0f);
+ }
+
+ Surface->PolyColor.rgba = final_color.rgba;
+ Surface->FadeColor.rgba = fog_color.rgba;
+ Surface->LightInfo.light_level = light_level;
+}
+
+void HWR_NoColormapLighting(FSurfaceInfo *Surface, INT32 light_level, UINT32 mixcolor, UINT32 fadecolor)
+{
+ RGBA_t mix_color, fog_color, final_color;
+ INT32 mix, fogmix, lightmix;
+ float fog_alpha;
+
+ // You see the problem is that darker light isn't actually as dark as it SHOULD be.
+ lightmix = 255 - ((255 - light_level)*10/7);
// Don't go out of bounds
- if (light < 0)
- light = 0;
- else if (light > 255)
- light = 255;
+ if (lightmix < 0)
+ lightmix = 0;
+ else if (lightmix > 255)
+ lightmix = 255;
- realcolor.rgba = color;
- fogcolor.rgba = fadecolor;
+ mix_color.rgba = mixcolor;
+ fog_color.rgba = fadecolor;
- alpha = (realcolor.s.alpha*255)/25;
- fogalpha = (fogcolor.s.alpha*255)/25;
-
- if (cv_grfog.value && cv_grsoftwarefog.value) // Only do this when fog is on, software fog mode is on, and the poly is not from a fog block
+ // if shaders are off, or shaders are on, but fog is off:
+ // modulate colors by light here
+ if (!cv_grshaders.value || (cv_grshaders.value && !cv_grfog.value))
{
+ mix = (mix_color.s.alpha*255)/25;
+ fogmix = (fog_color.s.alpha*255)/25;
+
// Modulate the colors by alpha.
- realcolor.s.red = (UINT8)(CALCLIGHT(alpha,realcolor.s.red));
- realcolor.s.green = (UINT8)(CALCLIGHT(alpha,realcolor.s.green));
- realcolor.s.blue = (UINT8)(CALCLIGHT(alpha,realcolor.s.blue));
+ mix_color.s.red = (UINT8)(CALCLIGHT(mix,mix_color.s.red));
+ mix_color.s.green = (UINT8)(CALCLIGHT(mix,mix_color.s.green));
+ mix_color.s.blue = (UINT8)(CALCLIGHT(mix,mix_color.s.blue));
// Set the surface colors and further modulate the colors by light.
- surfcolor.s.red = (UINT8)(CALCLIGHT((0xFF-alpha),255)+CALCLIGHT(realcolor.s.red,255));
- surfcolor.s.green = (UINT8)(CALCLIGHT((0xFF-alpha),255)+CALCLIGHT(realcolor.s.green,255));
- surfcolor.s.blue = (UINT8)(CALCLIGHT((0xFF-alpha),255)+CALCLIGHT(realcolor.s.blue,255));
- surfcolor.s.alpha = 0xFF;
+ final_color.s.red = (UINT8)(CALCLIGHT((0xFF-mix),lightmix)+CALCLIGHT(mix_color.s.red,lightmix));
+ final_color.s.green = (UINT8)(CALCLIGHT((0xFF-mix),lightmix)+CALCLIGHT(mix_color.s.green,lightmix));
+ final_color.s.blue = (UINT8)(CALCLIGHT((0xFF-mix),lightmix)+CALCLIGHT(mix_color.s.blue,lightmix));
// Modulate the colors by alpha.
- fogcolor.s.red = (UINT8)(CALCLIGHT(fogalpha,fogcolor.s.red));
- fogcolor.s.green = (UINT8)(CALCLIGHT(fogalpha,fogcolor.s.green));
- fogcolor.s.blue = (UINT8)(CALCLIGHT(fogalpha,fogcolor.s.blue));
+ fog_color.s.red = (UINT8)(CALCLIGHT(fogmix,fog_color.s.red));
+ fog_color.s.green = (UINT8)(CALCLIGHT(fogmix,fog_color.s.green));
+ fog_color.s.blue = (UINT8)(CALCLIGHT(fogmix,fog_color.s.blue));
+
+ // Set the surface colors and further modulate the colors by light.
+ final_color.s.red = final_color.s.red+((UINT8)(CALCLIGHT((0xFF-fogmix),(0xFF-lightmix))+CALCLIGHT(fog_color.s.red,(0xFF-lightmix))));
+ final_color.s.green = final_color.s.green+((UINT8)(CALCLIGHT((0xFF-fogmix),(0xFF-lightmix))+CALCLIGHT(fog_color.s.green,(0xFF-lightmix))));
+ final_color.s.blue = final_color.s.blue+((UINT8)(CALCLIGHT((0xFF-fogmix),(0xFF-lightmix))+CALCLIGHT(fog_color.s.blue,(0xFF-lightmix))));
+ final_color.s.alpha = 0xFF;
}
+ // if shaders are on:
+ // modulate colors by light on the shader
else
- {
- // Modulate the colors by alpha.
- realcolor.s.red = (UINT8)(CALCLIGHT(alpha,realcolor.s.red));
- realcolor.s.green = (UINT8)(CALCLIGHT(alpha,realcolor.s.green));
- realcolor.s.blue = (UINT8)(CALCLIGHT(alpha,realcolor.s.blue));
+ final_color.rgba = 0xFFFFFFFF;
- // Set the surface colors and further modulate the colors by light.
- surfcolor.s.red = (UINT8)(CALCLIGHT((0xFF-alpha),light)+CALCLIGHT(realcolor.s.red,light));
- surfcolor.s.green = (UINT8)(CALCLIGHT((0xFF-alpha),light)+CALCLIGHT(realcolor.s.green,light));
- surfcolor.s.blue = (UINT8)(CALCLIGHT((0xFF-alpha),light)+CALCLIGHT(realcolor.s.blue,light));
+ // Fog.
+ fog_color.rgba = fadecolor;
+ fog_alpha = (0xFF - fog_color.s.alpha*10/7) / 255.0f;
- // Modulate the colors by alpha.
- fogcolor.s.red = (UINT8)(CALCLIGHT(fogalpha,fogcolor.s.red));
- fogcolor.s.green = (UINT8)(CALCLIGHT(fogalpha,fogcolor.s.green));
- fogcolor.s.blue = (UINT8)(CALCLIGHT(fogalpha,fogcolor.s.blue));
+ // Set the surface colors and further modulate the colors by light.
+ fog_color.s.red = (UINT8)(((float)fog_color.s.red) * fog_alpha);
+ fog_color.s.green = (UINT8)(((float)fog_color.s.green) * fog_alpha);
+ fog_color.s.blue = (UINT8)(((float)fog_color.s.blue) * fog_alpha);
- // Set the surface colors and further modulate the colors by light.
- surfcolor.s.red = surfcolor.s.red+((UINT8)(CALCLIGHT((0xFF-fogalpha),(255-light))+CALCLIGHT(fogcolor.s.red,(255-light))));
- surfcolor.s.green = surfcolor.s.green+((UINT8)(CALCLIGHT((0xFF-fogalpha),(255-light))+CALCLIGHT(fogcolor.s.green,(255-light))));
- surfcolor.s.blue = surfcolor.s.blue+((UINT8)(CALCLIGHT((0xFF-fogalpha),(255-light))+CALCLIGHT(fogcolor.s.blue,(255-light))));
- surfcolor.s.alpha = 0xFF;
- }
-
- if(cv_grfog.value)
- {
- if (cv_grsoftwarefog.value)
- {
- fogcolor.s.red = (UINT8)((CALCLIGHT(fogcolor.s.red,(255-light)))+(CALCLIGHT(realcolor.s.red,light)));
- fogcolor.s.green = (UINT8)((CALCLIGHT(fogcolor.s.green,(255-light)))+(CALCLIGHT(realcolor.s.green,light)));
- fogcolor.s.blue = (UINT8)((CALCLIGHT(fogcolor.s.blue,(255-light)))+(CALCLIGHT(realcolor.s.blue,light)));
-
- // Set the fog options.
- if (cv_grsoftwarefog.value == 1 && plane) // With floors, software draws them way darker for their distance
- HWD.pfnSetSpecialState(HWD_SET_FOG_DENSITY, (INT32)(CALCFOGDENSITYFLOOR(light)));
- else // everything else is drawn like walls
- HWD.pfnSetSpecialState(HWD_SET_FOG_DENSITY, (INT32)(CALCFOGDENSITY(light)));
- }
- else
- {
- fogcolor.s.red = (UINT8)((CALCLIGHT(fogcolor.s.red,(255-light)))+(CALCLIGHT(realcolor.s.red,light)));
- fogcolor.s.green = (UINT8)((CALCLIGHT(fogcolor.s.green,(255-light)))+(CALCLIGHT(realcolor.s.green,light)));
- fogcolor.s.blue = (UINT8)((CALCLIGHT(fogcolor.s.blue,(255-light)))+(CALCLIGHT(realcolor.s.blue,light)));
-
- fogalpha = (UINT8)((CALCLIGHT(fogalpha,(255-light)))+(CALCLIGHT(alpha,light)));
-
- // Set the fog options.
- light = (UINT8)(CALCLIGHT(light,(255-fogalpha)));
- HWD.pfnSetSpecialState(HWD_SET_FOG_DENSITY, (INT32)(cv_grfogdensity.value-(cv_grfogdensity.value*(float)light/255.0f)));
- }
-
- HWD.pfnSetSpecialState(HWD_SET_FOG_COLOR, (fogcolor.s.red*0x10000)+(fogcolor.s.green*0x100)+fogcolor.s.blue);
- HWD.pfnSetSpecialState(HWD_SET_FOG_MODE, 1);
- }
- return surfcolor.rgba;
+ Surface->PolyColor.rgba = final_color.rgba;
+ Surface->FadeColor.rgba = fog_color.rgba;
+ Surface->LightInfo.light_level = lightmix;
}
-
-static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color) // Let's see if this can work
+UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color) // Let's see if this can work
{
RGBA_t realcolor, surfcolor;
INT32 alpha;
+ // You see the problem is that darker light isn't actually as dark as it SHOULD be.
+ light = light - ((255 - light)*24/22);
+
// Don't go out of bounds
if (light < 0)
light = 0;
@@ -514,16 +278,12 @@ static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color) // Let's see if this c
}
// ==========================================================================
-// FLOOR/CEILING GENERATION FROM SUBSECTORS
+// Floor and ceiling generation from subsectors
// ==========================================================================
-#ifdef DOPLANES
-
-// -----------------+
-// HWR_RenderPlane : Render a floor or ceiling convex polygon
-// -----------------+
-static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight,
- FBITFIELD PolyFlags, INT32 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector, UINT8 alpha, boolean fogplane, extracolormap_t *planecolormap)
+// HWR_RenderPlane
+// Render a floor or ceiling convex polygon
+void HWR_RenderPlane(extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, FBITFIELD PolyFlags, INT32 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector, UINT8 alpha, extracolormap_t *planecolormap)
{
polyvertex_t * pv;
float height; //constant y for all points on the convex flat polygon
@@ -545,8 +305,6 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is
static FOutVector *planeVerts = NULL;
static UINT16 numAllocedPlaneVerts = 0;
- (void)sector; ///@TODO remove shitty unused variable
-
// no convex poly were generated for this subsector
if (!xsub->planepoly)
return;
@@ -581,12 +339,6 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is
if (nrPlaneVerts < 3) //not even a triangle ?
return;
- if ((UINT32)nrPlaneVerts > UINT16_MAX) // FIXME: exceeds plVerts size
- {
- CONS_Debug(DBG_RENDER, "polygon size of %d exceeds max value of %d vertices\n", nrPlaneVerts, UINT16_MAX);
- return;
- }
-
// Allocate plane-vertex buffer if we need to
if (!planeVerts || nrPlaneVerts > numAllocedPlaneVerts)
{
@@ -667,10 +419,11 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is
}
}
+
if (angle) // Only needs to be done if there's an altered angle
{
- angle = InvAngle(angle)>>ANGLETOFINESHIFT;
+ angle = (InvAngle(angle)+ANGLE_180)>>ANGLETOFINESHIFT;
// This needs to be done so that it scrolls in a different direction after rotation like software
/*tempxsow = FLOAT_TO_FIXED(scrollx);
@@ -686,26 +439,27 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is
flatyref = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINESINE(angle)) + FixedMul(tempytow, FINECOSINE(angle))));
}
+
for (i = 0; i < nrPlaneVerts; i++,v3d++,pv++)
{
// Hurdler: add scrolling texture on floor/ceiling
- v3d->sow = (float)((pv->x / fflatsize) - flatxref + scrollx);
- v3d->tow = (float)(-(pv->y / fflatsize) + flatyref + scrolly);
+ v3d->s = (float)((pv->x / fflatsize) - flatxref + scrollx);
+ v3d->t = (float)(flatyref - (pv->y / fflatsize) + scrolly);
- //v3d->sow = (float)(pv->x / fflatsize);
- //v3d->tow = (float)(pv->y / fflatsize);
+ //v3d->s = (float)(pv->x / fflatsize);
+ //v3d->t = (float)(pv->y / fflatsize);
// Need to rotate before translate
if (angle) // Only needs to be done if there's an altered angle
{
- tempxsow = FLOAT_TO_FIXED(v3d->sow);
- tempytow = FLOAT_TO_FIXED(v3d->tow);
- v3d->sow = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINECOSINE(angle)) - FixedMul(tempytow, FINESINE(angle))));
- v3d->tow = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINESINE(angle)) + FixedMul(tempytow, FINECOSINE(angle))));
+ tempxsow = FLOAT_TO_FIXED(v3d->s);
+ tempytow = FLOAT_TO_FIXED(v3d->t);
+ v3d->s = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINECOSINE(angle)) - FixedMul(tempytow, FINESINE(angle))));
+ v3d->t = (FIXED_TO_FLOAT(-FixedMul(tempxsow, FINESINE(angle)) - FixedMul(tempytow, FINECOSINE(angle))));
}
- //v3d->sow = (float)(v3d->sow - flatxref + scrollx);
- //v3d->tow = (float)(flatyref - v3d->tow + scrolly);
+ //v3d->s = (float)(v3d->s - flatxref + scrollx);
+ //v3d->t = (float)(flatyref - v3d->t + scrolly);
v3d->x = pv->x;
v3d->y = height;
@@ -720,142 +474,36 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is
#endif
}
- // only useful for flat coloured triangles
- //Surf.FlatColor = 0xff804020;
-
- // use different light tables
- // for horizontal / vertical / diagonal
- // note: try to get the same visual feel as the original
- Surf.FlatColor.s.red = Surf.FlatColor.s.green =
- Surf.FlatColor.s.blue = LightLevelToLum(lightlevel); // Don't take from the frontsector, or the game will crash
-
-#if 0 // no colormap test
- // colormap test
- if (gr_frontsector)
- {
- sector_t *psector = gr_frontsector;
-
-#ifdef ESLOPE
- if (slope)
- fixedheight = P_GetZAt(slope, psector->soundorg.x, psector->soundorg.y);
-#endif
-
- if (psector->ffloors)
- {
- ffloor_t *caster = psector->lightlist[R_GetPlaneLight(psector, fixedheight, false)].caster;
- psector = caster ? §ors[caster->secnum] : psector;
-
- if (caster)
- {
- lightlevel = psector->lightlevel;
- Surf.FlatColor.s.red = Surf.FlatColor.s.green = Surf.FlatColor.s.blue = LightLevelToLum(lightlevel);
- }
- }
- if (psector->extra_colormap)
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel,psector->extra_colormap->rgba,psector->extra_colormap->fadergba, false, true);
- else
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel,NORMALFOG,FADEFOG, false, true);
- }
- else
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel,NORMALFOG,FADEFOG, false, true);
-
-#endif // NOPE
-
if (planecolormap)
- {
- if (fogplane)
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, planecolormap->rgba, planecolormap->fadergba, true, false);
- else
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, planecolormap->rgba, planecolormap->fadergba, false, true);
- }
+ HWR_Lighting(&Surf, lightlevel, planecolormap->rgba, planecolormap->fadergba);
else
- {
- if (fogplane)
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, true, false);
- else
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, true);
- }
+ HWR_NoColormapLighting(&Surf, lightlevel, GL_NORMALFOG, GL_FADEFOG);
if (PolyFlags & (PF_Translucent|PF_Fog))
{
- Surf.FlatColor.s.alpha = (UINT8)alpha;
- PolyFlags |= PF_Modulated|PF_Clip;
+ Surf.PolyColor.s.alpha = (UINT8)alpha;
+ PolyFlags |= PF_Modulated;
}
else
- PolyFlags |= PF_Masked|PF_Modulated|PF_Clip;
+ PolyFlags |= PF_Masked|PF_Modulated;
+
+ if (PolyFlags & PF_Fog)
+ HWD.pfnSetShader(6); // fog shader
+ else if (PolyFlags & PF_Ripple)
+ HWD.pfnSetShader(5); // water shader
+ else
+ HWD.pfnSetShader(1); // floor shader
HWD.pfnDrawPolygon(&Surf, planeVerts, nrPlaneVerts, PolyFlags);
-
-#ifdef ALAM_LIGHTING
- // add here code for dynamic lighting on planes
- HWR_PlaneLighting(planeVerts, nrPlaneVerts);
-#endif
}
-#ifdef POLYSKY
-// this don't draw anything it only update the z-buffer so there isn't problem with
-// wall/things upper that sky (map12)
-static void HWR_RenderSkyPlane(extrasubsector_t *xsub, fixed_t fixedheight)
-{
- polyvertex_t *pv;
- float height; //constant y for all points on the convex flat polygon
- FOutVector *v3d;
- INT32 nrPlaneVerts; //verts original define of convex flat polygon
- INT32 i;
-
- // no convex poly were generated for this subsector
- if (!xsub->planepoly)
- return;
-
- height = FIXED_TO_FLOAT(fixedheight);
-
- pv = xsub->planepoly->pts;
- nrPlaneVerts = xsub->planepoly->numpts;
-
- if (nrPlaneVerts < 3) // not even a triangle?
- return;
-
- if (nrPlaneVerts > MAXPLANEVERTICES) // FIXME: exceeds plVerts size
- {
- CONS_Debug(DBG_RENDER, "polygon size of %d exceeds max value of %d vertices\n", nrPlaneVerts, MAXPLANEVERTICES);
- return;
- }
-
- // transform
- v3d = planeVerts;
- for (i = 0; i < nrPlaneVerts; i++,v3d++,pv++)
- {
- v3d->sow = 0.0f;
- v3d->tow = 0.0f;
- v3d->x = pv->x;
- v3d->y = height;
- v3d->z = pv->y;
- }
-
- HWD.pfnDrawPolygon(NULL, planeVerts, nrPlaneVerts,
- PF_Clip|PF_Invisible|PF_NoTexture|PF_Occlude);
-}
-#endif //polysky
-
-#endif //doplanes
-
-/*
- wallVerts order is :
- 3--2
- | /|
- |/ |
- 0--1
-*/
#ifdef WALLSPLATS
static void HWR_DrawSegsSplats(FSurfaceInfo * pSurf)
{
- FOutVector trVerts[4], *wv;
- wallVert3D wallVerts[4];
- wallVert3D *pwallVerts;
+ FOutVector wallVerts[4];
wallsplat_t *splat;
GLPatch_t *gpatch;
fixed_t i;
- FSurfaceInfo pSurf2;
// seg bbox
fixed_t segbbox[4];
@@ -893,186 +541,72 @@ static void HWR_DrawSegsSplats(FSurfaceInfo * pSurf)
wallVerts[3].s = wallVerts[3].t = wallVerts[2].s = wallVerts[0].t = 0.0f;
wallVerts[1].s = wallVerts[1].t = wallVerts[2].t = wallVerts[0].s = 1.0f;
- // transform
- wv = trVerts;
- pwallVerts = wallVerts;
- for (i = 0; i < 4; i++,wv++,pwallVerts++)
- {
- wv->x = pwallVerts->x;
- wv->z = pwallVerts->z;
- wv->y = pwallVerts->y;
-
- // Kalaron: TOW and SOW needed to be switched
- wv->sow = pwallVerts->t;
- wv->tow = pwallVerts->s;
- }
- M_Memcpy(&pSurf2,pSurf,sizeof (FSurfaceInfo));
switch (splat->flags & SPLATDRAWMODE_MASK)
{
case SPLATDRAWMODE_OPAQUE :
- pSurf2.FlatColor.s.alpha = 0xff;
+ pSurf.PolyColor.s.alpha = 0xff;
i = PF_Translucent;
break;
case SPLATDRAWMODE_TRANS :
- pSurf2.FlatColor.s.alpha = 128;
+ pSurf.PolyColor.s.alpha = 128;
i = PF_Translucent;
break;
case SPLATDRAWMODE_SHADE :
- pSurf2.FlatColor.s.alpha = 0xff;
+ pSurf.PolyColor.s.alpha = 0xff;
i = PF_Substractive;
break;
}
- HWD.pfnDrawPolygon(&pSurf2, trVerts, 4, i|PF_Modulated|PF_Clip|PF_Decal);
+ HWD.pfnSetShader(2); // wall shader
+ HWD.pfnDrawPolygon(&pSurf, wallVerts, 4, i|PF_Modulated|PF_Decal);
}
}
#endif
-// ==========================================================================
-// WALL GENERATION FROM SUBSECTOR SEGS
-// ==========================================================================
-
-
FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf)
{
switch (transtablenum)
{
- case tr_trans10 : pSurf->FlatColor.s.alpha = 0xe6;return PF_Translucent;
- case tr_trans20 : pSurf->FlatColor.s.alpha = 0xcc;return PF_Translucent;
- case tr_trans30 : pSurf->FlatColor.s.alpha = 0xb3;return PF_Translucent;
- case tr_trans40 : pSurf->FlatColor.s.alpha = 0x99;return PF_Translucent;
- case tr_trans50 : pSurf->FlatColor.s.alpha = 0x80;return PF_Translucent;
- case tr_trans60 : pSurf->FlatColor.s.alpha = 0x66;return PF_Translucent;
- case tr_trans70 : pSurf->FlatColor.s.alpha = 0x4c;return PF_Translucent;
- case tr_trans80 : pSurf->FlatColor.s.alpha = 0x33;return PF_Translucent;
- case tr_trans90 : pSurf->FlatColor.s.alpha = 0x19;return PF_Translucent;
+ case tr_trans10 : pSurf->PolyColor.s.alpha = 0xe6;return PF_Translucent;
+ case tr_trans20 : pSurf->PolyColor.s.alpha = 0xcc;return PF_Translucent;
+ case tr_trans30 : pSurf->PolyColor.s.alpha = 0xb3;return PF_Translucent;
+ case tr_trans40 : pSurf->PolyColor.s.alpha = 0x99;return PF_Translucent;
+ case tr_trans50 : pSurf->PolyColor.s.alpha = 0x80;return PF_Translucent;
+ case tr_trans60 : pSurf->PolyColor.s.alpha = 0x66;return PF_Translucent;
+ case tr_trans70 : pSurf->PolyColor.s.alpha = 0x4c;return PF_Translucent;
+ case tr_trans80 : pSurf->PolyColor.s.alpha = 0x33;return PF_Translucent;
+ case tr_trans90 : pSurf->PolyColor.s.alpha = 0x19;return PF_Translucent;
}
return PF_Translucent;
}
-// v1,v2 : the start & end vertices along the original wall segment, that may have been
-// clipped so that only a visible portion of the wall seg is drawn.
-// floorheight, ceilingheight : depend on wall upper/lower/middle, comes from the sectors.
+// ==========================================================================
+// Wall generation from subsector segs
+// ==========================================================================
-static void HWR_AddTransparentWall(wallVert3D *wallVerts, FSurfaceInfo * pSurf, INT32 texnum, FBITFIELD blend, boolean fogwall, INT32 lightlevel, extracolormap_t *wallcolormap);
-
-// -----------------+
-// HWR_ProjectWall :
-// -----------------+
-/*
- wallVerts order is :
- 3--2
- | /|
- |/ |
- 0--1
-*/
-static void HWR_ProjectWall(wallVert3D * wallVerts,
- FSurfaceInfo * pSurf,
- FBITFIELD blendmode, INT32 lightlevel, extracolormap_t *wallcolormap)
+//
+// HWR_ProjectWall
+//
+void HWR_ProjectWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, FBITFIELD blendmode, INT32 lightlevel, extracolormap_t *wallcolormap)
{
- FOutVector trVerts[4];
- FOutVector *wv;
-
- // transform
- wv = trVerts;
- // it sounds really stupid to do this conversion with the new T&L code
- // we should directly put the right information in the right structure
- // wallVerts3D seems ok, doesn't need FOutVector
- // also remove the light copy
-
- // More messy to unwrap, but it's also quicker, uses less memory.
- wv->sow = wallVerts->s;
- wv->tow = wallVerts->t;
- wv->x = wallVerts->x;
- wv->y = wallVerts->y;
- wv->z = wallVerts->z;
- wv++; wallVerts++;
- wv->sow = wallVerts->s;
- wv->tow = wallVerts->t;
- wv->x = wallVerts->x;
- wv->y = wallVerts->y;
- wv->z = wallVerts->z;
- wv++; wallVerts++;
- wv->sow = wallVerts->s;
- wv->tow = wallVerts->t;
- wv->x = wallVerts->x;
- wv->y = wallVerts->y;
- wv->z = wallVerts->z;
- wv++; wallVerts++;
- wv->sow = wallVerts->s;
- wv->tow = wallVerts->t;
- wv->x = wallVerts->x;
- wv->y = wallVerts->y;
- wv->z = wallVerts->z;
-
if (wallcolormap)
- {
- pSurf->FlatColor.rgba = HWR_Lighting(lightlevel, wallcolormap->rgba, wallcolormap->fadergba, false, false);
- }
+ HWR_Lighting(pSurf, lightlevel, wallcolormap->rgba, wallcolormap->fadergba);
else
- {
- pSurf->FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, false);
- }
+ HWR_NoColormapLighting(pSurf, lightlevel, GL_NORMALFOG, GL_FADEFOG);
- HWD.pfnDrawPolygon(pSurf, trVerts, 4, blendmode|PF_Modulated|PF_Occlude|PF_Clip);
+ HWD.pfnSetShader(2); // wall shader
+ HWD.pfnDrawPolygon(pSurf, wallVerts, 4, blendmode|PF_Modulated|PF_Occlude);
#ifdef WALLSPLATS
if (gr_curline->linedef->splats && cv_splats.value)
HWR_DrawSegsSplats(pSurf);
#endif
-#ifdef ALAM_LIGHTING
- //Hurdler: TDOD: do static lighting using gr_curline->lm
- HWR_WallLighting(trVerts);
-
- //Hurdler: for better dynamic light in dark area, we should draw the light first
- // and then the wall all that with the right blending func
- //HWD.pfnDrawPolygon(pSurf, trVerts, 4, PF_Additive|PF_Modulated|PF_Occlude|PF_Clip);
-#endif
}
-// ==========================================================================
-// BSP, CULL, ETC..
-// ==========================================================================
-
-// return the frac from the interception of the clipping line
-// (in fact a clipping plane that has a constant, so can clip with simple 2d)
-// with the wall segment
-//
-#ifndef NEWCLIP
-static float HWR_ClipViewSegment(INT32 x, polyvertex_t *v1, polyvertex_t *v2)
-{
- float num, den;
- float v1x, v1y, v1dx, v1dy, v2dx, v2dy;
- angle_t pclipangle = gr_xtoviewangle[x];
-
- // a segment of a polygon
- v1x = v1->x;
- v1y = v1->y;
- v1dx = (v2->x - v1->x);
- v1dy = (v2->y - v1->y);
-
- // the clipping line
- pclipangle = pclipangle + dup_viewangle; //back to normal angle (non-relative)
- v2dx = FIXED_TO_FLOAT(FINECOSINE(pclipangle>>ANGLETOFINESHIFT));
- v2dy = FIXED_TO_FLOAT(FINESINE(pclipangle>>ANGLETOFINESHIFT));
-
- den = v2dy*v1dx - v2dx*v1dy;
- if (den == 0)
- return -1; // parallel
-
- // calc the frac along the polygon segment,
- //num = (v2x - v1x)*v2dy + (v1y - v2y)*v2dx;
- //num = -v1x * v2dy + v1y * v2dx;
- num = (gr_viewx - v1x)*v2dy + (v1y - gr_viewy)*v2dx;
-
- return num / den;
-}
-#endif
-
//
// HWR_SplitWall
//
-static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, FSurfaceInfo* Surf, INT32 cutflag, ffloor_t *pfloor)
+void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, FSurfaceInfo* Surf, INT32 cutflag, ffloor_t *pfloor)
{
/* SoM: split up and light walls according to the
lightlist. This may also include leaving out parts
@@ -1098,7 +632,7 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum,
INT32 solid, i;
lightlist_t * list = sector->lightlist;
- const UINT8 alpha = Surf->FlatColor.s.alpha;
+ const UINT8 alpha = Surf->PolyColor.s.alpha;
FUINT lightnum = sector->lightlevel;
extracolormap_t *colormap = NULL;
@@ -1119,12 +653,11 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum,
for (i = 0; i < sector->numlights; i++)
{
#ifdef ESLOPE
- if (endtop < endrealbot)
+ if (endtop < endrealbot)
#endif
if (top < realbot)
return;
- // There's a compiler warning here if this comment isn't here because of indentation
if (!(list[i].flags & FF_NOSHADE))
{
if (pfloor && (pfloor->flags & FF_FOG))
@@ -1244,7 +777,7 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum,
if (endbot < endrealbot)
endbot = endrealbot;
#endif
- Surf->FlatColor.s.alpha = alpha;
+ Surf->PolyColor.s.alpha = alpha;
#ifdef ESLOPE
wallVerts[3].t = pegt + ((realtop - top) * pegmul);
@@ -1287,7 +820,7 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum,
if (top <= realbot)
return;
- Surf->FlatColor.s.alpha = alpha;
+ Surf->PolyColor.s.alpha = alpha;
#ifdef ESLOPE
wallVerts[3].t = pegt + ((realtop - top) * pegmul);
@@ -1319,7 +852,7 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum,
// HWR_DrawSkyWalls
// Draw walls into the depth buffer so that anything behind is culled properly
-static void HWR_DrawSkyWall(wallVert3D *wallVerts, FSurfaceInfo *Surf)
+void HWR_DrawSkyWall(FOutVector *wallVerts, FSurfaceInfo *Surf, fixed_t bottom, fixed_t top)
{
HWD.pfnSetTexture(NULL);
// no texture
@@ -1327,26 +860,29 @@ static void HWR_DrawSkyWall(wallVert3D *wallVerts, FSurfaceInfo *Surf)
wallVerts[0].t = wallVerts[1].t = 0;
wallVerts[0].s = wallVerts[3].s = 0;
wallVerts[2].s = wallVerts[1].s = 0;
- HWR_ProjectWall(wallVerts, Surf, PF_Invisible|PF_Clip|PF_NoTexture, 255, NULL);
+
+ if (bottom != 0 || top != 0)
+ {
+ // set top/bottom coords
+ wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(top); // No real way to find the correct height of this
+ wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(bottom); // worldlow/bottom because it needs to cover up the lower thok barrier wall
+ }
+ HWR_ProjectWall(wallVerts, Surf, PF_Invisible|PF_NoTexture, 255, NULL);
// PF_Invisible so it's not drawn into the colour buffer
// PF_NoTexture for no texture
// PF_Occlude is set in HWR_ProjectWall to draw into the depth buffer
}
//
-// HWR_StoreWallRange
+// HWR_ProcessSeg
// A portion or all of a wall segment will be drawn, from startfrac to endfrac,
// where 0 is the start of the segment, 1 the end of the segment
// Anything between means the wall segment has been clipped with solidsegs,
// reducing wall overdraw to a minimum
//
-#ifdef NEWCLIP
-static void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
-#else
-static void HWR_StoreWallRange(double startfrac, double endfrac)
-#endif
+void HWR_ProcessSeg(void) // Sort of like GLWall::Process in GZDoom
{
- wallVert3D wallVerts[4];
+ FOutVector wallVerts[4];
v2d_t vs, ve; // start, end vertices of 2d line (view from above)
fixed_t worldtop, worldbottom;
@@ -1369,11 +905,6 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
extracolormap_t *colormap;
FSurfaceInfo Surf;
-#ifndef NEWCLIP
- if (startfrac > endfrac)
- return;
-#endif
-
gr_sidedef = gr_curline->sidedef;
gr_linedef = gr_curline->linedef;
@@ -1415,35 +946,19 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
wallVerts[0].z = wallVerts[3].z = vs.y;
wallVerts[2].x = wallVerts[1].x = ve.x;
wallVerts[2].z = wallVerts[1].z = ve.y;
- wallVerts[0].w = wallVerts[1].w = wallVerts[2].w = wallVerts[3].w = 1.0f;
+ // x offset the texture
{
- // x offset the texture
fixed_t texturehpeg = gr_sidedef->textureoffset + gr_curline->offset;
-
-#ifndef NEWCLIP
- // clip texture s start/end coords with solidsegs
- if (startfrac > 0.0f && startfrac < 1.0f)
- cliplow = (float)(texturehpeg + (gr_curline->flength*FRACUNIT) * startfrac);
- else
-#endif
- cliplow = (float)texturehpeg;
-
-#ifndef NEWCLIP
- if (endfrac > 0.0f && endfrac < 1.0f)
- cliphigh = (float)(texturehpeg + (gr_curline->flength*FRACUNIT) * endfrac);
- else
-#endif
- cliphigh = (float)(texturehpeg + (gr_curline->flength*FRACUNIT));
+ cliplow = (float)texturehpeg;
+ cliphigh = (float)(texturehpeg + (gr_curline->flength*FRACUNIT));
}
lightnum = gr_frontsector->lightlevel;
colormap = gr_frontsector->extra_colormap;
if (gr_frontsector)
- {
- Surf.FlatColor.s.alpha = 255;
- }
+ Surf.PolyColor.s.alpha = 255;
if (gr_backsector)
{
@@ -1483,7 +998,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
#else
wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(worldhigh);
#endif
- HWR_DrawSkyWall(wallVerts, &Surf);
+ HWR_DrawSkyWall(wallVerts, &Surf, 0, 0);
}
}
else
@@ -1495,7 +1010,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
#else
wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(worldtop);
#endif
- HWR_DrawSkyWall(wallVerts, &Surf);
+ HWR_DrawSkyWall(wallVerts, &Surf, 0, 0);
}
}
else if (gr_backsector->ceilingpic == skyflatnum)
@@ -1507,7 +1022,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
#else
wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(worldtop);
#endif
- HWR_DrawSkyWall(wallVerts, &Surf);
+ HWR_DrawSkyWall(wallVerts, &Surf, 0, 0);
}
@@ -1534,7 +1049,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
wallVerts[3].y = wallVerts[2].y = FIXED_TO_FLOAT(worldlow);
#endif
- HWR_DrawSkyWall(wallVerts, &Surf);
+ HWR_DrawSkyWall(wallVerts, &Surf, 0, 0);
}
}
else
@@ -1547,7 +1062,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
wallVerts[3].y = wallVerts[2].y = FIXED_TO_FLOAT(worldbottom);
#endif
- HWR_DrawSkyWall(wallVerts, &Surf);
+ HWR_DrawSkyWall(wallVerts, &Surf, 0, 0);
}
}
else if ((gr_backsector->floorpic == skyflatnum) && !(gr_sidedef->bottomtexture))
@@ -1560,7 +1075,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
wallVerts[3].y = wallVerts[2].y = FIXED_TO_FLOAT(worldlow);
#endif
- HWR_DrawSkyWall(wallVerts, &Surf);
+ HWR_DrawSkyWall(wallVerts, &Surf, 0, 0);
}
}
@@ -1987,7 +1502,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
{
if (gr_curline->polyseg->translucency >= NUMTRANSMAPS) // wall not drawn
{
- Surf.FlatColor.s.alpha = 0x00; // This shouldn't draw anything regardless of blendmode
+ Surf.PolyColor.s.alpha = 0x00; // This shouldn't draw anything regardless of blendmode
blendmode = PF_Masked;
}
else
@@ -2008,21 +1523,93 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
HWR_AddTransparentWall(wallVerts, &Surf, gr_midtexture, blendmode, false, lightnum, colormap);
else
HWR_ProjectWall(wallVerts, &Surf, blendmode, lightnum, colormap);
+ }
- // If there is a colormap change, remove it.
-/* if (!(Surf.FlatColor.s.red + Surf.FlatColor.s.green + Surf.FlatColor.s.blue == Surf.FlatColor.s.red/3)
+ // Isn't this just the most lovely mess
+ if (!gr_curline->polyseg) // Don't do it for polyobjects
+ {
+ if (gr_frontsector->ceilingpic == skyflatnum || gr_backsector->ceilingpic == skyflatnum)
{
- Surf.FlatColor.s.red = Surf.FlatColor.s.green = Surf.FlatColor.s.blue = 0xff;
- Surf.FlatColor.rgba = 0xffffffff;
- }*/
+ fixed_t depthwallheight;
+
+ if (!gr_sidedef->toptexture || (gr_frontsector->ceilingpic == skyflatnum && gr_backsector->ceilingpic == skyflatnum)) // when both sectors are sky, the top texture isn't drawn
+ depthwallheight = gr_frontsector->ceilingheight < gr_backsector->ceilingheight ? gr_frontsector->ceilingheight : gr_backsector->ceilingheight;
+ else
+ depthwallheight = gr_frontsector->ceilingheight > gr_backsector->ceilingheight ? gr_frontsector->ceilingheight : gr_backsector->ceilingheight;
+
+ if (gr_frontsector->ceilingheight-gr_frontsector->floorheight <= 0) // current sector is a thok barrier
+ {
+ if (gr_backsector->ceilingheight-gr_backsector->floorheight <= 0) // behind sector is also a thok barrier
+ {
+ if (!gr_sidedef->bottomtexture) // Only extend further down if there's no texture
+ HWR_DrawSkyWall(wallVerts, &Surf, worldbottom < worldlow ? worldbottom : worldlow, INT32_MAX);
+ else
+ HWR_DrawSkyWall(wallVerts, &Surf, worldbottom > worldlow ? worldbottom : worldlow, INT32_MAX);
+ }
+ // behind sector is not a thok barrier
+ else if (gr_backsector->ceilingheight <= gr_frontsector->ceilingheight) // behind sector ceiling is lower or equal to current sector
+ HWR_DrawSkyWall(wallVerts, &Surf, depthwallheight, INT32_MAX);
+ // gr_front/backsector heights need to be used here because of the worldtop being set to worldhigh earlier on
+ }
+ else if (gr_backsector->ceilingheight-gr_backsector->floorheight <= 0) // behind sector is a thok barrier, current sector is not
+ {
+ if (gr_backsector->ceilingheight >= gr_frontsector->ceilingheight // thok barrier ceiling height is equal to or greater than current sector ceiling height
+ || gr_backsector->floorheight <= gr_frontsector->floorheight // thok barrier ceiling height is equal to or less than current sector floor height
+ || gr_backsector->ceilingpic != skyflatnum) // thok barrier is not a sky
+ HWR_DrawSkyWall(wallVerts, &Surf, depthwallheight, INT32_MAX);
+ }
+ else // neither sectors are thok barriers
+ {
+ if ((gr_backsector->ceilingheight < gr_frontsector->ceilingheight && !gr_sidedef->toptexture) // no top texture and sector behind is lower
+ || gr_backsector->ceilingpic != skyflatnum) // behind sector is not a sky
+ HWR_DrawSkyWall(wallVerts, &Surf, depthwallheight, INT32_MAX);
+ }
+ }
+ // And now for sky floors!
+ if (gr_frontsector->floorpic == skyflatnum || gr_backsector->floorpic == skyflatnum)
+ {
+ fixed_t depthwallheight;
+
+ if (!gr_sidedef->bottomtexture)
+ depthwallheight = worldbottom > worldlow ? worldbottom : worldlow;
+ else
+ depthwallheight = worldbottom < worldlow ? worldbottom : worldlow;
+
+ if (gr_frontsector->ceilingheight-gr_frontsector->floorheight <= 0) // current sector is a thok barrier
+ {
+ if (gr_backsector->ceilingheight-gr_backsector->floorheight <= 0) // behind sector is also a thok barrier
+ {
+ if (!gr_sidedef->toptexture) // Only extend up if there's no texture
+ HWR_DrawSkyWall(wallVerts, &Surf, INT32_MIN, worldtop > worldhigh ? worldtop : worldhigh);
+ else
+ HWR_DrawSkyWall(wallVerts, &Surf, INT32_MIN, worldtop < worldhigh ? worldtop : worldhigh);
+ }
+ // behind sector is not a thok barrier
+ else if (gr_backsector->floorheight >= gr_frontsector->floorheight) // behind sector floor is greater or equal to current sector
+ HWR_DrawSkyWall(wallVerts, &Surf, INT32_MIN, depthwallheight);
+ }
+ else if (gr_backsector->ceilingheight-gr_backsector->floorheight <= 0) // behind sector is a thok barrier, current sector is not
+ {
+ if (gr_backsector->floorheight <= gr_frontsector->floorheight // thok barrier floor height is equal to or less than current sector floor height
+ || gr_backsector->ceilingheight >= gr_frontsector->ceilingheight // thok barrier floor height is equal to or greater than current sector ceiling height
+ || gr_backsector->floorpic != skyflatnum) // thok barrier is not a sky
+ HWR_DrawSkyWall(wallVerts, &Surf, INT32_MIN, depthwallheight);
+ }
+ else // neither sectors are thok barriers
+ {
+ if (((gr_backsector->floorheight > gr_frontsector->floorheight && !gr_sidedef->bottomtexture) // no bottom texture and sector behind is higher
+ || gr_backsector->floorpic != skyflatnum) // behind sector is not a sky
+ && ABS(gr_backsector->floorheight - gr_frontsector->floorheight) > FRACUNIT*3/2) // don't draw sky walls for VERY thin differences, this makes for horrible looking slopes sometimes!
+ HWR_DrawSkyWall(wallVerts, &Surf, INT32_MIN, depthwallheight);
+ }
+ }
}
}
else
{
// Single sided line... Deal only with the middletexture (if one exists)
gr_midtexture = R_GetTextureNum(gr_sidedef->midtexture);
- if (gr_midtexture
- && gr_linedef->special != 41) // Ignore horizon line for OGL
+ if (gr_midtexture && gr_linedef->special != 41) // (Ignore horizon line for OGL)
{
{
fixed_t texturevpeg;
@@ -2072,9 +1659,10 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
wallVerts[2].y = wallVerts[3].y = FIXED_TO_FLOAT(worldtop);
wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(worldbottom);
#endif
- // I don't think that solid walls can use translucent linedef types...
+
if (gr_frontsector->numlights)
HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_CUTLEVEL, NULL);
+ // I don't think that solid walls can use translucent linedef types...
else
{
if (grTex->mipmap.flags & TF_TRANSPARENT)
@@ -2098,7 +1686,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
#endif
// When there's no midtexture, draw a skywall to prevent rendering behind it
- HWR_DrawSkyWall(wallVerts, &Surf);
+ HWR_DrawSkyWall(wallVerts, &Surf, 0, 0);
}
@@ -2115,7 +1703,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
#else
wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(worldtop);
#endif
- HWR_DrawSkyWall(wallVerts, &Surf);
+ HWR_DrawSkyWall(wallVerts, &Surf, 0, 0);
}
if (gr_frontsector->floorpic == skyflatnum)
{
@@ -2127,14 +1715,13 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
#endif
wallVerts[0].y = wallVerts[1].y = FIXED_TO_FLOAT(INT32_MIN);
- HWR_DrawSkyWall(wallVerts, &Surf);
+ HWR_DrawSkyWall(wallVerts, &Surf, 0, 0);
}
}
}
//Hurdler: 3d-floors test
-#ifdef R_FAKEFLOORS
if (gr_frontsector && gr_backsector && gr_frontsector->tag != gr_backsector->tag && (gr_backsector->ffloors || gr_frontsector->ffloors))
{
ffloor_t * rover;
@@ -2278,14 +1865,9 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
colormap = rover->master->frontsector->extra_colormap;
if (rover->master->frontsector->extra_colormap)
- {
-
- Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba);
- }
+ Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba);
else
- {
- Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG);
- }
+ Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,GL_NORMALFOG);
if (gr_frontsector->numlights)
HWR_SplitWall(gr_frontsector, wallVerts, 0, &Surf, rover->flags, rover);
@@ -2299,7 +1881,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256)
{
blendmode = PF_Translucent;
- Surf.FlatColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1;
+ Surf.PolyColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1;
}
if (gr_frontsector->numlights)
@@ -2398,13 +1980,9 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
colormap = rover->master->frontsector->extra_colormap;
if (rover->master->frontsector->extra_colormap)
- {
- Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba);
- }
+ Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba);
else
- {
- Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG);
- }
+ Surf.PolyColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,GL_NORMALFOG);
if (gr_backsector->numlights)
HWR_SplitWall(gr_backsector, wallVerts, 0, &Surf, rover->flags, rover);
@@ -2418,7 +1996,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256)
{
blendmode = PF_Translucent;
- Surf.FlatColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1;
+ Surf.PolyColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1;
}
if (gr_backsector->numlights)
@@ -2434,16 +2012,15 @@ static void HWR_StoreWallRange(double startfrac, double endfrac)
}
}
}
-#endif
//Hurdler: end of 3d-floors test
}
// From PrBoom:
//
-// e6y: Check whether the player can look beyond this line
+// e6y: Check whether the player can look beyond this line, rturns true if we can't
//
-#ifdef NEWCLIP
-static boolean checkforemptylines = true;
+
+boolean checkforemptylines = true;
// Don't modify anything here, just check
// Kalaron: Modified for sloped linedefs
static boolean CheckClip(seg_t * seg, sector_t * afrontsector, sector_t * abacksector)
@@ -2483,34 +2060,45 @@ static boolean CheckClip(seg_t * seg, sector_t * afrontsector, sector_t * abacks
backc1 = backc2 = abacksector->ceilingheight;
}
- if (viewsector != abacksector && viewsector != afrontsector)
+
+ // now check for closed sectors!
+
+ // here we're talking about a CEILING lower than a floor. ...yeah we don't even need to bother.
+ if (backc1 <= frontf1 && backc2 <= frontf2)
{
- boolean mydoorclosed = false; // My door? Closed!? (doorclosed is actually otherwise unused in openGL)
+ checkforemptylines = false;
+ return true;
+ }
- // If the sector behind the line blocks all kinds of view past it
- // (back ceiling is lower than close floor, or back floor is higher than close ceiling)
- if ((backc1 <= frontf1 && backc2 <= frontf2)
- || (backf1 >= frontc1 && backf2 >= frontc2))
- {
- checkforemptylines = false;
- return true;
- }
+ // here we're talking about floors higher than ceilings, don't even bother either.
+ if (backf1 >= frontc1 && backf2 >= frontc2)
+ {
+ checkforemptylines = false;
+ return true;
+ }
- // The door is closed if:
- // backsector is 0 height or less and
- // back ceiling is higher than close ceiling or we need to render a top texture and
- // back floor is lower than close floor or we need to render a bottom texture and
- // neither front or back sectors are using the sky ceiling
- mydoorclosed = (backc1 <= backf1 && backc2 <= backf2
- && ((backc1 >= frontc1 && backc2 >= frontc2) || seg->sidedef->toptexture)
- && ((backf1 <= frontf1 && backf2 >= frontf2) || seg->sidedef->bottomtexture)
- && (abacksector->ceilingpic != skyflatnum || afrontsector->ceilingpic != skyflatnum));
+ // Lat: Ok, here's what we need to do, we want to draw thok barriers. Let's define what a thok barrier is;
+ // -Must have ceilheight <= floorheight
+ // -ceilpic must be skyflatnum
+ // -an adjacant sector needs to have a ceilingheight or a floor height different than the one we have, otherwise, it's just a huge ass wall, we shouldn't render past it.
+ // -said adjacant sector cannot also be a thok barrier, because that's also dumb and we could render far more than we need to as a result :V
- if (mydoorclosed)
- {
- checkforemptylines = false;
- return true;
- }
+ if (backc1 <= backf1 && backc2 <= backf2)
+ {
+ checkforemptylines = false;
+
+ // before we do anything, if both sectors are thok barriers, GET ME OUT OF HERE!
+ if (frontc1 <= backc1 && frontc2 <= frontc2)
+ return true; // STOP RENDERING.
+
+ // draw floors at the top of thok barriers:
+ if (backc1 < frontc1 || backc2 < frontc2)
+ return false;
+
+ if (backf1 > frontf1 || backf2 > frontf2)
+ return false;
+
+ return true;
}
// Window.
@@ -2526,306 +2114,12 @@ static boolean CheckClip(seg_t * seg, sector_t * afrontsector, sector_t * abacks
// stays true
return false;
}
-#else
-//Hurdler: just like in r_bsp.c
-#if 1
-#define MAXSEGS MAXVIDWIDTH/2+1
-#else
-//Alam_GBC: Or not (may cause overflow)
-#define MAXSEGS 128
-#endif
-// hw_newend is one past the last valid seg
-static cliprange_t * hw_newend;
-static cliprange_t gr_solidsegs[MAXSEGS];
-
-
-static void printsolidsegs(void)
-{
- cliprange_t * start;
- if (!hw_newend || cv_grbeta.value != 2)
- return;
- for (start = gr_solidsegs;start != hw_newend;start++)
- {
- CONS_Debug(DBG_RENDER, "%d-%d|",start->first,start->last);
- }
- CONS_Debug(DBG_RENDER, "\n\n");
-}
-
-//
-//
-//
-static void HWR_ClipSolidWallSegment(INT32 first, INT32 last)
-{
- cliprange_t *next, *start;
- float lowfrac, highfrac;
- boolean poorhack = false;
-
- // Find the first range that touches the range
- // (adjacent pixels are touching).
- start = gr_solidsegs;
- while (start->last < first-1)
- start++;
-
- if (first < start->first)
- {
- if (last < start->first-1)
- {
- // Post is entirely visible (above start),
- // so insert a new clippost.
- HWR_StoreWallRange(first, last);
-
- next = hw_newend;
- hw_newend++;
-
- while (next != start)
- {
- *next = *(next-1);
- next--;
- }
-
- next->first = first;
- next->last = last;
- printsolidsegs();
- return;
- }
-
- // There is a fragment above *start.
- if (!cv_grclipwalls.value)
- {
- if (!poorhack) HWR_StoreWallRange(first, last);
- poorhack = true;
- }
- else
- {
- highfrac = HWR_ClipViewSegment(start->first+1, (polyvertex_t *)gr_curline->pv1, (polyvertex_t *)gr_curline->pv2);
- HWR_StoreWallRange(0, highfrac);
- }
- // Now adjust the clip size.
- start->first = first;
- }
-
- // Bottom contained in start?
- if (last <= start->last)
- {
- printsolidsegs();
- return;
- }
- next = start;
- while (last >= (next+1)->first-1)
- {
- // There is a fragment between two posts.
- if (!cv_grclipwalls.value)
- {
- if (!poorhack) HWR_StoreWallRange(first,last);
- poorhack = true;
- }
- else
- {
- lowfrac = HWR_ClipViewSegment(next->last-1, (polyvertex_t *)gr_curline->pv1, (polyvertex_t *)gr_curline->pv2);
- highfrac = HWR_ClipViewSegment((next+1)->first+1, (polyvertex_t *)gr_curline->pv1, (polyvertex_t *)gr_curline->pv2);
- HWR_StoreWallRange(lowfrac, highfrac);
- }
- next++;
-
- if (last <= next->last)
- {
- // Bottom is contained in next.
- // Adjust the clip size.
- start->last = next->last;
- goto crunch;
- }
- }
-
- if (first == next->first+1) // 1 line texture
- {
- if (!cv_grclipwalls.value)
- {
- if (!poorhack) HWR_StoreWallRange(first,last);
- poorhack = true;
- }
- else
- HWR_StoreWallRange(0, 1);
- }
- else
- {
- // There is a fragment after *next.
- if (!cv_grclipwalls.value)
- {
- if (!poorhack) HWR_StoreWallRange(first,last);
- poorhack = true;
- }
- else
- {
- lowfrac = HWR_ClipViewSegment(next->last-1, (polyvertex_t *)gr_curline->pv1, (polyvertex_t *)gr_curline->pv2);
- HWR_StoreWallRange(lowfrac, 1);
- }
- }
-
- // Adjust the clip size.
- start->last = last;
-
- // Remove start+1 to next from the clip list,
- // because start now covers their area.
-crunch:
- if (next == start)
- {
- printsolidsegs();
- // Post just extended past the bottom of one post.
- return;
- }
-
-
- while (next++ != hw_newend)
- {
- // Remove a post.
- *++start = *next;
- }
-
- hw_newend = start;
- printsolidsegs();
-}
-
-//
-// handle LineDefs with upper and lower texture (windows)
-//
-static void HWR_ClipPassWallSegment(INT32 first, INT32 last)
-{
- cliprange_t *start;
- float lowfrac, highfrac;
- //to allow noclipwalls but still solidseg reject of non-visible walls
- boolean poorhack = false;
-
- // Find the first range that touches the range
- // (adjacent pixels are touching).
- start = gr_solidsegs;
- while (start->last < first - 1)
- start++;
-
- if (first < start->first)
- {
- if (last < start->first-1)
- {
- // Post is entirely visible (above start).
- HWR_StoreWallRange(0, 1);
- return;
- }
-
- // There is a fragment above *start.
- if (!cv_grclipwalls.value)
- { //20/08/99: Changed by Hurdler (taken from faB's code)
- if (!poorhack) HWR_StoreWallRange(0, 1);
- poorhack = true;
- }
- else
- {
- highfrac = HWR_ClipViewSegment(min(start->first + 1,
- start->last), (polyvertex_t *)gr_curline->pv1,
- (polyvertex_t *)gr_curline->pv2);
- HWR_StoreWallRange(0, highfrac);
- }
- }
-
- // Bottom contained in start?
- if (last <= start->last)
- return;
-
- while (last >= (start+1)->first-1)
- {
- // There is a fragment between two posts.
- if (!cv_grclipwalls.value)
- {
- if (!poorhack) HWR_StoreWallRange(0, 1);
- poorhack = true;
- }
- else
- {
- lowfrac = HWR_ClipViewSegment(max(start->last-1,start->first), (polyvertex_t *)gr_curline->pv1, (polyvertex_t *)gr_curline->pv2);
- highfrac = HWR_ClipViewSegment(min((start+1)->first+1,(start+1)->last), (polyvertex_t *)gr_curline->pv1, (polyvertex_t *)gr_curline->pv2);
- HWR_StoreWallRange(lowfrac, highfrac);
- }
- start++;
-
- if (last <= start->last)
- return;
- }
-
- if (first == start->first+1) // 1 line texture
- {
- if (!cv_grclipwalls.value)
- {
- if (!poorhack) HWR_StoreWallRange(0, 1);
- poorhack = true;
- }
- else
- HWR_StoreWallRange(0, 1);
- }
- else
- {
- // There is a fragment after *next.
- if (!cv_grclipwalls.value)
- {
- if (!poorhack) HWR_StoreWallRange(0,1);
- poorhack = true;
- }
- else
- {
- lowfrac = HWR_ClipViewSegment(max(start->last - 1,
- start->first), (polyvertex_t *)gr_curline->pv1,
- (polyvertex_t *)gr_curline->pv2);
- HWR_StoreWallRange(lowfrac, 1);
- }
- }
-}
-
-// --------------------------------------------------------------------------
-// HWR_ClipToSolidSegs check if it is hide by wall (solidsegs)
-// --------------------------------------------------------------------------
-static boolean HWR_ClipToSolidSegs(INT32 first, INT32 last)
-{
- cliprange_t * start;
-
- // Find the first range that touches the range
- // (adjacent pixels are touching).
- start = gr_solidsegs;
- while (start->last < first-1)
- start++;
-
- if (first < start->first)
- return true;
-
- // Bottom contained in start?
- if (last <= start->last)
- return false;
-
- return true;
-}
-
-//
-// HWR_ClearClipSegs
-//
-static void HWR_ClearClipSegs(void)
-{
- gr_solidsegs[0].first = -0x7fffffff;
- gr_solidsegs[0].last = -1;
- gr_solidsegs[1].first = vid.width; //viewwidth;
- gr_solidsegs[1].last = 0x7fffffff;
- hw_newend = gr_solidsegs+2;
-}
-#endif // NEWCLIP
-
-// -----------------+
-// HWR_AddLine : Clips the given segment and adds any visible pieces to the line list.
-// Notes : gr_cursectorlight is set to the current subsector -> sector -> light value
-// : (it may be mixed with the wall's own flat colour in the future ...)
-// -----------------+
-static void HWR_AddLine(seg_t * line)
+// HWR_AddLine
+// Clips the given segment and adds any visible pieces to the line list.
+void HWR_AddLine(seg_t *line)
{
angle_t angle1, angle2;
-#ifndef NEWCLIP
- INT32 x1, x2;
- angle_t span, tspan;
-#endif
// SoM: Backsector needs to be run through R_FakeFlat
static sector_t tempsec;
@@ -2844,112 +2138,25 @@ static void HWR_AddLine(seg_t * line)
v2y = FLOAT_TO_FIXED(((polyvertex_t *)gr_curline->pv2)->y);
// OPTIMIZE: quickly reject orthogonal back sides.
- angle1 = R_PointToAngle(v1x, v1y);
- angle2 = R_PointToAngle(v2x, v2y);
+ angle1 = R_PointToAngleEx(viewx, viewy, v1x, v1y);
+ angle2 = R_PointToAngleEx(viewx, viewy, v2x, v2y);
-#ifdef NEWCLIP
// PrBoom: Back side, i.e. backface culling - read: endAngle >= startAngle!
if (angle2 - angle1 < ANGLE_180)
return;
// PrBoom: use REAL clipping math YAYYYYYYY!!!
-
if (!gld_clipper_SafeCheckRange(angle2, angle1))
- {
return;
- }
checkforemptylines = true;
-#else
- // Clip to view edges.
- span = angle1 - angle2;
-
- // backface culling : span is < ANGLE_180 if ang1 > ang2 : the seg is facing
- if (span >= ANGLE_180)
- return;
-
- // Global angle needed by segcalc.
- //rw_angle1 = angle1;
- angle1 -= dup_viewangle;
- angle2 -= dup_viewangle;
-
- tspan = angle1 + gr_clipangle;
- if (tspan > 2*gr_clipangle)
- {
- tspan -= 2*gr_clipangle;
-
- // Totally off the left edge?
- if (tspan >= span)
- return;
-
- angle1 = gr_clipangle;
- }
- tspan = gr_clipangle - angle2;
- if (tspan > 2*gr_clipangle)
- {
- tspan -= 2*gr_clipangle;
-
- // Totally off the left edge?
- if (tspan >= span)
- return;
-
- angle2 = (angle_t)-(signed)gr_clipangle;
- }
-
-#if 0
- {
- float fx1,fx2,fy1,fy2;
- //BP: test with a better projection than viewangletox[R_PointToAngle(angle)]
- // do not enable this at release 4 mul and 2 div
- fx1 = ((polyvertex_t *)(line->pv1))->x-gr_viewx;
- fy1 = ((polyvertex_t *)(line->pv1))->y-gr_viewy;
- fy2 = (fx1 * gr_viewcos + fy1 * gr_viewsin);
- if (fy2 < 0)
- // the point is back
- fx1 = 0;
- else
- fx1 = gr_windowcenterx + (fx1 * gr_viewsin - fy1 * gr_viewcos) * gr_centerx / fy2;
-
- fx2 = ((polyvertex_t *)(line->pv2))->x-gr_viewx;
- fy2 = ((polyvertex_t *)(line->pv2))->y-gr_viewy;
- fy1 = (fx2 * gr_viewcos + fy2 * gr_viewsin);
- if (fy1 < 0)
- // the point is back
- fx2 = vid.width;
- else
- fx2 = gr_windowcenterx + (fx2 * gr_viewsin - fy2 * gr_viewcos) * gr_centerx / fy1;
-
- x1 = fx1+0.5f;
- x2 = fx2+0.5f;
- }
-#else
- // The seg is in the view range,
- // but not necessarily visible.
- angle1 = (angle1+ANGLE_90)>>ANGLETOFINESHIFT;
- angle2 = (angle2+ANGLE_90)>>ANGLETOFINESHIFT;
-
- x1 = gr_viewangletox[angle1];
- x2 = gr_viewangletox[angle2];
-#endif
- // Does not cross a pixel?
-// if (x1 == x2)
-/* {
- // BP: HERE IS THE MAIN PROBLEM !
- //CONS_Debug(DBG_RENDER, "tineline\n");
- return;
- }
-*/
-#endif
gr_backsector = line->backsector;
-#ifdef NEWCLIP
if (!line->backsector)
- {
gld_clipper_SafeAddClipRange(angle2, angle1);
- }
- else
- {
+ else
+ {
gr_backsector = R_FakeFlat(gr_backsector, &tempsec, NULL, NULL, true);
if (CheckClip(line, gr_frontsector, gr_backsector))
{
@@ -2966,98 +2173,6 @@ static void HWR_AddLine(seg_t * line)
HWR_ProcessSeg(); // Doesn't need arguments because they're defined globally :D
return;
-#else
- // Single sided line?
- if (!gr_backsector)
- goto clipsolid;
-
- gr_backsector = R_FakeFlat(gr_backsector, &tempsec, NULL, NULL, true);
-
-#ifdef ESLOPE
- if (gr_frontsector->f_slope || gr_frontsector->c_slope || gr_backsector->f_slope || gr_backsector->c_slope)
- {
- fixed_t frontf1,frontf2, frontc1, frontc2; // front floor/ceiling ends
- fixed_t backf1, backf2, backc1, backc2; // back floor ceiling ends
-
-#define SLOPEPARAMS(slope, end1, end2, normalheight) \
- if (slope) { \
- end1 = P_GetZAt(slope, v1x, v1y); \
- end2 = P_GetZAt(slope, v2x, v2y); \
- } else \
- end1 = end2 = normalheight;
-
- SLOPEPARAMS(gr_frontsector->f_slope, frontf1, frontf2, gr_frontsector->floorheight)
- SLOPEPARAMS(gr_frontsector->c_slope, frontc1, frontc2, gr_frontsector->ceilingheight)
- SLOPEPARAMS( gr_backsector->f_slope, backf1, backf2, gr_backsector->floorheight)
- SLOPEPARAMS( gr_backsector->c_slope, backc1, backc2, gr_backsector->ceilingheight)
-#undef SLOPEPARAMS
-
- if (viewsector != gr_backsector && viewsector != gr_frontsector)
- {
- // Closed door.
- if ((backc1 <= frontf1 && backc2 <= frontf2)
- || (backf1 >= frontc1 && backf2 >= frontc2))
- {
- goto clipsolid;
- }
- }
-
- // Check for automap fix.
- if (backc1 <= backf1 && backc2 <= backf2
- && ((backc1 >= frontc1 && backc2 >= frontc2) || gr_curline->sidedef->toptexture)
- && ((backf1 <= frontf1 && backf2 >= frontf2) || gr_curline->sidedef->bottomtexture)
- && (gr_backsector->ceilingpic != skyflatnum || gr_frontsector->ceilingpic != skyflatnum))
- goto clipsolid;
-
- // Window.
- if (backc1 != frontc1 || backc2 != frontc2
- || backf1 != frontf1 || backf2 != frontf2)
- {
- goto clippass;
- }
- }
- else
-#endif
- {
- if (viewsector != gr_backsector && viewsector != gr_frontsector)
- {
- // Closed door.
- if (gr_backsector->ceilingheight <= gr_frontsector->floorheight ||
- gr_backsector->floorheight >= gr_frontsector->ceilingheight)
- goto clipsolid;
- }
-
- // Check for automap fix.
- if (gr_backsector->ceilingheight <= gr_backsector->floorheight
- && ((gr_backsector->ceilingheight >= gr_frontsector->ceilingheight) || gr_curline->sidedef->toptexture)
- && ((gr_backsector->floorheight <= gr_backsector->floorheight) || gr_curline->sidedef->bottomtexture)
- && (gr_backsector->ceilingpic != skyflatnum || gr_frontsector->ceilingpic != skyflatnum))
- goto clipsolid;
-
- // Window.
- if (gr_backsector->ceilingheight != gr_frontsector->ceilingheight ||
- gr_backsector->floorheight != gr_frontsector->floorheight)
- goto clippass;
- }
-
- // Reject empty lines used for triggers and special events.
- // Identical floor and ceiling on both sides,
- // identical light levels on both sides,
- // and no middle texture.
- if (R_IsEmptyLine(gr_curline, gr_frontsector, gr_backsector))
- return;
-
-clippass:
- if (x1 == x2)
- { x2++;x1 -= 2; }
- HWR_ClipPassWallSegment(x1, x2-1);
- return;
-
-clipsolid:
- if (x1 == x2)
- goto clippass;
- HWR_ClipSolidWallSegment(x1, x2-1);
-#endif
}
// HWR_CheckBBox
@@ -3067,28 +2182,24 @@ clipsolid:
//
// modified to use local variables
-static boolean HWR_CheckBBox(fixed_t *bspcoord)
+boolean HWR_CheckBBox(fixed_t *bspcoord)
{
INT32 boxpos;
fixed_t px1, py1, px2, py2;
angle_t angle1, angle2;
-#ifndef NEWCLIP
- INT32 sx1, sx2;
- angle_t span, tspan;
-#endif
// Find the corners of the box
// that define the edges from current viewpoint.
- if (dup_viewx <= bspcoord[BOXLEFT])
+ if (viewx <= bspcoord[BOXLEFT])
boxpos = 0;
- else if (dup_viewx < bspcoord[BOXRIGHT])
+ else if (viewx < bspcoord[BOXRIGHT])
boxpos = 1;
else
boxpos = 2;
- if (dup_viewy >= bspcoord[BOXTOP])
+ if (viewy >= bspcoord[BOXTOP])
boxpos |= 0;
- else if (dup_viewy > bspcoord[BOXBOTTOM])
+ else if (viewy > bspcoord[BOXBOTTOM])
boxpos |= 1<<2;
else
boxpos |= 2<<2;
@@ -3101,59 +2212,9 @@ static boolean HWR_CheckBBox(fixed_t *bspcoord)
px2 = bspcoord[checkcoord[boxpos][2]];
py2 = bspcoord[checkcoord[boxpos][3]];
-#ifdef NEWCLIP
- angle1 = R_PointToAngle(px1, py1);
- angle2 = R_PointToAngle(px2, py2);
+ angle1 = R_PointToAngleEx(viewx, viewy, px1, py1);
+ angle2 = R_PointToAngleEx(viewx, viewy, px2, py2);
return gld_clipper_SafeCheckRange(angle2, angle1);
-#else
- // check clip list for an open space
- angle1 = R_PointToAngle2(dup_viewx>>1, dup_viewy>>1, px1>>1, py1>>1) - dup_viewangle;
- angle2 = R_PointToAngle2(dup_viewx>>1, dup_viewy>>1, px2>>1, py2>>1) - dup_viewangle;
-
- span = angle1 - angle2;
-
- // Sitting on a line?
- if (span >= ANGLE_180)
- return true;
-
- tspan = angle1 + gr_clipangle;
-
- if (tspan > 2*gr_clipangle)
- {
- tspan -= 2*gr_clipangle;
-
- // Totally off the left edge?
- if (tspan >= span)
- return false;
-
- angle1 = gr_clipangle;
- }
- tspan = gr_clipangle - angle2;
- if (tspan > 2*gr_clipangle)
- {
- tspan -= 2*gr_clipangle;
-
- // Totally off the left edge?
- if (tspan >= span)
- return false;
-
- angle2 = (angle_t)-(signed)gr_clipangle;
- }
-
- // Find the first clippost
- // that touches the source post
- // (adjacent pixels are touching).
- angle1 = (angle1+ANGLE_90)>>ANGLETOFINESHIFT;
- angle2 = (angle2+ANGLE_90)>>ANGLETOFINESHIFT;
- sx1 = gr_viewangletox[angle1];
- sx2 = gr_viewangletox[angle2];
-
- // Does not cross a pixel.
- if (sx1 == sx2)
- return false;
-
- return HWR_ClipToSolidSegs(sx1, sx2 - 1);
-#endif
}
#ifdef POLYOBJECTS
@@ -3165,7 +2226,7 @@ static boolean HWR_CheckBBox(fixed_t *bspcoord)
// Adds all segs in all polyobjects in the given subsector.
// Modified for hardware rendering.
//
-static inline void HWR_AddPolyObjectSegs(void)
+void HWR_AddPolyObjectSegs(void)
{
size_t i, j;
seg_t *gr_fakeline = Z_Calloc(sizeof(seg_t), PU_STATIC, NULL);
@@ -3201,9 +2262,7 @@ static inline void HWR_AddPolyObjectSegs(void)
}
#ifdef POLYOBJECTS_PLANES
-static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling, fixed_t fixedheight,
- FBITFIELD blendmode, UINT8 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector,
- UINT8 alpha, extracolormap_t *planecolormap)
+void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling, fixed_t fixedheight, FBITFIELD blendmode, UINT8 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector, UINT8 alpha, extracolormap_t *planecolormap)
{
float height; //constant y for all points on the convex flat polygon
FOutVector *v3d;
@@ -3333,16 +2392,16 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling,
for (i = 0; i < (INT32)nrPlaneVerts; i++,v3d++)
{
// Hurdler: add scrolling texture on floor/ceiling
- v3d->sow = (float)((FIXED_TO_FLOAT(polysector->origVerts[i].x) / fflatsize) - flatxref + scrollx); // Go from the polysector's original vertex locations
- v3d->tow = (float)(flatyref - (FIXED_TO_FLOAT(polysector->origVerts[i].y) / fflatsize) + scrolly); // Means the flat is offset based on the original vertex locations
+ v3d->s = (float)((FIXED_TO_FLOAT(polysector->origVerts[i].x) / fflatsize) - flatxref + scrollx); // Go from the polysector's original vertex locations
+ v3d->t = (float)(flatyref - (FIXED_TO_FLOAT(polysector->origVerts[i].y) / fflatsize) + scrolly); // Means the flat is offset based on the original vertex locations
// Need to rotate before translate
if (angle) // Only needs to be done if there's an altered angle
{
- tempxsow = FLOAT_TO_FIXED(v3d->sow);
- tempytow = FLOAT_TO_FIXED(v3d->tow);
- v3d->sow = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINECOSINE(angle)) - FixedMul(tempytow, FINESINE(angle))));
- v3d->tow = (FIXED_TO_FLOAT(-FixedMul(tempxsow, FINESINE(angle)) - FixedMul(tempytow, FINECOSINE(angle))));
+ tempxsow = FLOAT_TO_FIXED(v3d->s);
+ tempytow = FLOAT_TO_FIXED(v3d->t);
+ v3d->s = (FIXED_TO_FLOAT(FixedMul(tempxsow, FINECOSINE(angle)) - FixedMul(tempytow, FINESINE(angle))));
+ v3d->t = (FIXED_TO_FLOAT(-FixedMul(tempxsow, FINESINE(angle)) - FixedMul(tempytow, FINECOSINE(angle))));
}
v3d->x = FIXED_TO_FLOAT(polysector->vertices[i]->x);
@@ -3351,22 +2410,23 @@ static void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling,
}
if (planecolormap)
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, planecolormap->rgba, planecolormap->fadergba, false, true);
+ HWR_Lighting(&Surf, lightlevel, planecolormap->rgba, planecolormap->fadergba);
else
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, true);
+ HWR_NoColormapLighting(&Surf, lightlevel, GL_NORMALFOG, GL_FADEFOG);
if (blendmode & PF_Translucent)
{
- Surf.FlatColor.s.alpha = (UINT8)alpha;
- blendmode |= PF_Modulated|PF_Occlude|PF_Clip;
+ Surf.PolyColor.s.alpha = (UINT8)alpha;
+ blendmode |= PF_Modulated|PF_Occlude;
}
else
- blendmode |= PF_Masked|PF_Modulated|PF_Clip;
+ blendmode |= PF_Masked|PF_Modulated;
+ HWD.pfnSetShader(1); // floor shader
HWD.pfnDrawPolygon(&Surf, planeVerts, nrPlaneVerts, blendmode);
}
-static void HWR_AddPolyObjectPlanes(void)
+void HWR_AddPolyObjectPlanes(void)
{
size_t i;
sector_t *polyobjsector;
@@ -3393,11 +2453,11 @@ static void HWR_AddPolyObjectPlanes(void)
FSurfaceInfo Surf;
FBITFIELD blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf);
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->floorpic].lumpnum, po_ptrs[i], false, polyobjsector->floorheight,
- polyobjsector->lightlevel, Surf.FlatColor.s.alpha, polyobjsector, blendmode, NULL);
+ polyobjsector->lightlevel, Surf.PolyColor.s.alpha, polyobjsector, blendmode, NULL);
}
else
{
- HWR_GetFlat(levelflats[polyobjsector->floorpic].lumpnum);
+ HWR_GetFlat(levelflats[polyobjsector->floorpic].lumpnum, R_NoEncore(polyobjsector, false));
HWR_RenderPolyObjectPlane(po_ptrs[i], false, polyobjsector->floorheight, PF_Occlude,
polyobjsector->lightlevel, levelflats[polyobjsector->floorpic].lumpnum,
polyobjsector, 255, NULL);
@@ -3415,11 +2475,11 @@ static void HWR_AddPolyObjectPlanes(void)
memset(&Surf, 0x00, sizeof(Surf));
blendmode = HWR_TranstableToAlpha(po_ptrs[i]->translucency, &Surf);
HWR_AddTransparentPolyobjectFloor(levelflats[polyobjsector->ceilingpic].lumpnum, po_ptrs[i], true, polyobjsector->ceilingheight,
- polyobjsector->lightlevel, Surf.FlatColor.s.alpha, polyobjsector, blendmode, NULL);
+ polyobjsector->lightlevel, Surf.PolyColor.s.alpha, polyobjsector, blendmode, NULL);
}
else
{
- HWR_GetFlat(levelflats[polyobjsector->ceilingpic].lumpnum);
+ HWR_GetFlat(levelflats[polyobjsector->ceilingpic].lumpnum, R_NoEncore(polyobjsector, true));
HWR_RenderPolyObjectPlane(po_ptrs[i], true, polyobjsector->ceilingheight, PF_Occlude,
polyobjsector->lightlevel, levelflats[polyobjsector->floorpic].lumpnum,
polyobjsector, 255, NULL);
@@ -3434,9 +2494,8 @@ static void HWR_AddPolyObjectPlanes(void)
// HWR_Subsector : Determine floor/ceiling planes.
// : Add sprites of things in sector.
// : Draw one or more line segments.
-// Notes : Sets gr_cursectorlight to the light of the parent sector, to modulate wall textures
// -----------------+
-static void HWR_Subsector(size_t num)
+void HWR_Subsector(size_t num)
{
INT16 count;
seg_t *line;
@@ -3454,11 +2513,6 @@ static void HWR_Subsector(size_t num)
if (num >= addsubsector)
I_Error("HWR_Subsector: ss %s with numss = %s, addss = %s\n",
sizeu1(num), sizeu2(numsubsectors), sizeu3(addsubsector));
-
- /*if (num >= numsubsectors)
- I_Error("HWR_Subsector: ss %i with numss = %i",
- num,
- numsubsectors);*/
#endif
if (num < numsubsectors)
@@ -3488,16 +2542,6 @@ static void HWR_Subsector(size_t num)
floorcolormap = ceilingcolormap = gr_frontsector->extra_colormap;
- // ------------------------------------------------------------------------
- // sector lighting, DISABLED because it's done in HWR_StoreWallRange
- // ------------------------------------------------------------------------
- /// \todo store a RGBA instead of just intensity, allow coloured sector lighting
- //light = (FUBYTE)(sub->sector->lightlevel & 0xFF) / 255.0f;
- //gr_cursectorlight.red = light;
- //gr_cursectorlight.green = light;
- //gr_cursectorlight.blue = light;
- //gr_cursectorlight.alpha = light;
-
// ----- for special tricks with HW renderer -----
if (gr_frontsector->pseudoSector)
{
@@ -3564,59 +2608,39 @@ static void HWR_Subsector(size_t num)
sub->sector->extra_colormap = gr_frontsector->extra_colormap;
// render floor ?
-#ifdef DOPLANES
// yeah, easy backface cull! :)
- if (cullFloorHeight < dup_viewz)
+ if (cullFloorHeight < viewz)
{
if (gr_frontsector->floorpic != skyflatnum)
{
if (sub->validcount != validcount)
{
- HWR_GetFlat(levelflats[gr_frontsector->floorpic].lumpnum);
- HWR_RenderPlane(gr_frontsector, &extrasubsectors[num], false,
+ HWR_GetFlat(levelflats[gr_frontsector->floorpic].lumpnum, R_NoEncore(gr_frontsector, false));
+ HWR_RenderPlane(&extrasubsectors[num], false,
// Hack to make things continue to work around slopes.
locFloorHeight == cullFloorHeight ? locFloorHeight : gr_frontsector->floorheight,
// We now return you to your regularly scheduled rendering.
- PF_Occlude, floorlightlevel, levelflats[gr_frontsector->floorpic].lumpnum, NULL, 255, false, floorcolormap);
+ PF_Occlude, floorlightlevel, levelflats[gr_frontsector->floorpic].lumpnum, NULL, 255, floorcolormap);
}
}
- else
- {
-#ifdef POLYSKY
- HWR_RenderSkyPlane(&extrasubsectors[num], locFloorHeight);
-#endif
- }
}
- if (cullCeilingHeight > dup_viewz)
+ if (cullCeilingHeight > viewz)
{
if (gr_frontsector->ceilingpic != skyflatnum)
{
if (sub->validcount != validcount)
{
- HWR_GetFlat(levelflats[gr_frontsector->ceilingpic].lumpnum);
- HWR_RenderPlane(NULL, &extrasubsectors[num], true,
+ HWR_GetFlat(levelflats[gr_frontsector->ceilingpic].lumpnum, R_NoEncore(gr_frontsector, true));
+ HWR_RenderPlane(&extrasubsectors[num], true,
// Hack to make things continue to work around slopes.
locCeilingHeight == cullCeilingHeight ? locCeilingHeight : gr_frontsector->ceilingheight,
// We now return you to your regularly scheduled rendering.
- PF_Occlude, ceilinglightlevel, levelflats[gr_frontsector->ceilingpic].lumpnum,NULL, 255, false, ceilingcolormap);
+ PF_Occlude, ceilinglightlevel, levelflats[gr_frontsector->ceilingpic].lumpnum,NULL, 255, ceilingcolormap);
}
}
- else
- {
-#ifdef POLYSKY
- HWR_RenderSkyPlane(&extrasubsectors[num], locCeilingHeight);
-#endif
- }
}
-#ifndef POLYSKY
- // Moved here because before, when above the ceiling and the floor does not have the sky flat, it doesn't draw the sky
- if (gr_frontsector->ceilingpic == skyflatnum || gr_frontsector->floorpic == skyflatnum)
- drawsky = true;
-#endif
-
-#ifdef R_FAKEFLOORS
if (gr_frontsector->ffloors)
{
/// \todo fix light, xoffs, yoffs, extracolormap ?
@@ -3644,19 +2668,19 @@ static void HWR_Subsector(size_t num)
if (centerHeight <= locCeilingHeight &&
centerHeight >= locFloorHeight &&
- ((dup_viewz < cullHeight && !(rover->flags & FF_INVERTPLANES)) ||
- (dup_viewz > cullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
+ ((viewz < cullHeight && !(rover->flags & FF_INVERTPLANES)) ||
+ (viewz > cullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
{
if (rover->flags & FF_FOG)
{
UINT8 alpha;
- light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
+ light = R_GetPlaneLight(gr_frontsector, centerHeight, viewz < cullHeight ? true : false);
if (rover->master->frontsector->extra_colormap)
alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba);
else
- alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG);
+ alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, GL_NORMALFOG);
HWR_AddTransparentFloor(0,
&extrasubsectors[num],
@@ -3668,29 +2692,21 @@ static void HWR_Subsector(size_t num)
}
else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) // SoM: Flags are more efficient
{
- light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
-#ifndef SORTING
- HWR_Add3DWater(levelflats[*rover->bottompic].lumpnum,
- &extrasubsectors[num],
- *rover->bottomheight,
- *gr_frontsector->lightlist[light].lightlevel,
- rover->alpha-1, rover->master->frontsector);
-#else
+ light = R_GetPlaneLight(gr_frontsector, centerHeight, viewz < cullHeight ? true : false);
HWR_AddTransparentFloor(levelflats[*rover->bottompic].lumpnum,
&extrasubsectors[num],
false,
*rover->bottomheight,
*gr_frontsector->lightlist[light].lightlevel,
- rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, PF_Translucent,
+ rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Translucent,
false, gr_frontsector->lightlist[light].extra_colormap);
-#endif
}
else
{
- HWR_GetFlat(levelflats[*rover->bottompic].lumpnum);
- light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
- HWR_RenderPlane(NULL, &extrasubsectors[num], false, *rover->bottomheight, PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, levelflats[*rover->bottompic].lumpnum,
- rover->master->frontsector, 255, false, gr_frontsector->lightlist[light].extra_colormap);
+ HWR_GetFlat(levelflats[*rover->bottompic].lumpnum, R_NoEncore(gr_frontsector, false));
+ light = R_GetPlaneLight(gr_frontsector, centerHeight, viewz < cullHeight ? true : false);
+ HWR_RenderPlane(&extrasubsectors[num], false, *rover->bottomheight, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, levelflats[*rover->bottompic].lumpnum,
+ rover->master->frontsector, 255, gr_frontsector->lightlist[light].extra_colormap);
}
}
@@ -3707,19 +2723,19 @@ static void HWR_Subsector(size_t num)
if (centerHeight >= locFloorHeight &&
centerHeight <= locCeilingHeight &&
- ((dup_viewz > cullHeight && !(rover->flags & FF_INVERTPLANES)) ||
- (dup_viewz < cullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
+ ((viewz > cullHeight && !(rover->flags & FF_INVERTPLANES)) ||
+ (viewz < cullHeight && (rover->flags & FF_BOTHPLANES || rover->flags & FF_INVERTPLANES))))
{
if (rover->flags & FF_FOG)
{
UINT8 alpha;
- light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
+ light = R_GetPlaneLight(gr_frontsector, centerHeight, viewz < cullHeight ? true : false);
if (rover->master->frontsector->extra_colormap)
alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba);
else
- alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG);
+ alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, GL_NORMALFOG);
HWR_AddTransparentFloor(0,
&extrasubsectors[num],
@@ -3731,36 +2747,25 @@ static void HWR_Subsector(size_t num)
}
else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256)
{
- light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
-#ifndef SORTING
- HWR_Add3DWater(levelflats[*rover->toppic].lumpnum,
- &extrasubsectors[num],
- *rover->topheight,
- *gr_frontsector->lightlist[light].lightlevel,
- rover->alpha-1, rover->master->frontsector);
-#else
+ light = R_GetPlaneLight(gr_frontsector, centerHeight, viewz < cullHeight ? true : false);
HWR_AddTransparentFloor(levelflats[*rover->toppic].lumpnum,
&extrasubsectors[num],
true,
*rover->topheight,
*gr_frontsector->lightlist[light].lightlevel,
- rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, PF_Translucent,
+ rover->alpha-1 > 255 ? 255 : rover->alpha-1, rover->master->frontsector, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Translucent,
false, gr_frontsector->lightlist[light].extra_colormap);
-#endif
-
}
else
{
- HWR_GetFlat(levelflats[*rover->toppic].lumpnum);
- light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false);
- HWR_RenderPlane(NULL, &extrasubsectors[num], true, *rover->topheight, PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, levelflats[*rover->toppic].lumpnum,
- rover->master->frontsector, 255, false, gr_frontsector->lightlist[light].extra_colormap);
+ HWR_GetFlat(levelflats[*rover->toppic].lumpnum, R_NoEncore(gr_frontsector, true));
+ light = R_GetPlaneLight(gr_frontsector, centerHeight, viewz < cullHeight ? true : false);
+ HWR_RenderPlane(&extrasubsectors[num], true, *rover->topheight, (rover->flags & FF_RIPPLE ? PF_Ripple : 0)|PF_Occlude, *gr_frontsector->lightlist[light].lightlevel, levelflats[*rover->toppic].lumpnum,
+ rover->master->frontsector, 255, gr_frontsector->lightlist[light].extra_colormap);
}
}
}
}
-#endif
-#endif //doplanes
#ifdef POLYOBJECTS
// Draw all the polyobjects in this subsector
@@ -3829,59 +2834,8 @@ static void HWR_Subsector(size_t num)
// traversing subtree recursively.
// Just call with BSP root.
-#ifdef coolhack
-//t;b;l;r
-static fixed_t hackbbox[4];
-//BOXTOP,
-//BOXBOTTOM,
-//BOXLEFT,
-//BOXRIGHT
-static boolean HWR_CheckHackBBox(fixed_t *bb)
+void HWR_RenderBSPNode(INT32 bspnum)
{
- if (bb[BOXTOP] < hackbbox[BOXBOTTOM]) //y up
- return false;
- if (bb[BOXBOTTOM] > hackbbox[BOXTOP])
- return false;
- if (bb[BOXLEFT] > hackbbox[BOXRIGHT])
- return false;
- if (bb[BOXRIGHT] < hackbbox[BOXLEFT])
- return false;
- return true;
-}
-#endif
-
-// BP: big hack for a test in lighning ref : 1249753487AB
-fixed_t *hwbbox;
-
-static void HWR_RenderBSPNode(INT32 bspnum)
-{
- /*//GZDoom code
- if(bspnum == -1)
- {
- HWR_Subsector(subsectors);
- return;
- }
- while(!((size_t)bspnum&(~NF_SUBSECTOR))) // Keep going until found a subsector
- {
- node_t *bsp = &nodes[bspnum];
-
- // Decide which side the view point is on
- INT32 side = R_PointOnSide(dup_viewx, dup_viewy, bsp);
-
- // Recursively divide front space (toward the viewer)
- HWR_RenderBSPNode(bsp->children[side]);
-
- // Possibly divide back space (away from viewer)
- side ^= 1;
-
- if (!HWR_CheckBBox(bsp->bbox[side]))
- return;
-
- bspnum = bsp->children[side];
- }
-
- HWR_Subsector(bspnum-1);
-*/
node_t *bsp = &nodes[bspnum];
// Decide which side the view point is on
@@ -3890,129 +2844,20 @@ static void HWR_RenderBSPNode(INT32 bspnum)
// Found a subsector?
if (bspnum & NF_SUBSECTOR)
{
- if (bspnum == -1)
- {
- //*(gr_drawsubsector_p++) = 0;
- HWR_Subsector(0);
- }
- else
- {
- //*(gr_drawsubsector_p++) = bspnum&(~NF_SUBSECTOR);
+ if (bspnum != -1)
HWR_Subsector(bspnum&(~NF_SUBSECTOR));
- }
return;
}
// Decide which side the view point is on.
- side = R_PointOnSide(dup_viewx, dup_viewy, bsp);
-
- // BP: big hack for a test in lighning ref : 1249753487AB
- hwbbox = bsp->bbox[side];
+ side = R_PointOnSide(viewx, viewy, bsp);
// Recursively divide front space.
HWR_RenderBSPNode(bsp->children[side]);
// Possibly divide back space.
if (HWR_CheckBBox(bsp->bbox[side^1]))
- {
- // BP: big hack for a test in lighning ref : 1249753487AB
- hwbbox = bsp->bbox[side^1];
HWR_RenderBSPNode(bsp->children[side^1]);
- }
-}
-
-/*
-//
-// Clear 'stack' of subsectors to draw
-//
-static void HWR_ClearDrawSubsectors(void)
-{
- gr_drawsubsector_p = gr_drawsubsectors;
-}
-
-//
-// Draw subsectors pushed on the drawsubsectors 'stack', back to front
-//
-static void HWR_RenderSubsectors(void)
-{
- while (gr_drawsubsector_p > gr_drawsubsectors)
- {
- HWR_RenderBSPNode(
- lastsubsec->nextsubsec = bspnum & (~NF_SUBSECTOR);
- }
-}
-*/
-
-// ==========================================================================
-// FROM R_MAIN.C
-// ==========================================================================
-
-//BP : exactely the same as R_InitTextureMapping
-void HWR_InitTextureMapping(void)
-{
- angle_t i;
- INT32 x;
- INT32 t;
- fixed_t focallength;
- fixed_t grcenterx;
- fixed_t grcenterxfrac;
- INT32 grviewwidth;
-
-#define clipanglefov (FIELDOFVIEW>>ANGLETOFINESHIFT)
-
- grviewwidth = vid.width;
- grcenterx = grviewwidth/2;
- grcenterxfrac = grcenterx< FRACUNIT*2)
- t = -1;
- else if (FINETANGENT(i) < -FRACUNIT*2)
- t = grviewwidth+1;
- else
- {
- t = FixedMul(FINETANGENT(i), focallength);
- t = (grcenterxfrac - t+FRACUNIT-1)>>FRACBITS;
-
- if (t < -1)
- t = -1;
- else if (t > grviewwidth+1)
- t = grviewwidth+1;
- }
- gr_viewangletox[i] = t;
- }
-
- // Scan viewangletox[] to generate xtoviewangle[]:
- // xtoviewangle will give the smallest view angle
- // that maps to x.
- for (x = 0; x <= grviewwidth; x++)
- {
- i = 0;
- while (gr_viewangletox[i]>x)
- i++;
- gr_xtoviewangle[x] = (i<flip)
{
- swallVerts[0].sow = swallVerts[3].sow = gpatch->max_s;
- swallVerts[2].sow = swallVerts[1].sow = 0;
+ swallVerts[0].s = swallVerts[3].s = gpatch->max_s;
+ swallVerts[2].s = swallVerts[1].s = 0;
}
else
{
- swallVerts[0].sow = swallVerts[3].sow = 0;
- swallVerts[2].sow = swallVerts[1].sow = gpatch->max_s;
+ swallVerts[0].s = swallVerts[3].s = 0;
+ swallVerts[2].s = swallVerts[1].s = gpatch->max_s;
}
// flip the texture coords (look familiar?)
if (spr->vflip)
{
- swallVerts[3].tow = swallVerts[2].tow = gpatch->max_t;
- swallVerts[0].tow = swallVerts[1].tow = 0;
+ swallVerts[3].t = swallVerts[2].t = gpatch->max_t;
+ swallVerts[0].t = swallVerts[1].t = 0;
}
else
{
- swallVerts[3].tow = swallVerts[2].tow = 0;
- swallVerts[0].tow = swallVerts[1].tow = gpatch->max_t;
+ swallVerts[3].t = swallVerts[2].t = 0;
+ swallVerts[0].t = swallVerts[1].t = gpatch->max_t;
}
- sSurf.FlatColor.s.red = 0x00;
- sSurf.FlatColor.s.blue = 0x00;
- sSurf.FlatColor.s.green = 0x00;
-
- /*if (spr->mobj->frame & FF_TRANSMASK || spr->mobj->flags2 & MF2_SHADOW)
- {
- sector_t *sector = spr->mobj->subsector->sector;
- UINT8 lightlevel = 255;
- extracolormap_t *colormap = sector->extra_colormap;
-
- if (sector->numlights)
- {
- INT32 light = R_GetPlaneLight(sector, spr->mobj->floorz, false);
-
- if (!(spr->mobj->frame & FF_FULLBRIGHT))
- lightlevel = *sector->lightlist[light].lightlevel;
-
- if (sector->lightlist[light].extra_colormap)
- colormap = sector->lightlist[light].extra_colormap;
- }
- else
- {
- lightlevel = sector->lightlevel;
-
- if (sector->extra_colormap)
- colormap = sector->extra_colormap;
- }
-
- if (colormap)
- sSurf.FlatColor.rgba = HWR_Lighting(lightlevel/2, colormap->rgba, colormap->fadergba, false, true);
- else
- sSurf.FlatColor.rgba = HWR_Lighting(lightlevel/2, NORMALFOG, FADEFOG, false, true);
- }*/
+ sSurf.PolyColor.s.red = 0x00;
+ sSurf.PolyColor.s.blue = 0x00;
+ sSurf.PolyColor.s.green = 0x00;
// shadow is always half as translucent as the sprite itself
if (!cv_translucency.value) // use default translucency (main sprite won't have any translucency)
- sSurf.FlatColor.s.alpha = 0x80; // default
+ sSurf.PolyColor.s.alpha = 0x80; // default
else if (spr->mobj->flags2 & MF2_SHADOW)
- sSurf.FlatColor.s.alpha = 0x20;
+ sSurf.PolyColor.s.alpha = 0x20;
else if (spr->mobj->frame & FF_TRANSMASK)
{
HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &sSurf);
- sSurf.FlatColor.s.alpha /= 2; //cut alpha in half!
+ sSurf.PolyColor.s.alpha /= 2; //cut alpha in half!
}
else
- sSurf.FlatColor.s.alpha = 0x80; // default
+ sSurf.PolyColor.s.alpha = 0x80; // default
- if (sSurf.FlatColor.s.alpha > floorheight/4)
+ if (sSurf.PolyColor.s.alpha > floorheight/4)
{
- sSurf.FlatColor.s.alpha = (UINT8)(sSurf.FlatColor.s.alpha - floorheight/4);
- HWD.pfnDrawPolygon(&sSurf, swallVerts, 4, PF_Translucent|PF_Modulated|PF_Clip);
+ sSurf.PolyColor.s.alpha = (UINT8)(sSurf.PolyColor.s.alpha - floorheight/4);
+ HWD.pfnSetShader(1); // floor shader
+ HWD.pfnDrawPolygon(&sSurf, swallVerts, 4, PF_Translucent|PF_Modulated);
}
}
// This is expecting a pointer to an array containing 4 wallVerts for a sprite
static void HWR_RotateSpritePolyToAim(gr_vissprite_t *spr, FOutVector *wallVerts)
{
- if (cv_grspritebillboarding.value
- && spr && spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE)
- && wallVerts)
+ if (cv_grspritebillboarding.value && spr && spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE) && wallVerts)
{
float basey = FIXED_TO_FLOAT(spr->mobj->z);
float lowy = wallVerts[0].y;
@@ -4384,10 +3198,6 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
if (cv_shadow.value // Shadows enabled
&& (spr->mobj->flags & (MF_SCENERY|MF_SPAWNCEILING|MF_NOGRAVITY)) != (MF_SCENERY|MF_SPAWNCEILING|MF_NOGRAVITY) // Ceiling scenery have no shadow.
&& !(spr->mobj->flags2 & MF2_DEBRIS) // Debris have no corona or shadow.
-#ifdef ALAM_LIGHTING
- && !(t_lspr[spr->mobj->sprite]->type // Things with dynamic lights have no shadow.
- && (!spr->mobj->player || spr->mobj->player->powers[pw_super])) // Except for non-super players.
-#endif
&& (spr->mobj->z >= spr->mobj->floorz)) // Without this, your shadow shows on the floor, even after you die and fall through the ground.
{
////////////////////
@@ -4414,29 +3224,30 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
if (spr->flip)
{
- baseWallVerts[0].sow = baseWallVerts[3].sow = gpatch->max_s;
- baseWallVerts[2].sow = baseWallVerts[1].sow = 0;
+ baseWallVerts[0].s = baseWallVerts[3].s = gpatch->max_s;
+ baseWallVerts[2].s = baseWallVerts[1].s = 0;
}
else
{
- baseWallVerts[0].sow = baseWallVerts[3].sow = 0;
- baseWallVerts[2].sow = baseWallVerts[1].sow = gpatch->max_s;
+ baseWallVerts[0].s = baseWallVerts[3].s = 0;
+ baseWallVerts[2].s = baseWallVerts[1].s = gpatch->max_s;
}
// flip the texture coords (look familiar?)
if (spr->vflip)
{
- baseWallVerts[3].tow = baseWallVerts[2].tow = gpatch->max_t;
- baseWallVerts[0].tow = baseWallVerts[1].tow = 0;
+ baseWallVerts[3].t = baseWallVerts[2].t = gpatch->max_t;
+ baseWallVerts[0].t = baseWallVerts[1].t = 0;
}
else
{
- baseWallVerts[3].tow = baseWallVerts[2].tow = 0;
- baseWallVerts[0].tow = baseWallVerts[1].tow = gpatch->max_t;
+ baseWallVerts[3].t = baseWallVerts[2].t = 0;
+ baseWallVerts[0].t = baseWallVerts[1].t = gpatch->max_t;
}
// if it has a dispoffset, push it a little towards the camera
- if (spr->dispoffset) {
+ if (spr->dispoffset)
+ {
float co = -gr_viewcos*(0.05f*spr->dispoffset);
float si = -gr_viewsin*(0.05f*spr->dispoffset);
baseWallVerts[0].z = baseWallVerts[3].z = baseWallVerts[0].z+si;
@@ -4450,8 +3261,8 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
realtop = top = baseWallVerts[3].y;
realbot = bot = baseWallVerts[0].y;
- towtop = baseWallVerts[3].tow;
- towbot = baseWallVerts[0].tow;
+ towtop = baseWallVerts[3].t;
+ towbot = baseWallVerts[0].t;
towmult = (towbot - towtop) / (top - bot);
#ifdef ESLOPE
@@ -4466,12 +3277,12 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
if (!cv_translucency.value) // translucency disabled
{
- Surf.FlatColor.s.alpha = 0xFF;
+ Surf.PolyColor.s.alpha = 0xFF;
blend = PF_Translucent|PF_Occlude;
}
else if (spr->mobj->flags2 & MF2_SHADOW)
{
- Surf.FlatColor.s.alpha = 0x40;
+ Surf.PolyColor.s.alpha = 0x40;
blend = PF_Translucent;
}
else if (spr->mobj->frame & FF_TRANSMASK)
@@ -4482,11 +3293,11 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
// work properly under glide nor with fogcolor to ffffff :(
// Hurdler: PF_Environement would be cool, but we need to fix
// the issue with the fog before
- Surf.FlatColor.s.alpha = 0xFF;
+ Surf.PolyColor.s.alpha = 0xFF;
blend = PF_Translucent|PF_Occlude;
}
- alpha = Surf.FlatColor.s.alpha;
+ alpha = Surf.PolyColor.s.alpha;
// Start with the lightlevel and colormap from the top of the sprite
lightlevel = *list[sector->numlights - 1].lightlevel;
@@ -4581,10 +3392,10 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
#endif
#ifdef ESLOPE
- wallVerts[3].tow = towtop + ((realtop - top) * towmult);
- wallVerts[2].tow = towtop + ((endrealtop - endtop) * towmult);
- wallVerts[0].tow = towtop + ((realtop - bot) * towmult);
- wallVerts[1].tow = towtop + ((endrealtop - endbot) * towmult);
+ wallVerts[3].t = towtop + ((realtop - top) * towmult);
+ wallVerts[2].t = towtop + ((endrealtop - endtop) * towmult);
+ wallVerts[0].t = towtop + ((realtop - bot) * towmult);
+ wallVerts[1].t = towtop + ((endrealtop - endbot) * towmult);
wallVerts[3].y = top;
wallVerts[2].y = endtop;
@@ -4592,8 +3403,7 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
wallVerts[1].y = endbot;
// The x and y only need to be adjusted in the case that it's not a papersprite
- if (cv_grspritebillboarding.value
- && spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE))
+ if (cv_grspritebillboarding.value && spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE))
{
// Get the x and z of the vertices so billboarding draws correctly
realheight = realbot - realtop;
@@ -4615,15 +3425,14 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
wallVerts[1].z = baseWallVerts[2].z + (baseWallVerts[2].z - baseWallVerts[1].z) * heightmult;
}
#else
- wallVerts[3].tow = wallVerts[2].tow = towtop + ((realtop - top) * towmult);
- wallVerts[0].tow = wallVerts[1].tow = towtop + ((realtop - bot) * towmult);
+ wallVerts[3].t = wallVerts[2].t = towtop + ((realtop - top) * towmult);
+ wallVerts[0].t = wallVerts[1].t = towtop + ((realtop - bot) * towmult);
wallVerts[2].y = wallVerts[3].y = top;
wallVerts[0].y = wallVerts[1].y = bot;
// The x and y only need to be adjusted in the case that it's not a papersprite
- if (cv_grspritebillboarding.value
- && spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE))
+ if (cv_grspritebillboarding.value && spr->mobj && !(spr->mobj->frame & FF_PAPERSPRITE))
{
// Get the x and z of the vertices so billboarding draws correctly
realheight = realbot - realtop;
@@ -4642,13 +3451,14 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
#endif
if (colormap)
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, colormap->rgba, colormap->fadergba, false, false);
+ HWR_Lighting(&Surf, lightlevel, colormap->rgba, colormap->fadergba);
else
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, false);
+ HWR_NoColormapLighting(&Surf, lightlevel, GL_NORMALFOG, GL_FADEFOG);
- Surf.FlatColor.s.alpha = alpha;
+ Surf.PolyColor.s.alpha = alpha;
- HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated|PF_Clip);
+ HWD.pfnSetShader(3); // sprite shader
+ HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated);
top = bot;
#ifdef ESLOPE
@@ -4666,31 +3476,32 @@ static void HWR_SplitSprite(gr_vissprite_t *spr)
// If we're ever down here, somehow the above loop hasn't draw all the light levels of sprite
#ifdef ESLOPE
- wallVerts[3].tow = towtop + ((realtop - top) * towmult);
- wallVerts[2].tow = towtop + ((endrealtop - endtop) * towmult);
- wallVerts[0].tow = towtop + ((realtop - bot) * towmult);
- wallVerts[1].tow = towtop + ((endrealtop - endbot) * towmult);
+ wallVerts[3].t = towtop + ((realtop - top) * towmult);
+ wallVerts[2].t = towtop + ((endrealtop - endtop) * towmult);
+ wallVerts[0].t = towtop + ((realtop - bot) * towmult);
+ wallVerts[1].t = towtop + ((endrealtop - endbot) * towmult);
wallVerts[3].y = top;
wallVerts[2].y = endtop;
wallVerts[0].y = bot;
wallVerts[1].y = endbot;
#else
- wallVerts[3].tow = wallVerts[2].tow = towtop + ((realtop - top) * towmult);
- wallVerts[0].tow = wallVerts[1].tow = towtop + ((realtop - bot) * towmult);
+ wallVerts[3].t = wallVerts[2].t = towtop + ((realtop - top) * towmult);
+ wallVerts[0].t = wallVerts[1].t = towtop + ((realtop - bot) * towmult);
wallVerts[2].y = wallVerts[3].y = top;
wallVerts[0].y = wallVerts[1].y = bot;
#endif
if (colormap)
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, colormap->rgba, colormap->fadergba, false, false);
+ HWR_Lighting(&Surf, lightlevel, colormap->rgba, colormap->fadergba);
else
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, false);
+ HWR_NoColormapLighting(&Surf, lightlevel, GL_NORMALFOG, GL_FADEFOG);
- Surf.FlatColor.s.alpha = alpha;
+ Surf.PolyColor.s.alpha = alpha;
- HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated|PF_Clip);
+ HWD.pfnSetShader(3); // sprite shader
+ HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated);
}
// -----------------+
@@ -4705,7 +3516,6 @@ static void HWR_DrawSprite(gr_vissprite_t *spr)
GLPatch_t *gpatch; // sprite patch converted to hardware
FSurfaceInfo Surf;
const boolean hires = (spr->mobj && spr->mobj->skin && ((skin_t *)spr->mobj->skin)->flags & SF_HIRES);
- //const boolean papersprite = (spr->mobj && (spr->mobj->frame & FF_PAPERSPRITE));
if (spr->mobj)
this_scale = FIXED_TO_FLOAT(spr->mobj->scale);
if (hires)
@@ -4731,12 +3541,6 @@ static void HWR_DrawSprite(gr_vissprite_t *spr)
gpatch = W_CachePatchNum(spr->patchlumpnum, PU_CACHE);
-#ifdef ALAM_LIGHTING
- if (!(spr->mobj->flags2 & MF2_DEBRIS) && (spr->mobj->sprite != SPR_PLAY ||
- (spr->mobj->player && spr->mobj->player->powers[pw_super])))
- HWR_DL_AddLight(spr, gpatch);
-#endif
-
// create the sprite billboard
//
// 3--2
@@ -4760,21 +3564,21 @@ static void HWR_DrawSprite(gr_vissprite_t *spr)
if (spr->flip)
{
- wallVerts[0].sow = wallVerts[3].sow = gpatch->max_s;
- wallVerts[2].sow = wallVerts[1].sow = 0;
+ wallVerts[0].s = wallVerts[3].s = gpatch->max_s;
+ wallVerts[2].s = wallVerts[1].s = 0;
}else{
- wallVerts[0].sow = wallVerts[3].sow = 0;
- wallVerts[2].sow = wallVerts[1].sow = gpatch->max_s;
+ wallVerts[0].s = wallVerts[3].s = 0;
+ wallVerts[2].s = wallVerts[1].s = gpatch->max_s;
}
// flip the texture coords (look familiar?)
if (spr->vflip)
{
- wallVerts[3].tow = wallVerts[2].tow = gpatch->max_t;
- wallVerts[0].tow = wallVerts[1].tow = 0;
+ wallVerts[3].t = wallVerts[2].t = gpatch->max_t;
+ wallVerts[0].t = wallVerts[1].t = 0;
}else{
- wallVerts[3].tow = wallVerts[2].tow = 0;
- wallVerts[0].tow = wallVerts[1].tow = gpatch->max_t;
+ wallVerts[3].t = wallVerts[2].t = 0;
+ wallVerts[0].t = wallVerts[1].t = gpatch->max_t;
}
// cache the patch in the graphics card memory
@@ -4786,10 +3590,6 @@ static void HWR_DrawSprite(gr_vissprite_t *spr)
if (cv_shadow.value // Shadows enabled
&& (spr->mobj->flags & (MF_SCENERY|MF_SPAWNCEILING|MF_NOGRAVITY)) != (MF_SCENERY|MF_SPAWNCEILING|MF_NOGRAVITY) // Ceiling scenery have no shadow.
&& !(spr->mobj->flags2 & MF2_DEBRIS) // Debris have no corona or shadow.
-#ifdef ALAM_LIGHTING
- && !(t_lspr[spr->mobj->sprite]->type // Things with dynamic lights have no shadow.
- && (!spr->mobj->player || spr->mobj->player->powers[pw_super])) // Except for non-super players.
-#endif
&& (spr->mobj->z >= spr->mobj->floorz)) // Without this, your shadow shows on the floor, even after you die and fall through the ground.
{
////////////////////
@@ -4799,7 +3599,8 @@ static void HWR_DrawSprite(gr_vissprite_t *spr)
}
// if it has a dispoffset, push it a little towards the camera
- if (spr->dispoffset) {
+ if (spr->dispoffset)
+ {
float co = -gr_viewcos*(0.05f*spr->dispoffset);
float si = -gr_viewsin*(0.05f*spr->dispoffset);
wallVerts[0].z = wallVerts[3].z = wallVerts[0].z+si;
@@ -4825,21 +3626,21 @@ static void HWR_DrawSprite(gr_vissprite_t *spr)
lightlevel = sector->lightlevel;
if (colormap)
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, colormap->rgba, colormap->fadergba, false, false);
+ HWR_Lighting(&Surf, lightlevel, colormap->rgba, colormap->fadergba);
else
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, false);
+ HWR_NoColormapLighting(&Surf, lightlevel, GL_NORMALFOG, GL_FADEFOG);
}
{
FBITFIELD blend = 0;
if (!cv_translucency.value) // translucency disabled
{
- Surf.FlatColor.s.alpha = 0xFF;
+ Surf.PolyColor.s.alpha = 0xFF;
blend = PF_Translucent|PF_Occlude;
}
else if (spr->mobj->flags2 & MF2_SHADOW)
{
- Surf.FlatColor.s.alpha = 0x40;
+ Surf.PolyColor.s.alpha = 0x40;
blend = PF_Translucent;
}
else if (spr->mobj->frame & FF_TRANSMASK)
@@ -4850,15 +3651,15 @@ static void HWR_DrawSprite(gr_vissprite_t *spr)
// work properly under glide nor with fogcolor to ffffff :(
// Hurdler: PF_Environement would be cool, but we need to fix
// the issue with the fog before
- Surf.FlatColor.s.alpha = 0xFF;
+ Surf.PolyColor.s.alpha = 0xFF;
blend = PF_Translucent|PF_Occlude;
}
- HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated|PF_Clip);
+ HWD.pfnSetShader(3); // sprite shader
+ HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated);
}
}
-#ifdef HWPRECIP
// Sprite drawer for precipitation
static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr)
{
@@ -4895,11 +3696,11 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr)
// Let dispoffset work first since this adjust each vertex
HWR_RotateSpritePolyToAim(spr, wallVerts);
- wallVerts[0].sow = wallVerts[3].sow = 0;
- wallVerts[2].sow = wallVerts[1].sow = gpatch->max_s;
+ wallVerts[0].s = wallVerts[3].s = 0;
+ wallVerts[2].s = wallVerts[1].s = gpatch->max_s;
- wallVerts[3].tow = wallVerts[2].tow = 0;
- wallVerts[0].tow = wallVerts[1].tow = gpatch->max_t;
+ wallVerts[3].t = wallVerts[2].t = 0;
+ wallVerts[0].t = wallVerts[1].t = gpatch->max_t;
// cache the patch in the graphics card memory
//12/12/99: Hurdler: same comment as above (for md2)
@@ -4934,14 +3735,14 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr)
}
if (colormap)
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, colormap->rgba, colormap->fadergba, false, false);
+ HWR_Lighting(&Surf, lightlevel, colormap->rgba, colormap->fadergba);
else
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, false);
+ HWR_NoColormapLighting(&Surf, lightlevel, GL_NORMALFOG, GL_FADEFOG);
}
if (spr->mobj->flags2 & MF2_SHADOW)
{
- Surf.FlatColor.s.alpha = 0x40;
+ Surf.PolyColor.s.alpha = 0x40;
blend = PF_Translucent;
}
else if (spr->mobj->frame & FF_TRANSMASK)
@@ -4952,13 +3753,13 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr)
// work properly under glide nor with fogcolor to ffffff :(
// Hurdler: PF_Environement would be cool, but we need to fix
// the issue with the fog before
- Surf.FlatColor.s.alpha = 0xFF;
+ Surf.PolyColor.s.alpha = 0xFF;
blend = PF_Translucent|PF_Occlude;
}
- HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated|PF_Clip);
+ HWD.pfnSetShader(3); // sprite shader
+ HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated);
}
-#endif
// --------------------------------------------------------------------------
// Sort vissprites by distance
@@ -5059,14 +3860,11 @@ static void HWR_SortVisSprites(void)
// middle texture. This is used for sorting with sprites.
typedef struct
{
- wallVert3D wallVerts[4];
+ FOutVector wallVerts[4];
FSurfaceInfo Surf;
INT32 texnum;
FBITFIELD blend;
INT32 drawcount;
-#ifndef SORTING
- fixed_t fixedheight;
-#endif
boolean fogwall;
INT32 lightlevel;
extracolormap_t *wallcolormap; // Doing the lighting in HWR_RenderWall now for correct fog after sorting
@@ -5075,10 +3873,6 @@ typedef struct
static wallinfo_t *wallinfo = NULL;
static size_t numwalls = 0; // a list of transparent walls to be drawn
-static void HWR_RenderWall(wallVert3D *wallVerts, FSurfaceInfo *pSurf, FBITFIELD blend, boolean fogwall, INT32 lightlevel, extracolormap_t *wallcolormap);
-
-#define MAX_TRANSPARENTWALL 256
-
typedef struct
{
extrasubsector_t *xsub;
@@ -5114,30 +3908,19 @@ typedef struct
static size_t numpolyplanes = 0; // a list of transparent poyobject floors to be drawn
static polyplaneinfo_t *polyplaneinfo = NULL;
-#ifndef SORTING
-size_t numfloors = 0;
-#else
-//static floorinfo_t *floorinfo = NULL;
-//static size_t numfloors = 0;
-//Hurdler: 3D water sutffs
typedef struct gr_drawnode_s
{
planeinfo_t *plane;
polyplaneinfo_t *polyplane;
wallinfo_t *wall;
gr_vissprite_t *sprite;
-
-// struct gr_drawnode_s *next;
-// struct gr_drawnode_s *prev;
} gr_drawnode_t;
-static INT32 drawcount = 0;
-
+#define MAX_TRANSPARENTWALL 256
#define MAX_TRANSPARENTFLOOR 512
// This will likely turn into a copy of HWR_Add3DWater and replace it.
-void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub, boolean isceiling,
- fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap)
+void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap)
{
static size_t allocedplanes = 0;
@@ -5168,8 +3951,7 @@ void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub, boolean
// Adding this for now until I can create extrasubsector info for polyobjects
// When that happens it'll just be done through HWR_AddTransparentFloor and HWR_RenderPlane
-void HWR_AddTransparentPolyobjectFloor(lumpnum_t lumpnum, polyobj_t *polysector, boolean isceiling,
- fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, extracolormap_t *planecolormap)
+void HWR_AddTransparentPolyobjectFloor(lumpnum_t lumpnum, polyobj_t *polysector, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, extracolormap_t *planecolormap)
{
static size_t allocedpolyplanes = 0;
@@ -5196,13 +3978,12 @@ void HWR_AddTransparentPolyobjectFloor(lumpnum_t lumpnum, polyobj_t *polysector,
numpolyplanes++;
}
-//
-// HWR_CreateDrawNodes
-// Creates and sorts a list of drawnodes for the scene being rendered.
-static void HWR_CreateDrawNodes(void)
+// HWR_RenderDrawNodes
+// Creates, sorts and renders a list of drawnodes for the current frame.
+void HWR_RenderDrawNodes(void)
{
UINT32 i = 0, p = 0, prev = 0, loop;
- const fixed_t pviewz = dup_viewz;
+ const fixed_t pviewz = viewz;
// Dump EVERYTHING into a huge drawnode list. Then we'll sort it!
// Could this be optimized into _AddTransparentWall/_AddTransparentPlane?
@@ -5338,8 +4119,10 @@ static void HWR_CreateDrawNodes(void)
} //i++
} // loop++
- HWD.pfnSetTransform(&atransform);
// Okay! Let's draw it all! Woo!
+ HWD.pfnSetTransform(&atransform);
+ HWD.pfnSetShader(0);
+
for (i = 0; i < p; i++)
{
if (sortnode[sortindex[i]].plane)
@@ -5348,9 +4131,9 @@ static void HWR_CreateDrawNodes(void)
gr_frontsector = NULL;
if (!(sortnode[sortindex[i]].plane->blend & PF_NoTexture))
- HWR_GetFlat(sortnode[sortindex[i]].plane->lumpnum);
- HWR_RenderPlane(NULL, sortnode[sortindex[i]].plane->xsub, sortnode[sortindex[i]].plane->isceiling, sortnode[sortindex[i]].plane->fixedheight, sortnode[sortindex[i]].plane->blend, sortnode[sortindex[i]].plane->lightlevel,
- sortnode[sortindex[i]].plane->lumpnum, sortnode[sortindex[i]].plane->FOFSector, sortnode[sortindex[i]].plane->alpha, sortnode[sortindex[i]].plane->fogplane, sortnode[sortindex[i]].plane->planecolormap);
+ HWR_GetFlat(sortnode[sortindex[i]].plane->lumpnum, R_NoEncore(sortnode[sortindex[i]].plane->FOFSector, sortnode[sortindex[i]].plane->isceiling));
+ HWR_RenderPlane(sortnode[sortindex[i]].plane->xsub, sortnode[sortindex[i]].plane->isceiling, sortnode[sortindex[i]].plane->fixedheight, sortnode[sortindex[i]].plane->blend, sortnode[sortindex[i]].plane->lightlevel,
+ sortnode[sortindex[i]].plane->lumpnum, sortnode[sortindex[i]].plane->FOFSector, sortnode[sortindex[i]].plane->alpha, /*sortnode[sortindex[i]].plane->fogplane,*/ sortnode[sortindex[i]].plane->planecolormap);
}
else if (sortnode[sortindex[i]].polyplane)
{
@@ -5358,7 +4141,7 @@ static void HWR_CreateDrawNodes(void)
gr_frontsector = NULL;
if (!(sortnode[sortindex[i]].polyplane->blend & PF_NoTexture))
- HWR_GetFlat(sortnode[sortindex[i]].polyplane->lumpnum);
+ HWR_GetFlat(sortnode[sortindex[i]].polyplane->lumpnum, R_NoEncore(sortnode[sortindex[i]].polyplane->FOFSector, sortnode[sortindex[i]].polyplane->isceiling));
HWR_RenderPolyObjectPlane(sortnode[sortindex[i]].polyplane->polysector, sortnode[sortindex[i]].polyplane->isceiling, sortnode[sortindex[i]].polyplane->fixedheight, sortnode[sortindex[i]].polyplane->blend, sortnode[sortindex[i]].polyplane->lightlevel,
sortnode[sortindex[i]].polyplane->lumpnum, sortnode[sortindex[i]].polyplane->FOFSector, sortnode[sortindex[i]].polyplane->alpha, sortnode[sortindex[i]].polyplane->planecolormap);
}
@@ -5380,14 +4163,10 @@ static void HWR_CreateDrawNodes(void)
Z_Free(sortindex);
}
-#endif
-
// --------------------------------------------------------------------------
// Draw all vissprites
// --------------------------------------------------------------------------
-#ifdef SORTING
-// added the stransform so they can be switched as drawing happenes so MD2s and sprites are sorted correctly with each other
-static void HWR_DrawSprites(void)
+void HWR_DrawSprites(void)
{
if (gr_visspritecount > 0)
{
@@ -5398,11 +4177,9 @@ static void HWR_DrawSprites(void)
spr != &gr_vsprsortedhead;
spr = spr->next)
{
-#ifdef HWPRECIP
if (spr->precip)
HWR_DrawPrecipitationSprite(spr);
else
-#endif
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.
@@ -5421,19 +4198,15 @@ static void HWR_DrawSprites(void)
}
}
}
-#endif
// --------------------------------------------------------------------------
// HWR_AddSprites
// During BSP traversal, this adds sprites by sector.
// --------------------------------------------------------------------------
-static UINT8 sectorlight;
-static void HWR_AddSprites(sector_t *sec)
+void HWR_AddSprites(sector_t *sec)
{
mobj_t *thing;
-#ifdef HWPRECIP
precipmobj_t *precipthing;
-#endif
fixed_t approx_dist, limit_dist;
// BSP is traversed by subsector.
@@ -5446,9 +4219,6 @@ static void HWR_AddSprites(sector_t *sec)
// Well, now it will be done.
sec->validcount = validcount;
- // sprite lighting
- sectorlight = sec->lightlevel & 0xff;
-
// Handle all things in sector.
// If a limit exists, handle things a tiny bit different.
if ((limit_dist = (fixed_t)(/*(maptol & TOL_NIGHTS) ? cv_drawdist_nights.value : */cv_drawdist.value) << FRACBITS))
@@ -5516,7 +4286,6 @@ static void HWR_AddSprites(sector_t *sec)
}
}
-#ifdef HWPRECIP
// No to infinite precipitation draw distance.
if ((limit_dist = (fixed_t)cv_drawdist_precip.value << FRACBITS))
{
@@ -5533,7 +4302,6 @@ static void HWR_AddSprites(sector_t *sec)
HWR_ProjectPrecipitationSprite(precipthing);
}
}
-#endif
}
// --------------------------------------------------------------------------
@@ -5541,12 +4309,13 @@ static void HWR_AddSprites(sector_t *sec)
// Generates a vissprite for a thing if it might be visible.
// --------------------------------------------------------------------------
// BP why not use xtoviexangle/viewangletox like in bsp ?....
-static void HWR_ProjectSprite(mobj_t *thing)
+void HWR_ProjectSprite(mobj_t *thing)
{
gr_vissprite_t *vis;
float tr_x, tr_y;
float tz;
float x1, x2;
+ float z1, z2;
float rightsin, rightcos;
float this_scale;
float gz, gzt;
@@ -5556,9 +4325,8 @@ static void HWR_ProjectSprite(mobj_t *thing)
unsigned rot;
UINT8 flip;
angle_t ang;
- INT32 heightsec, phs;
const boolean papersprite = (thing->frame & FF_PAPERSPRITE);
- float z1, z2;
+ INT32 heightsec, phs;
if (!thing)
return;
@@ -5686,6 +4454,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
x1 = tr_x + x1 * rightcos;
x2 = tr_x - x2 * rightcos;
+
if (thing->eflags & MFE_VERTICALFLIP)
{
gz = FIXED_TO_FLOAT(thing->z+thing->height) - FIXED_TO_FLOAT(spritecachedinfo[lumpoff].topoffset) * this_scale;
@@ -5732,8 +4501,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
vis->patchlumpnum = sprframe->lumppat[rot];
vis->flip = flip;
vis->mobj = thing;
- vis->z1 = z1;
- vis->z2 = z2;
+
//Hurdler: 25/04/2000: now support colormap in hardware mode
if ((vis->mobj->flags & MF_BOSS) && (vis->mobj->flags2 & MF2_FRET) && (leveltime & 1)) // Bosses "flash"
@@ -5762,7 +4530,7 @@ static void HWR_ProjectSprite(mobj_t *thing)
{
vis->colormap = colormaps;
#ifdef GLENCORE
- if (encoremap && (thing->flags & (MF_SCENERY|MF_NOTHINK)))
+ if (encoremap && (thing->flags & (MF_SCENERY|MF_NOTHINK)) && !(thing->flags & MF_DONTENCOREMAP))
vis->colormap += (256*32);
#endif
}
@@ -5781,9 +4549,8 @@ static void HWR_ProjectSprite(mobj_t *thing)
vis->precip = false;
}
-#ifdef HWPRECIP
// Precipitation projector for hardware mode
-static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
+void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
{
gr_vissprite_t *vis;
float tr_x, tr_y;
@@ -5879,8 +4646,9 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
vis->mobj = (mobj_t *)thing;
vis->colormap = colormaps;
+
#ifdef GLENCORE
- if (encoremap)
+ if (encoremap && !(thing->flags & MF_DONTENCOREMAP))
vis->colormap += (256*32);
#endif
@@ -5889,12 +4657,10 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing)
vis->precip = true;
}
-#endif
-// ==========================================================================
-//
-// ==========================================================================
-static void HWR_DrawSkyBackground(void)
+static boolean drewsky = false;
+
+void HWR_DrawSkyBackground(void)
{
FOutVector v[4];
angle_t angle;
@@ -5902,7 +4668,10 @@ static void HWR_DrawSkyBackground(void)
float aspectratio;
float angleturn;
- HWR_GetTexture(texturetranslation[skytexture]);
+ if (drewsky)
+ return;
+
+ HWR_GetTexture(skytexture);
aspectratio = (float)vid.width/(float)vid.height;
//Hurdler: the sky is the only texture who need 4.0f instead of 1.0
@@ -5927,8 +4696,8 @@ static void HWR_DrawSkyBackground(void)
// software doesn't draw any further than 1024 for skies anyway, but this doesn't overlap properly
// The only time this will probably be an issue is when a sky wider than 1024 is used as a sky AND a regular wall texture
- angle = (dup_viewangle + gr_xtoviewangle[0]);
- dimensionmultiply = ((float)textures[texturetranslation[skytexture]]->width/256.0f);
+ angle = (viewangle/2 + xtoviewangle[0]);
+ dimensionmultiply = ((float)textures[skytexture]->width/256.0f);
if (atransform.mirror)
{
@@ -5936,13 +4705,12 @@ static void HWR_DrawSkyBackground(void)
dimensionmultiply *= -1;
}
- v[0].sow = v[3].sow = ((float) angle / ((ANGLE_90-1)*dimensionmultiply));
- v[2].sow = v[1].sow = (-1.0f/dimensionmultiply)+((float) angle / ((ANGLE_90-1)*dimensionmultiply));
+ v[0].s = v[3].s = ((float) angle / ((ANGLE_90-1)*dimensionmultiply));
+ v[2].s = v[1].s = (-1.0f/dimensionmultiply)+((float) angle / ((ANGLE_90-1)*dimensionmultiply));
// Y
angle = aimingangle;
-
- dimensionmultiply = ((float)textures[texturetranslation[skytexture]]->height/(128.0f*aspectratio));
+ dimensionmultiply = ((float)textures[skytexture]->height/(128.0f*aspectratio));
if (splitscreen == 1)
{
@@ -5955,30 +4723,42 @@ static void HWR_DrawSkyBackground(void)
if (atransform.flip)
{
// During vertical flip the sky should be flipped and it's y movement should also be flipped obviously
- v[3].tow = v[2].tow = -(0.5f-(0.5f/dimensionmultiply));
- v[0].tow = v[1].tow = (-1.0f/dimensionmultiply)-(0.5f-(0.5f/dimensionmultiply));
+ v[3].t = v[2].t = -(0.5f-(0.5f/dimensionmultiply));
+ v[0].t = v[1].t = (-1.0f/dimensionmultiply)-(0.5f-(0.5f/dimensionmultiply));
}
else
{
- v[3].tow = v[2].tow = (-1.0f/dimensionmultiply)-(0.5f-(0.5f/dimensionmultiply));
- v[0].tow = v[1].tow = -(0.5f-(0.5f/dimensionmultiply));
+ v[3].t = v[2].t = (-1.0f/dimensionmultiply)-(0.5f-(0.5f/dimensionmultiply));
+ v[0].t = v[1].t = -(0.5f-(0.5f/dimensionmultiply));
}
angleturn = (((float)ANGLE_45-1.0f)*aspectratio)*dimensionmultiply;
- if (angle > ANGLE_180) // Do this because we don't want the sky to suddenly teleport when crossing over 0 to 360 and vice versa
+ if (cv_grshearing.value)
{
- angle = InvAngle(angle);
- v[3].tow = v[2].tow += ((float) angle / angleturn);
- v[0].tow = v[1].tow += ((float) angle / angleturn);
+ // Doesn't really make sense, but what can I do?
+ angle_t dy = FixedAngle(FixedMul(360*FRACUNIT, FixedDiv(AIMINGTODY(aimingangle), 900*FRACUNIT)));
+ v[3].t = v[2].t -= ((float) dy / angleturn);
+ v[0].t = v[1].t -= ((float) dy / angleturn);
}
else
{
- v[3].tow = v[2].tow -= ((float) angle / angleturn);
- v[0].tow = v[1].tow -= ((float) angle / angleturn);
+ if (angle > ANGLE_180) // Do this because we don't want the sky to suddenly teleport when crossing over 0 to 360 and vice versa
+ {
+ angle = InvAngle(angle);
+ v[3].t = v[2].t += ((float) angle / angleturn);
+ v[0].t = v[1].t += ((float) angle / angleturn);
+ }
+ else
+ {
+ v[3].t = v[2].t -= ((float) angle / angleturn);
+ v[0].t = v[1].t -= ((float) angle / angleturn);
+ }
}
+ HWD.pfnSetShader(7); // sky shader
HWD.pfnDrawPolygon(NULL, v, 4, 0);
+ HWD.pfnSetShader(0);
}
@@ -5987,23 +4767,12 @@ static void HWR_DrawSkyBackground(void)
// -----------------+
static inline void HWR_ClearView(void)
{
- // 3--2
- // | /|
- // |/ |
- // 0--1
-
- /// \bug faB - enable depth mask, disable color mask
-
HWD.pfnGClipRect((INT32)gr_viewwindowx,
(INT32)gr_viewwindowy,
(INT32)(gr_viewwindowx + gr_viewwidth),
(INT32)(gr_viewwindowy + gr_viewheight),
ZCLIP_PLANE);
HWD.pfnClearBuffer(false, true, 0);
-
- //disable clip window - set to full size
- // rem by Hurdler
- // HWD.pfnGClipRect(0, 0, vid.width, vid.height);
}
@@ -6037,35 +4806,16 @@ void HWR_SetViewSize(void)
HWD.pfnFlushScreenTextures();
}
+
// ==========================================================================
-// Same as rendering the player view, but from the skybox object
+// Render the current frame.
// ==========================================================================
-void HWR_RenderSkyboxView(INT32 viewnumber, player_t *player)
+void HWR_RenderFrame(INT32 viewnumber, player_t *player, boolean skybox)
{
+ angle_t a1;
const float fpov = FIXED_TO_FLOAT(cv_fov.value+player->fovadd);
- postimg_t *type;
-
- type = &postimgtype[viewnumber];
-
- {
- // do we really need to save player (is it not the same)?
- player_t *saved_player = stplyr;
- stplyr = player;
- ST_doPaletteStuff();
- stplyr = saved_player;
-#ifdef ALAM_LIGHTING
- HWR_SetLights(viewnumber);
-#endif
- }
-
- // note: sets viewangle, viewx, viewy, viewz
- R_SkyboxFrame(player);
-
- // copy view cam position for local use
- dup_viewx = viewx;
- dup_viewy = viewy;
- dup_viewz = viewz;
- dup_viewangle = viewangle;
+ postimg_t *postprocessor;
+ INT32 i;
// set window position
gr_centerx = gr_basecenterx;
@@ -6087,167 +4837,119 @@ void HWR_RenderSkyboxView(INT32 viewnumber, player_t *player)
gr_windowcenterx += gr_viewwidth;
}
+
// check for new console commands.
NetUpdate();
- gr_viewx = FIXED_TO_FLOAT(dup_viewx);
- gr_viewy = FIXED_TO_FLOAT(dup_viewy);
- gr_viewz = FIXED_TO_FLOAT(dup_viewz);
+ gr_viewx = FIXED_TO_FLOAT(viewx);
+ gr_viewy = FIXED_TO_FLOAT(viewy);
+ gr_viewz = FIXED_TO_FLOAT(viewz);
gr_viewsin = FIXED_TO_FLOAT(viewsin);
gr_viewcos = FIXED_TO_FLOAT(viewcos);
- gr_viewludsin = FIXED_TO_FLOAT(FINECOSINE(aimingangle>>ANGLETOFINESHIFT));
- gr_viewludcos = FIXED_TO_FLOAT(-FINESINE(aimingangle>>ANGLETOFINESHIFT));
+ // Set T&L transform
+ atransform.x = gr_viewx;
+ atransform.y = gr_viewy;
+ atransform.z = gr_viewz;
- //04/01/2000: Hurdler: added for T&L
- // It should replace all other gr_viewxxx when finished
- atransform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
- atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
- atransform.anglez = 0.0f;
-
- if (*type == postimg_flip)
- atransform.flip = true;
- else
- atransform.flip = false;
-
- if (*type == postimg_mirror)
- atransform.mirror = true;
- else
- atransform.mirror = false;
-
- atransform.x = gr_viewx; // FIXED_TO_FLOAT(viewx)
- atransform.y = gr_viewy; // FIXED_TO_FLOAT(viewy)
- atransform.z = gr_viewz; // FIXED_TO_FLOAT(viewz)
atransform.scalex = 1;
atransform.scaley = (float)vid.width/vid.height;
atransform.scalez = 1;
+
+ // 14042019
+ gr_aimingangle = aimingangle;
+ atransform.shearing = false;
+ atransform.viewaiming = aimingangle;
+
+ if (cv_grshearing.value)
+ {
+ gr_aimingangle = 0;
+ atransform.shearing = true;
+ }
+
+ gr_viewludsin = FIXED_TO_FLOAT(FINECOSINE(gr_aimingangle>>ANGLETOFINESHIFT));
+ gr_viewludcos = FIXED_TO_FLOAT(-FINESINE(gr_aimingangle>>ANGLETOFINESHIFT));
+
+ atransform.anglex = (float)(gr_aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
+ atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
+
atransform.fovxangle = fpov; // Tails
atransform.fovyangle = fpov; // Tails
atransform.splitscreen = splitscreen;
- gr_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l)));
+ for (i = 0; i <= splitscreen; i++)
+ {
+ if (player == &players[displayplayers[i]])
+ postprocessor = &postimgtype[i];
+ }
- //------------------------------------------------------------------------
+ atransform.flip = false;
+ if (*postprocessor == postimg_flip)
+ atransform.flip = true;
+
+ atransform.mirror = false;
+ if (*postprocessor == postimg_mirror)
+ atransform.mirror = true;
+
+ // Clear view, set viewport (glViewport), set perspective...
HWR_ClearView();
+ HWR_ClearSprites();
-if (0)
-{ // I don't think this is ever used.
+ ST_doPaletteStuff();
+
+ // Draw the sky background.
+ HWR_DrawSkyBackground();
+ if (skybox)
+ drewsky = true;
+
+ a1 = gld_FrustumAngle(gr_aimingangle);
+ gld_clipper_Clear();
+ gld_clipper_SafeAddClipRange(viewangle + a1, viewangle - a1);
+#ifdef HAVE_SPHEREFRUSTRUM
+ gld_FrustrumSetup();
+#endif
+
+ // Set transform.
+ HWD.pfnSetTransform(&atransform);
+
+ // Reset the shader state.
+ HWD.pfnSetSpecialState(HWD_SET_SHADERS, cv_grshaders.value);
+ HWD.pfnSetShader(0);
+
+ // Check if fog is enabled.
if (cv_grfog.value)
HWR_FoggingOn(); // First of all, turn it on, set the default user settings too
else
HWD.pfnSetSpecialState(HWD_SET_FOG_MODE, 0); // Turn it off
-}
- if (drawsky)
- HWR_DrawSkyBackground();
-
- //Hurdler: it doesn't work in splitscreen mode
- drawsky = splitscreen;
-
- HWR_ClearSprites();
-
-#ifdef SORTING
drawcount = 0;
-#endif
-#ifdef NEWCLIP
- if (rendermode == render_opengl)
- {
- angle_t a1 = gld_FrustumAngle();
- gld_clipper_Clear();
- gld_clipper_SafeAddClipRange(viewangle + a1, viewangle - a1);
-#ifdef HAVE_SPHEREFRUSTRUM
- gld_FrustrumSetup();
-#endif
- }
-#else
- HWR_ClearClipSegs();
-#endif
-
- //04/01/2000: Hurdler: added for T&L
- // Actually it only works on Walls and Planes
- HWD.pfnSetTransform(&atransform);
-
validcount++;
+ // Recursively "render" the BSP tree.
HWR_RenderBSPNode((INT32)numnodes-1);
-#ifndef NEWCLIP
- // Make a viewangle int so we can render things based on mouselook
- if (player == &players[consoleplayer])
- viewangle = localaiming[0];
- else if (splitscreen && player == &players[displayplayers[1]])
- viewangle = localaiming[1];
- else if (splitscreen > 1 && player == &players[displayplayers[2]])
- viewangle = localaiming[2];
- else if (splitscreen > 2 && player == &players[displayplayers[3]])
- viewangle = localaiming[3];
-
- // Handle stuff when you are looking farther up or down.
- if ((aimingangle || cv_fov.value+player->fovadd > 90*FRACUNIT))
- {
- dup_viewangle += ANGLE_90;
- HWR_ClearClipSegs();
- HWR_RenderBSPNode((INT32)numnodes-1); //left
-
- dup_viewangle += ANGLE_90;
- if (((INT32)aimingangle > ANGLE_45 || (INT32)aimingangle<-ANGLE_45))
- {
- HWR_ClearClipSegs();
- HWR_RenderBSPNode((INT32)numnodes-1); //back
- }
-
- dup_viewangle += ANGLE_90;
- HWR_ClearClipSegs();
- HWR_RenderBSPNode((INT32)numnodes-1); //right
-
- dup_viewangle += ANGLE_90;
- }
-#endif
-
// Check for new console commands.
NetUpdate();
-#ifdef ALAM_LIGHTING
- //14/11/99: Hurdler: moved here because it doesn't work with
- // subsector, see other comments;
- HWR_ResetLights();
-#endif
-
// Draw MD2 and sprites
-#ifdef SORTING
HWR_SortVisSprites();
-#endif
-
-#ifdef SORTING
HWR_DrawSprites();
-#endif
-#ifdef NEWCORONAS
- //Hurdler: they must be drawn before translucent planes, what about gl fog?
- HWR_DrawCoronas();
-#endif
-#ifdef SORTING
- if (numplanes || numpolyplanes || numwalls) //Hurdler: render 3D water and transparent walls after everything
- {
- HWR_CreateDrawNodes();
- }
-#else
- if (numfloors || numwalls)
- {
- HWD.pfnSetTransform(&atransform);
- if (numfloors)
- HWR_Render3DWater();
- if (numwalls)
- HWR_RenderTransparentWalls();
- }
-#endif
+ if (numplanes || numpolyplanes || numwalls) // Render FOFs and translucent walls after everything
+ HWR_RenderDrawNodes();
+ // Unset transform and shader
HWD.pfnSetTransform(NULL);
+ HWD.pfnUnSetShader();
- // put it off for menus etc
+ // Disable fog
if (cv_grfog.value)
HWD.pfnSetSpecialState(HWD_SET_FOG_MODE, 0);
+ // Run post processor effects
+ if (!skybox)
+ HWR_DoPostProcessor(player);
+
// Check for new console commands.
NetUpdate();
@@ -6257,300 +4959,51 @@ if (0)
}
// ==========================================================================
-//
+// Render the player view.
// ==========================================================================
void HWR_RenderPlayerView(INT32 viewnumber, player_t *player)
{
- const float fpov = FIXED_TO_FLOAT(cv_fov.value+player->fovadd);
- postimg_t *type = &postimgtype[viewnumber];
-
const boolean skybox = (skyboxmo[0] && cv_skybox.value); // True if there's a skybox object and skyboxes are on
-
- FRGBAFloat ClearColor;
-
- type = &postimgtype[viewnumber];
-
- ClearColor.red = 0.0f;
- ClearColor.green = 0.0f;
- ClearColor.blue = 0.0f;
- ClearColor.alpha = 1.0f;
-
+ // Clear the color buffer, stops HOMs. Also seems to fix the skybox issue on Intel GPUs.
if (viewnumber == 0) // Only do it if it's the first screen being rendered
- HWD.pfnClearBuffer(true, false, &ClearColor); // Clear the Color Buffer, stops HOMs. Also seems to fix the skybox issue on Intel GPUs.
-
- if (skybox && drawsky) // If there's a skybox and we should be drawing the sky, draw the skybox
- HWR_RenderSkyboxView(viewnumber, player); // This is drawn before everything else so it is placed behind
-
{
- // do we really need to save player (is it not the same)?
- player_t *saved_player = stplyr;
- stplyr = player;
- ST_doPaletteStuff();
- stplyr = saved_player;
-#ifdef ALAM_LIGHTING
- HWR_SetLights(viewnumber);
-#endif
+ FRGBAFloat ClearColor;
+ ClearColor.red = 0.0f;
+ ClearColor.green = 0.0f;
+ ClearColor.blue = 0.0f;
+ ClearColor.alpha = 1.0f;
+ HWD.pfnClearBuffer(true, false, &ClearColor);
+ }
+
+ if (viewnumber > 3)
+ return;
+
+ // Render the skybox if there is one.
+ drewsky = false;
+ if (skybox)
+ {
+ R_SkyboxFrame(player);
+ HWR_RenderFrame(viewnumber, player, true);
}
- // note: sets viewangle, viewx, viewy, viewz
R_SetupFrame(player, false); // This can stay false because it is only used to set viewsky in r_main.c, which isn't used here
-
- // copy view cam position for local use
- dup_viewx = viewx;
- dup_viewy = viewy;
- dup_viewz = viewz;
- dup_viewangle = viewangle;
-
- // set window position
- gr_centerx = gr_basecenterx;
- gr_viewwindowx = gr_baseviewwindowx;
- gr_windowcenterx = gr_basewindowcenterx;
- gr_centery = gr_basecentery;
- gr_viewwindowy = gr_baseviewwindowy;
- gr_windowcentery = gr_basewindowcentery;
-
- if ((splitscreen == 1 && viewnumber == 1) || (splitscreen > 1 && viewnumber > 1))
- {
- gr_viewwindowy += gr_viewheight;
- gr_windowcentery += gr_viewheight;
- }
-
- if (splitscreen > 1 && viewnumber & 1)
- {
- gr_viewwindowx += gr_viewwidth;
- gr_windowcenterx += gr_viewwidth;
- }
-
- // check for new console commands.
- NetUpdate();
-
- gr_viewx = FIXED_TO_FLOAT(dup_viewx);
- gr_viewy = FIXED_TO_FLOAT(dup_viewy);
- gr_viewz = FIXED_TO_FLOAT(dup_viewz);
- gr_viewsin = FIXED_TO_FLOAT(viewsin);
- gr_viewcos = FIXED_TO_FLOAT(viewcos);
-
- gr_viewludsin = FIXED_TO_FLOAT(FINECOSINE(aimingangle>>ANGLETOFINESHIFT));
- gr_viewludcos = FIXED_TO_FLOAT(-FINESINE(aimingangle>>ANGLETOFINESHIFT));
-
- //04/01/2000: Hurdler: added for T&L
- // It should replace all other gr_viewxxx when finished
- atransform.anglex = (float)(aimingangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
- atransform.angley = (float)(viewangle>>ANGLETOFINESHIFT)*(360.0f/(float)FINEANGLES);
- atransform.anglez = 0.0f;
-
- if (*type == postimg_flip)
- atransform.flip = true;
- else
- atransform.flip = false;
-
- if (*type == postimg_mirror)
- atransform.mirror = true;
- else
- atransform.mirror = false;
-
- atransform.x = gr_viewx; // FIXED_TO_FLOAT(viewx)
- atransform.y = gr_viewy; // FIXED_TO_FLOAT(viewy)
- atransform.z = gr_viewz; // FIXED_TO_FLOAT(viewz)
- atransform.scalex = 1;
- atransform.scaley = (float)vid.width/vid.height;
- atransform.scalez = 1;
- atransform.fovxangle = fpov; // Tails
- atransform.fovyangle = fpov; // Tails
- atransform.splitscreen = splitscreen;
-
- gr_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l)));
-
- //------------------------------------------------------------------------
- HWR_ClearView(); // Clears the depth buffer and resets the view I believe
-
-if (0)
-{ // I don't think this is ever used.
- if (cv_grfog.value)
- HWR_FoggingOn(); // First of all, turn it on, set the default user settings too
- else
- HWD.pfnSetSpecialState(HWD_SET_FOG_MODE, 0); // Turn it off
-}
-
- if (!skybox && drawsky) // Don't draw the regular sky if there's a skybox
- HWR_DrawSkyBackground();
-
- //Hurdler: it doesn't work in splitscreen mode
- drawsky = splitscreen;
-
- HWR_ClearSprites();
-
-#ifdef SORTING
- drawcount = 0;
-#endif
-#ifdef NEWCLIP
- if (rendermode == render_opengl)
- {
- angle_t a1 = gld_FrustumAngle();
- gld_clipper_Clear();
- gld_clipper_SafeAddClipRange(viewangle + a1, viewangle - a1);
-#ifdef HAVE_SPHEREFRUSTRUM
- gld_FrustrumSetup();
-#endif
- }
-#else
- HWR_ClearClipSegs();
-#endif
-
- //04/01/2000: Hurdler: added for T&L
- // Actually it only works on Walls and Planes
- HWD.pfnSetTransform(&atransform);
-
- validcount++;
-
- HWR_RenderBSPNode((INT32)numnodes-1);
-
-#ifndef NEWCLIP
- // Make a viewangle int so we can render things based on mouselook
- if (player == &players[consoleplayer])
- viewangle = localaiming[0];
- else if (splitscreen && player == &players[displayplayers[1]])
- viewangle = localaiming[1];
- else if (splitscreen > 1 && player == &players[displayplayers[2]])
- viewangle = localaiming[2];
- else if (splitscreen > 2 && player == &players[displayplayers[3]])
- viewangle = localaiming[3];
-
- // Handle stuff when you are looking farther up or down.
- if ((aimingangle || cv_fov.value+player->fovadd > 90*FRACUNIT))
- {
- dup_viewangle += ANGLE_90;
- HWR_ClearClipSegs();
- HWR_RenderBSPNode((INT32)numnodes-1); //left
-
- dup_viewangle += ANGLE_90;
- if (((INT32)aimingangle > ANGLE_45 || (INT32)aimingangle<-ANGLE_45))
- {
- HWR_ClearClipSegs();
- HWR_RenderBSPNode((INT32)numnodes-1); //back
- }
-
- dup_viewangle += ANGLE_90;
- HWR_ClearClipSegs();
- HWR_RenderBSPNode((INT32)numnodes-1); //right
-
- dup_viewangle += ANGLE_90;
- }
-#endif
-
- // Check for new console commands.
- NetUpdate();
-
-#ifdef ALAM_LIGHTING
- //14/11/99: Hurdler: moved here because it doesn't work with
- // subsector, see other comments;
- HWR_ResetLights();
-#endif
-
- // Draw MD2 and sprites
-#ifdef SORTING
- HWR_SortVisSprites();
-#endif
-
-#ifdef SORTING
- HWR_DrawSprites();
-#endif
-#ifdef NEWCORONAS
- //Hurdler: they must be drawn before translucent planes, what about gl fog?
- HWR_DrawCoronas();
-#endif
-
-#ifdef SORTING
- if (numplanes || numpolyplanes || numwalls) //Hurdler: render 3D water and transparent walls after everything
- {
- HWR_CreateDrawNodes();
- }
-#else
- if (numfloors || numpolyplanes || numwalls)
- {
- HWD.pfnSetTransform(&atransform);
- if (numfloors)
- HWR_Render3DWater();
- if (numwalls)
- HWR_RenderTransparentWalls();
- }
-#endif
-
- HWD.pfnSetTransform(NULL);
-
- // put it off for menus etc
- if (cv_grfog.value)
- HWD.pfnSetSpecialState(HWD_SET_FOG_MODE, 0);
-
- HWR_DoPostProcessor(player);
-
- // Check for new console commands.
- NetUpdate();
-
- // added by Hurdler for correct splitscreen
- // moved here by hurdler so it works with the new near clipping plane
- HWD.pfnGClipRect(0, 0, vid.width, vid.height, NZCLIP_PLANE);
+ HWR_RenderFrame(viewnumber, player, skybox);
}
// ==========================================================================
// FOG
// ==========================================================================
-/// \author faB
-
-static UINT32 atohex(const char *s)
+void HWR_FoggingOn(void)
{
- INT32 iCol;
- const char *sCol;
- char cCol;
- INT32 i;
-
- if (strlen(s)<6)
- return 0;
-
- iCol = 0;
- sCol = s;
- for (i = 0; i < 6; i++, sCol++)
- {
- iCol <<= 4;
- cCol = *sCol;
- if (cCol >= '0' && cCol <= '9')
- iCol |= cCol - '0';
- else
- {
- if (cCol >= 'F')
- cCol -= 'a' - 'A';
- if (cCol >= 'A' && cCol <= 'F')
- iCol = iCol | (cCol - 'A' + 10);
- }
- }
- //CONS_Debug(DBG_RENDER, "col %x\n", iCol);
- return iCol;
-}
-
-static void HWR_FoggingOn(void)
-{
- HWD.pfnSetSpecialState(HWD_SET_FOG_COLOR, atohex(cv_grfogcolor.string));
- HWD.pfnSetSpecialState(HWD_SET_FOG_DENSITY, cv_grfogdensity.value);
HWD.pfnSetSpecialState(HWD_SET_FOG_MODE, 1);
+ HWD.pfnSetSpecialState(HWD_SET_FOG_DENSITY, cv_grfogdensity.value);
}
// ==========================================================================
// 3D ENGINE COMMANDS
// ==========================================================================
-
-
-static void Command_GrStats_f(void)
-{
- Z_CheckHeap(9875); // debug
-
- CONS_Printf(M_GetText("Patch info headers: %7s kb\n"), sizeu1(Z_TagUsage(PU_HWRPATCHINFO)>>10));
- CONS_Printf(M_GetText("3D Texture cache : %7s kb\n"), sizeu1(Z_TagUsage(PU_HWRCACHE)>>10));
- CONS_Printf(M_GetText("Plane polygon : %7s kb\n"), sizeu1(Z_TagUsage(PU_HWRPLANE)>>10));
-}
-
-
// **************************************************************************
// 3D ENGINE SETUP
// **************************************************************************
@@ -6562,31 +5015,12 @@ static void Command_GrStats_f(void)
void HWR_AddCommands(void)
{
CV_RegisterVar(&cv_grrounddown);
- CV_RegisterVar(&cv_grfogdensity);
CV_RegisterVar(&cv_grfiltermode);
CV_RegisterVar(&cv_granisotropicmode);
CV_RegisterVar(&cv_grcorrecttricks);
CV_RegisterVar(&cv_grsolvetjoin);
}
-static inline void HWR_AddEngineCommands(void)
-{
- // engine state variables
- //CV_RegisterVar(&cv_grzbuffer);
-#ifndef NEWCLIP
- CV_RegisterVar(&cv_grclipwalls);
-#endif
-
- // engine development mode variables
- // - usage may vary from version to version..
- CV_RegisterVar(&cv_gralpha);
- CV_RegisterVar(&cv_grbeta);
-
- // engine commands
- COM_AddCommand("gr_stats", Command_GrStats_f);
-}
-
-
// --------------------------------------------------------------------------
// Setup the hardware renderer
// --------------------------------------------------------------------------
@@ -6594,27 +5028,12 @@ void HWR_Startup(void)
{
static boolean startupdone = false;
- // setup GLPatch_t scaling
- gr_patch_scalex = (float)(1.0f / vid.width);
- gr_patch_scaley = (float)(1.0f / vid.height);
-
- // initalze light lut translation
- InitLumLut();
-
// do this once
if (!startupdone)
{
- CONS_Printf("HWR_Startup()\n");
- HWR_InitPolyPool();
- // add console cmds & vars
- HWR_AddEngineCommands();
+ CONS_Printf("HWR_Startup()...\n");
HWR_InitTextureCache();
-
HWR_InitMD2();
-
-#ifdef ALAM_LIGHTING
- HWR_InitLight();
-#endif
}
if (rendermode == render_opengl)
@@ -6626,6 +5045,10 @@ void HWR_Startup(void)
#endif
startupdone = true;
+
+ // jimita
+ HWD.pfnKillShaders();
+ HWD.pfnLoadShaders();
}
@@ -6636,137 +5059,11 @@ void HWR_Shutdown(void)
{
CONS_Printf("HWR_Shutdown()\n");
HWR_FreeExtraSubsectors();
- HWR_FreePolyPool();
HWR_FreeTextureCache();
HWD.pfnFlushScreenTextures();
}
-void transform(float *cx, float *cy, float *cz)
-{
- float tr_x,tr_y;
- // translation
- tr_x = *cx - gr_viewx;
- tr_y = *cz - gr_viewy;
-// *cy = *cy;
-
- // rotation around vertical y axis
- *cx = (tr_x * gr_viewsin) - (tr_y * gr_viewcos);
- tr_x = (tr_x * gr_viewcos) + (tr_y * gr_viewsin);
-
- //look up/down ----TOTAL SUCKS!!!--- do the 2 in one!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- tr_y = *cy - gr_viewz;
-
- *cy = (tr_x * gr_viewludcos) + (tr_y * gr_viewludsin);
- *cz = (tr_x * gr_viewludsin) - (tr_y * gr_viewludcos);
-
- //scale y before frustum so that frustum can be scaled to screen height
- *cy *= ORIGINAL_ASPECT * gr_fovlud;
- *cx *= gr_fovlud;
-}
-
-
-//Hurdler: 3D Water stuff
-#define MAX_3DWATER 512
-
-#ifndef SORTING
-static void HWR_Add3DWater(lumpnum_t lumpnum, extrasubsector_t *xsub,
- fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector)
-{
- static size_t allocedplanes = 0;
-
- // Force realloc if buffer has been freed
- if (!planeinfo)
- allocedplanes = 0;
-
- if (allocedplanes < numfloors + 1)
- {
- allocedplanes += MAX_3DWATER;
- Z_Realloc(planeinfo, allocedplanes * sizeof (*planeinfo), PU_LEVEL, &planeinfo);
- }
- planeinfo[numfloors].fixedheight = fixedheight;
- planeinfo[numfloors].lightlevel = lightlevel;
- planeinfo[numfloors].lumpnum = lumpnum;
- planeinfo[numfloors].xsub = xsub;
- planeinfo[numfloors].alpha = alpha;
- planeinfo[numfloors].FOFSector = FOFSector;
- numfloors++;
-}
-#endif
-
-#define DIST_PLANE(i) ABS(planeinfo[(i)].fixedheight-dup_viewz)
-
-#if 0
-static void HWR_QuickSortPlane(INT32 start, INT32 finish)
-{
- INT32 left = start;
- INT32 right = finish;
- INT32 starterval = (INT32)((right+left)/2); //pick a starter
-
- planeinfo_t temp;
-
- //'sort of sort' the two halves of the data list about starterval
- while (right > left);
- {
- while (DIST_PLANE(left) < DIST_PLANE(starterval)) left++; //attempt to find a bigger value on the left
- while (DIST_PLANE(right) > DIST_PLANE(starterval)) right--; //attempt to find a smaller value on the right
-
- if (left < right) //if we haven't gone too far
- {
- //switch them
- M_Memcpy(&temp, &planeinfo[left], sizeof (planeinfo_t));
- M_Memcpy(&planeinfo[left], &planeinfo[right], sizeof (planeinfo_t));
- M_Memcpy(&planeinfo[right], &temp, sizeof (planeinfo_t));
- //move the bounds
- left++;
- right--;
- }
- }
-
- if (start < right) HWR_QuickSortPlane(start, right);
- if (left < finish) HWR_QuickSortPlane(left, finish);
-}
-#endif
-
-#ifndef SORTING
-static void HWR_Render3DWater(void)
-{
- size_t i;
-
- //bubble sort 3D Water for correct alpha blending
- {
- boolean permut = true;
- while (permut)
- {
- size_t j;
- for (j = 0, permut= false; j < numfloors-1; j++)
- {
- if (ABS(planeinfo[j].fixedheight-dup_viewz) < ABS(planeinfo[j+1].fixedheight-dup_viewz))
- {
- planeinfo_t temp;
- M_Memcpy(&temp, &planeinfo[j+1], sizeof (planeinfo_t));
- M_Memcpy(&planeinfo[j+1], &planeinfo[j], sizeof (planeinfo_t));
- M_Memcpy(&planeinfo[j], &temp, sizeof (planeinfo_t));
- permut = true;
- }
- }
- }
- }
-#if 0 //thanks epat, but it's goes looping forever on CTF map Silver Cascade Zone
- HWR_QuickSortPlane(0, numplanes-1);
-#endif
-
- gr_frontsector = NULL; //Hurdler: gr_fronsector is no longer valid
- for (i = 0; i < numfloors; i++)
- {
- HWR_GetFlat(planeinfo[i].lumpnum);
- HWR_RenderPlane(NULL, planeinfo[i].xsub, planeinfo[i].isceiling, planeinfo[i].fixedheight, PF_Translucent, planeinfo[i].lightlevel, planeinfo[i].lumpnum,
- planeinfo[i].FOFSector, planeinfo[i].alpha, planeinfo[i].fogplane, planeinfo[i].planecolormap);
- }
- numfloors = 0;
-}
-#endif
-
-static void HWR_AddTransparentWall(wallVert3D *wallVerts, FSurfaceInfo *pSurf, INT32 texnum, FBITFIELD blend, boolean fogwall, INT32 lightlevel, extracolormap_t *wallcolormap)
+void HWR_AddTransparentWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, INT32 texnum, FBITFIELD blend, boolean fogwall, INT32 lightlevel, extracolormap_t *wallcolormap)
{
static size_t allocedwalls = 0;
@@ -6784,108 +5081,45 @@ static void HWR_AddTransparentWall(wallVert3D *wallVerts, FSurfaceInfo *pSurf, I
M_Memcpy(&wallinfo[numwalls].Surf, pSurf, sizeof (FSurfaceInfo));
wallinfo[numwalls].texnum = texnum;
wallinfo[numwalls].blend = blend;
-#ifdef SORTING
wallinfo[numwalls].drawcount = drawcount++;
-#endif
wallinfo[numwalls].fogwall = fogwall;
wallinfo[numwalls].lightlevel = lightlevel;
wallinfo[numwalls].wallcolormap = wallcolormap;
numwalls++;
}
-#ifndef SORTING
-static void HWR_RenderTransparentWalls(void)
+
+void HWR_RenderWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, FBITFIELD blend, boolean fogwall, INT32 lightlevel, extracolormap_t *wallcolormap)
{
- size_t i;
-
- /*{ // sorting is disbale for now, do it!
- INT32 permut = 1;
- while (permut)
- {
- INT32 j;
- for (j = 0, permut = 0; j < numwalls-1; j++)
- {
- if (ABS(wallinfo[j].fixedheight-dup_viewz) < ABS(wallinfo[j+1].fixedheight-dup_viewz))
- {
- wallinfo_t temp;
- M_Memcpy(&temp, &wallinfo[j+1], sizeof (wallinfo_t));
- M_Memcpy(&wallinfo[j+1], &wallinfo[j], sizeof (wallinfo_t));
- M_Memcpy(&wallinfo[j], &temp, sizeof (wallinfo_t));
- permut = 1;
- }
- }
- }
- }*/
-
- for (i = 0; i < numwalls; i++)
- {
- HWR_GetTexture(wallinfo[i].texnum);
- HWR_RenderWall(wallinfo[i].wallVerts, &wallinfo[i].Surf, wallinfo[i].blend, wallinfo[i].wall->fogwall, wallinfo[i].wall->lightlevel, wallinfo[i].wall->wallcolormap);
- }
- numwalls = 0;
-}
-#endif
-static void HWR_RenderWall(wallVert3D *wallVerts, FSurfaceInfo *pSurf, FBITFIELD blend, boolean fogwall, INT32 lightlevel, extracolormap_t *wallcolormap)
-{
- FOutVector trVerts[4];
- UINT8 i;
- FOutVector *wv;
- UINT8 alpha;
-
- // transform
- wv = trVerts;
- // it sounds really stupid to do this conversion with the new T&L code
- // we should directly put the right information in the right structure
- // wallVerts3D seems ok, doesn't need FOutVector
- // also remove the light copy
- for (i = 0; i < 4; i++, wv++, wallVerts++)
- {
- wv->sow = wallVerts->s;
- wv->tow = wallVerts->t;
- wv->x = wallVerts->x;
- wv->y = wallVerts->y;
- wv->z = wallVerts->z;
- }
-
- alpha = pSurf->FlatColor.s.alpha; // retain the alpha
+ FBITFIELD blendmode = blend;
+ UINT8 alpha = pSurf->PolyColor.s.alpha; // retain the alpha
// Lighting is done here instead so that fog isn't drawn incorrectly on transparent walls after sorting
-
if (wallcolormap)
- {
- if (fogwall)
- pSurf->FlatColor.rgba = HWR_Lighting(lightlevel, wallcolormap->rgba, wallcolormap->fadergba, true, false);
- else
- pSurf->FlatColor.rgba = HWR_Lighting(lightlevel, wallcolormap->rgba, wallcolormap->fadergba, false, false);
- }
+ HWR_Lighting(pSurf, lightlevel, wallcolormap->rgba, wallcolormap->fadergba);
else
- {
- if (fogwall)
- pSurf->FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, true, false);
- else
- pSurf->FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, false);
- }
+ HWR_NoColormapLighting(pSurf, lightlevel, GL_NORMALFOG, GL_FADEFOG);
- pSurf->FlatColor.s.alpha = alpha; // put the alpha back after lighting
+ pSurf->PolyColor.s.alpha = alpha; // put the alpha back after lighting
+
+ HWD.pfnSetShader(2); // wall shader
if (blend & PF_Environment)
- HWD.pfnDrawPolygon(pSurf, trVerts, 4, blend|PF_Modulated|PF_Clip|PF_Occlude); // PF_Occlude must be used for solid objects
- else
- HWD.pfnDrawPolygon(pSurf, trVerts, 4, blend|PF_Modulated|PF_Clip); // No PF_Occlude means overlapping (incorrect) transparency
+ blendmode |= PF_Occlude; // PF_Occlude must be used for solid objects
+
+ if (fogwall)
+ {
+ blendmode |= PF_Fog;
+ HWD.pfnSetShader(6); // fog shader
+ }
+
+ blendmode |= PF_Modulated; // No PF_Occlude means overlapping (incorrect) transparency
+
+ HWD.pfnDrawPolygon(pSurf, wallVerts, 4, blendmode);
#ifdef WALLSPLATS
if (gr_curline->linedef->splats && cv_splats.value)
HWR_DrawSegsSplats(pSurf);
-
-#ifdef ALAM_LIGHTING
- //Hurdler: TODO: do static lighting using gr_curline->lm
- HWR_WallLighting(trVerts);
#endif
-#endif
-}
-
-INT32 HWR_GetTextureUsed(void)
-{
- return HWD.pfnGetTextureUsed();
}
void HWR_DoPostProcessor(player_t *player)
@@ -6893,6 +5127,8 @@ void HWR_DoPostProcessor(player_t *player)
postimg_t *type = &postimgtype[0];
UINT8 i;
+ HWD.pfnUnSetShader();
+
for (i = splitscreen; i > 0; i--)
{
if (player == &players[displayplayers[i]])
@@ -6916,15 +5152,15 @@ void HWR_DoPostProcessor(player_t *player)
// This won't change if the flash palettes are changed unfortunately, but it works for its purpose
if (player->flashpal == PAL_NUKE)
{
- Surf.FlatColor.s.red = 0xff;
- Surf.FlatColor.s.green = Surf.FlatColor.s.blue = 0x7F; // The nuke palette is kind of pink-ish
+ Surf.PolyColor.s.red = 0xff;
+ Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0x7F; // The nuke palette is kind of pink-ish
}
else
- Surf.FlatColor.s.red = Surf.FlatColor.s.green = Surf.FlatColor.s.blue = 0xff;
+ Surf.PolyColor.s.red = Surf.PolyColor.s.green = Surf.PolyColor.s.blue = 0xff;
- Surf.FlatColor.s.alpha = 0xc0; // match software mode
+ Surf.PolyColor.s.alpha = 0xc0; // match software mode
- HWD.pfnDrawPolygon(&Surf, v, 4, PF_Modulated|PF_Additive|PF_NoTexture|PF_NoDepthTest|PF_Clip|PF_NoZClip);
+ HWD.pfnDrawPolygon(&Surf, v, 4, PF_Modulated|PF_Translucent|PF_NoTexture|PF_NoDepthTest);
}
// Capture the screen for intermission and screen waving
@@ -6939,7 +5175,7 @@ void HWR_DoPostProcessor(player_t *player)
{
// 10 by 10 grid. 2 coordinates (xy)
float v[SCREENVERTS][SCREENVERTS][2];
- static double disStart = 0;
+ double disStart = leveltime;
UINT8 x, y;
INT32 WAVELENGTH;
INT32 AMPLITUDE;
@@ -6969,7 +5205,6 @@ void HWR_DoPostProcessor(player_t *player)
}
}
HWD.pfnPostImgRedraw(v);
- disStart += 1;
// Capture the screen again for screen waving on the intermission
if(gamestate != GS_INTERMISSION)
@@ -6980,14 +5215,11 @@ void HWR_DoPostProcessor(player_t *player)
void HWR_StartScreenWipe(void)
{
- //CONS_Debug(DBG_RENDER, "In HWR_StartScreenWipe()\n");
HWD.pfnStartScreenWipe();
}
void HWR_EndScreenWipe(void)
{
- HWRWipeCounter = 0.0f;
- //CONS_Debug(DBG_RENDER, "In HWR_EndScreenWipe()\n");
HWD.pfnEndScreenWipe();
}
@@ -7021,13 +5253,7 @@ void HWR_DoWipe(UINT8 wipenum, UINT8 scrnnum)
}
HWR_GetFadeMask(lumpnum);
-
HWD.pfnDoScreenWipe();
-
- HWRWipeCounter += 0.05f; // increase opacity of end screen
-
- if (HWRWipeCounter > 1.0f)
- HWRWipeCounter = 1.0f;
}
void HWR_MakeScreenFinalTexture(void)
@@ -7040,4 +5266,161 @@ void HWR_DrawScreenFinalTexture(int width, int height)
HWD.pfnDrawScreenFinalTexture(width, height);
}
+// jimita 18032019
+typedef struct
+{
+ char type[16];
+ INT32 id;
+} shaderxlat_t;
+
+static inline UINT16 HWR_CheckShader(UINT16 wadnum)
+{
+ UINT16 i;
+ lumpinfo_t *lump_p;
+
+ lump_p = wadfiles[wadnum]->lumpinfo;
+ for (i = 0; i < wadfiles[wadnum]->numlumps; i++, lump_p++)
+ if (memcmp(lump_p->name, "SHADERS", 7) == 0)
+ return i;
+
+ return INT16_MAX;
+}
+
+void HWR_LoadShaders(UINT16 wadnum, boolean PK3)
+{
+ UINT16 lump;
+ char *shaderdef, *line;
+ char *stoken;
+ char *value;
+ size_t size;
+ int linenum = 1;
+ int shadertype = 0;
+ int i;
+
+ #define SHADER_TYPES 7
+ shaderxlat_t shaderxlat[SHADER_TYPES] =
+ {
+ {"Flat", 1},
+ {"WallTexture", 2},
+ {"Sprite", 3},
+ {"Model", 4},
+ {"WaterRipple", 5},
+ {"Fog", 6},
+ {"Sky", 7},
+ };
+
+ lump = HWR_CheckShader(wadnum);
+ if (lump == INT16_MAX)
+ return;
+
+ shaderdef = W_CacheLumpNumPwad(wadnum, lump, PU_CACHE);
+ size = W_LumpLengthPwad(wadnum, lump);
+
+ line = Z_Malloc(size+1, PU_STATIC, NULL);
+ if (!line)
+ I_Error("HWR_LoadShaders: No more free memory\n");
+
+ M_Memcpy(line, shaderdef, size);
+ line[size] = '\0';
+
+ stoken = strtok(line, "\r\n ");
+ while (stoken)
+ {
+ if ((stoken[0] == '/' && stoken[1] == '/')
+ || (stoken[0] == '#'))// skip comments
+ {
+ stoken = strtok(NULL, "\r\n");
+ goto skip_field;
+ }
+
+ if (!stricmp(stoken, "GLSL"))
+ {
+ value = strtok(NULL, "\r\n ");
+ if (!value)
+ {
+ CONS_Alert(CONS_WARNING, "HWR_LoadShaders: Missing shader type (file %s, line %d)\n", wadfiles[wadnum]->filename, linenum);
+ stoken = strtok(NULL, "\r\n"); // skip end of line
+ goto skip_lump;
+ }
+
+ if (!stricmp(value, "VERTEX"))
+ shadertype = 1;
+ else if (!stricmp(value, "FRAGMENT"))
+ shadertype = 2;
+
+skip_lump:
+ stoken = strtok(NULL, "\r\n ");
+ linenum++;
+ }
+ else
+ {
+ value = strtok(NULL, "\r\n= ");
+ if (!value)
+ {
+ CONS_Alert(CONS_WARNING, "HWR_LoadShaders: Missing shader target (file %s, line %d)\n", wadfiles[wadnum]->filename, linenum);
+ stoken = strtok(NULL, "\r\n"); // skip end of line
+ goto skip_field;
+ }
+
+ if (!shadertype)
+ {
+ CONS_Alert(CONS_ERROR, "HWR_LoadShaders: Missing shader type (file %s, line %d)\n", wadfiles[wadnum]->filename, linenum);
+ Z_Free(line);
+ return;
+ }
+
+ for (i = 0; i < SHADER_TYPES; i++)
+ {
+ if (!stricmp(shaderxlat[i].type, stoken))
+ {
+ size_t shader_size;
+ char *shader_source;
+ char *shader_lumpname;
+ UINT16 shader_lumpnum;
+
+ if (PK3)
+ {
+ shader_lumpname = Z_Malloc(strlen(value) + 12, PU_STATIC, NULL);
+ strcpy(shader_lumpname, "Shaders/sh_");
+ strcat(shader_lumpname, value);
+ shader_lumpnum = W_CheckNumForFullNamePK3(shader_lumpname, wadnum, 0);
+ }
+ else
+ {
+ shader_lumpname = Z_Malloc(strlen(value) + 4, PU_STATIC, NULL);
+ strcpy(shader_lumpname, "SH_");
+ strcat(shader_lumpname, value);
+ shader_lumpnum = W_CheckNumForNamePwad(shader_lumpname, wadnum, 0);
+ }
+
+ if (shader_lumpnum == INT16_MAX)
+ {
+ CONS_Alert(CONS_ERROR, "HWR_LoadShaders: Missing shader source %s (file %s, line %d)\n", shader_lumpname, wadfiles[wadnum]->filename, linenum);
+ Z_Free(shader_lumpname);
+ continue;
+ }
+
+ shader_size = W_LumpLengthPwad(wadnum, shader_lumpnum);
+ shader_source = Z_Malloc(shader_size, PU_STATIC, NULL);
+ W_ReadLumpPwad(wadnum, shader_lumpnum, shader_source);
+
+ HWD.pfnLoadCustomShader(shaderxlat[i].id, shader_source, shader_size, (shadertype == 2));
+
+ Z_Free(shader_source);
+ Z_Free(shader_lumpname);
+ }
+ }
+
+skip_field:
+ stoken = strtok(NULL, "\r\n= ");
+ linenum++;
+ }
+ }
+
+ HWD.pfnInitCustomShaders();
+
+ Z_Free(line);
+ return;
+}
+
#endif // HWRENDER
diff --git a/src/hardware/hw_main.h b/src/hardware/hw_main.h
index 7bc361d9..91a95a30 100644
--- a/src/hardware/hw_main.h
+++ b/src/hardware/hw_main.h
@@ -20,6 +20,7 @@
#ifndef __HWR_MAIN_H__
#define __HWR_MAIN_H__
+#include "hw_glob.h"
#include "hw_data.h"
#include "hw_defs.h"
@@ -27,38 +28,54 @@
#include "../d_player.h"
#include "../r_defs.h"
+#define GLENCORE
+
// Startup & Shutdown the hardware mode renderer
void HWR_Startup(void);
void HWR_Shutdown(void);
-void HWR_drawAMline(const fline_t *fl, INT32 color);
-void HWR_FadeScreenMenuBack(UINT16 color, UINT8 strength);
-void HWR_DrawConsoleBack(UINT32 color, INT32 height);
-void HWR_RenderSkyboxView(INT32 viewnumber, player_t *player);
-void HWR_RenderPlayerView(INT32 viewnumber, player_t *player);
-void HWR_DrawViewBorder(INT32 clearlines);
-void HWR_DrawFlatFill(INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatlumpnum);
-UINT8 *HWR_GetScreenshot(void);
-boolean HWR_Screenshot(const char *lbmname);
-void HWR_InitTextureMapping(void);
-void HWR_SetViewSize(void);
+extern float gr_viewwidth, gr_viewheight, gr_baseviewwindowx, gr_baseviewwindowy;
+
+extern float gr_basewindowcenterx, gr_basewindowcentery;
+
+extern FTransform atransform;
+
+// hw_draw.c
void HWR_DrawPatch(GLPatch_t *gpatch, INT32 x, INT32 y, INT32 option);
void HWR_DrawFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t scale, INT32 option, const UINT8 *colormap);
-void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t scale, INT32 option, fixed_t sx, fixed_t sy, fixed_t w, fixed_t h);
-void HWR_MakePatch (const patch_t *patch, GLPatch_t *grPatch, GLMipmap_t *grMipmap, boolean makebitmap);
-void HWR_CreatePlanePolygons(INT32 bspnum);
-void HWR_CreateStaticLightmaps(INT32 bspnum);
-void HWR_PrepLevelCache(size_t pnumtextures);
+void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale, INT32 option, fixed_t sx, fixed_t sy, fixed_t w, fixed_t h);
void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color);
void HWR_DrawConsoleFill(INT32 x, INT32 y, INT32 w, INT32 h, UINT32 color, INT32 options); // Lat: separate flags from color since color needs to be an uint to work right.
void HWR_DrawDiag(INT32 x, INT32 y, INT32 wh, INT32 color);
-void HWR_DrawPic(INT32 x,INT32 y,lumpnum_t lumpnum);
+void HWR_drawAMline(const fline_t *fl, INT32 color);
+void HWR_FadeScreenMenuBack(UINT16 color, UINT8 strength);
+void HWR_DrawConsoleBack(UINT32 color, INT32 height);
+void HWR_DrawViewBorder(INT32 clearlines);
+void HWR_DrawFlatFill(INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatlumpnum);
+UINT8 *HWR_GetScreenshot(void);
+boolean HWR_Screenshot(const char *lbmname);
+
+// hw_main.c
+void HWR_RenderFrame(INT32 viewnumber, player_t *player, boolean skybox);
+void HWR_RenderPlayerView(INT32 viewnumber, player_t *player);
+void HWR_LoadShaders(UINT16 wadnum, boolean PK3);
+void HWR_SetViewSize(void);
void HWR_AddCommands(void);
-void HWR_CorrectSWTricks(void);
-void transform(float *cx, float *cy, float *cz);
+
+// My original intention was to split hw_main.c
+// into files like hw_bsp.c, hw_sprites.c...
+
+// hw_main.c: Lighting and fog
+void HWR_Lighting(FSurfaceInfo *Surface, INT32 light_level, UINT32 mixcolor, UINT32 fadecolor);
+void HWR_NoColormapLighting(FSurfaceInfo *Surface, INT32 light_level, UINT32 mixcolor, UINT32 fadecolor);
+UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color); // Let's see if this can work
+
+void HWR_FoggingOn(void);
+
FBITFIELD HWR_TranstableToAlpha(INT32 transtablenum, FSurfaceInfo *pSurf);
-INT32 HWR_GetTextureUsed(void);
+
+// hw_main.c: Post-rendering
void HWR_DoPostProcessor(player_t *player);
void HWR_StartScreenWipe(void);
void HWR_EndScreenWipe(void);
@@ -67,24 +84,60 @@ void HWR_DoWipe(UINT8 wipenum, UINT8 scrnnum);
void HWR_MakeScreenFinalTexture(void);
void HWR_DrawScreenFinalTexture(int width, int height);
-// This stuff is put here so MD2's can use them
-UINT32 HWR_Lighting(INT32 light, UINT32 color, UINT32 fadecolor, boolean fogblockpoly, boolean plane);
-FUNCMATH UINT8 LightLevelToLum(INT32 l);
+// hw_main.c: Planes
+void HWR_RenderPlane(extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, FBITFIELD PolyFlags, INT32 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector, UINT8 alpha, extracolormap_t *planecolormap);
+void HWR_AddTransparentFloor(lumpnum_t lumpnum, extrasubsector_t *xsub, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, boolean fogplane, extracolormap_t *planecolormap);
-extern CV_PossibleValue_t granisotropicmode_cons_t[];
-
-#ifdef ALAM_LIGHTING
-extern consvar_t cv_grdynamiclighting;
-extern consvar_t cv_grstaticlighting;
-extern consvar_t cv_grcoronas;
-extern consvar_t cv_grcoronasize;
+#ifdef POLYOBJECTS
+#ifdef POLYOBJECTS_PLANES
+void HWR_RenderPolyObjectPlane(polyobj_t *polysector, boolean isceiling, fixed_t fixedheight, FBITFIELD blendmode, UINT8 lightlevel, lumpnum_t lumpnum, sector_t *FOFsector, UINT8 alpha, extracolormap_t *planecolormap);
+void HWR_AddPolyObjectPlanes(void);
+void HWR_AddTransparentPolyobjectFloor(lumpnum_t lumpnum, polyobj_t *polysector, boolean isceiling, fixed_t fixedheight, INT32 lightlevel, INT32 alpha, sector_t *FOFSector, FBITFIELD blend, extracolormap_t *planecolormap);
#endif
+#endif
+
+// hw_main.c: Segs
+void HWR_ProcessSeg(void); // Sort of like GLWall::Process in GZDoom
+void HWR_RenderWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, FBITFIELD blend, boolean fogwall, INT32 lightlevel, extracolormap_t *wallcolormap);
+void HWR_ProjectWall(FOutVector *wallVerts, FSurfaceInfo *pSurf, FBITFIELD blendmode, INT32 lightlevel, extracolormap_t *wallcolormap);
+void HWR_AddTransparentWall(FOutVector *wallVerts, FSurfaceInfo * pSurf, INT32 texnum, FBITFIELD blend, boolean fogwall, INT32 lightlevel, extracolormap_t *wallcolormap);
+void HWR_SplitWall(sector_t *sector, FOutVector *wallVerts, INT32 texnum, FSurfaceInfo* Surf, INT32 cutflag, ffloor_t *pfloor);
+void HWR_DrawSkyWall(FOutVector *wallVerts, FSurfaceInfo *Surf, fixed_t bottom, fixed_t top);
+void HWR_DrawSkyBackground(void);
+
+#ifdef POLYOBJECTS
+void HWR_AddPolyObjectSegs(void);
+#endif
+
+// hw_main.c: BSP
+void HWR_RenderBSPNode(INT32 bspnum);
+void HWR_Subsector(size_t num);
+void HWR_AddLine(seg_t *line);
+boolean HWR_CheckBBox(fixed_t *bspcoord);
+void HWR_RenderDrawNodes(void);
+
+// hw_main.c: Sprites
+void HWR_AddSprites(sector_t *sec);
+void HWR_ProjectSprite(mobj_t *thing);
+void HWR_ProjectPrecipitationSprite(precipmobj_t *thing);
+void HWR_DrawSprites(void);
+
+// hw_bsp.c
+void HWR_CreatePlanePolygons(INT32 bspnum);
+
+// hw_cache.c
+void HWR_PrepLevelCache(size_t pnumtextures);
+
+// hw_trick.c
+void HWR_CorrectSWTricks(void);
+
+// Console variables
+extern consvar_t cv_grshaders;
+extern consvar_t cv_grshearing;
+extern consvar_t cv_grfov;
extern consvar_t cv_grmdls;
-extern consvar_t cv_grfallbackplayermodel;
extern consvar_t cv_grfog;
-extern consvar_t cv_grfogcolor;
extern consvar_t cv_grfogdensity;
-extern consvar_t cv_grsoftwarefog;
extern consvar_t cv_grgammared;
extern consvar_t cv_grgammagreen;
extern consvar_t cv_grgammablue;
@@ -94,22 +147,8 @@ extern consvar_t cv_grcorrecttricks;
extern consvar_t cv_grfovchange;
extern consvar_t cv_grsolvetjoin;
extern consvar_t cv_grspritebillboarding;
+extern consvar_t cv_grfallbackplayermodel;
-extern float gr_viewwidth, gr_viewheight, gr_baseviewwindowx, gr_baseviewwindowy;
-
-extern float gr_basewindowcenterx, gr_basewindowcentery;
-
-// BP: big hack for a test in lighting ref : 1249753487AB
-extern fixed_t *hwbbox;
-extern FTransform atransform;
-
-typedef struct
-{
- wallVert3D floorVerts[4];
- FSurfaceInfo Surf;
- INT32 texnum;
- INT32 blend;
- INT32 drawcount;
-} floorinfo_t;
+extern CV_PossibleValue_t granisotropicmode_cons_t[];
#endif
diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c
index d217f409..df0f3bcf 100644
--- a/src/hardware/hw_md2.c
+++ b/src/hardware/hw_md2.c
@@ -1,17 +1,12 @@
-// Emacs style mode select -*- C++ -*-
+// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
-//
+// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
+// Copyright (C) 1999-2019 by Sonic Team Junior.
//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file
/// \brief MD2 Handling
@@ -90,7 +85,6 @@ static void md2_freeModel (model_t *model)
}
#endif
-
//
// load model
//
@@ -151,7 +145,7 @@ static void PNG_warn(png_structp PNG, png_const_charp pngtext)
CONS_Debug(DBG_RENDER, "libpng warning at %p: %s", PNG, pngtext);
}
-static GrTextureFormat_t PNG_Load(const char *filename, int *w, int *h, GLPatch_t *grpatch)
+static GLTextureFormat_t PNG_Load(const char *filename, int *w, int *h, GLPatch_t *grpatch)
{
png_structp png_ptr;
png_infop png_info_ptr;
@@ -285,7 +279,7 @@ typedef struct
UINT8 filler[54];
} PcxHeader;
-static GrTextureFormat_t PCX_Load(const char *filename, int *w, int *h,
+static GLTextureFormat_t PCX_Load(const char *filename, int *w, int *h,
GLPatch_t *grpatch)
{
PcxHeader header;
@@ -544,7 +538,7 @@ void HWR_InitMD2(void)
goto md2found;
}
}
- // no sprite/player skin name found?!?
+ // no sprite/player skin name found?!?D
CONS_Printf("Unknown sprite/player skin %s detected in mdls.dat\n", name);
md2found:
// move on to next line...
@@ -579,7 +573,7 @@ void HWR_AddPlayerMD2(int skin) // For MD2's that were added after startup
}
}
- // 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)
{
if (stricmp(name, skins[skin].name) == 0)
@@ -837,35 +831,19 @@ static void HWR_GetBlendedTexture(GLPatch_t *gpatch, GLPatch_t *blendgpatch, INT
// -----------------+
// HWR_DrawMD2 : Draw MD2
-// : (monsters, bonuses, weapons, lights, ...)
+// :
// Returns :
// -----------------+
- /*
- wait/stand
- death
- pain
- walk
- shoot/fire
- die?
- atka?
- atkb?
- attacka/b/c/d?
- res?
- run?
- */
-#define NORMALFOG 0x00000000
-#define FADEFOG 0x19000000
void HWR_DrawMD2(gr_vissprite_t *spr)
{
- FSurfaceInfo Surf;
+ md2_t *md2;
char filename[64];
INT32 frame = 0;
INT32 nextFrame = -1;
FTransform p;
- md2_t *md2;
- UINT8 color[4];
+ FSurfaceInfo Surf;
if (!cv_grmdls.value)
return;
@@ -878,8 +856,8 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
if (spr->mobj->subsector)
{
sector_t *sector = spr->mobj->subsector->sector;
- UINT8 lightlevel = 255;
extracolormap_t *colormap = sector->extra_colormap;
+ UINT8 lightlevel = 255;
if (sector->numlights)
{
@@ -903,13 +881,13 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
}
if (colormap)
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, colormap->rgba, colormap->fadergba, false, false);
+ HWR_Lighting(&Surf, lightlevel, colormap->rgba, colormap->fadergba);
else
- Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, false);
+ HWR_NoColormapLighting(&Surf, lightlevel, GL_NORMALFOG, GL_FADEFOG);
}
else
{
- Surf.FlatColor.rgba = 0xFFFFFFFF;
+ Surf.PolyColor.rgba = 0xFFFFFFFF;
}
// Look at HWR_ProjectSprite for more
@@ -928,11 +906,11 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
//durs = tics;
if (spr->mobj->flags2 & MF2_SHADOW)
- Surf.FlatColor.s.alpha = 0x40;
+ Surf.PolyColor.s.alpha = 0x40;
else if (spr->mobj->frame & FF_TRANSMASK)
HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf);
else
- Surf.FlatColor.s.alpha = 0xFF;
+ Surf.PolyColor.s.alpha = 0xFF;
// dont forget to enabled the depth test because we can't do this like
// before: polygons models are not sorted
@@ -967,7 +945,6 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
return;
}
}
- //HWD.pfnSetBlend(blend); // This seems to actually break translucency?
finalscale = md2->scale;
//Hurdler: arf, I don't like that implementation at all... too much crappy
gpatch = md2->grpatch;
@@ -1103,11 +1080,6 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
}
#endif
- color[0] = Surf.FlatColor.s.red;
- color[1] = Surf.FlatColor.s.green;
- color[2] = Surf.FlatColor.s.blue;
- color[3] = Surf.FlatColor.s.alpha;
-
// SRB2CBTODO: MD2 scaling support
finalscale *= FIXED_TO_FLOAT(spr->mobj->scale);
@@ -1116,7 +1088,8 @@ void HWR_DrawMD2(gr_vissprite_t *spr)
p.mirror = atransform.mirror; // from Kart
#endif
- HWD.pfnDrawModel(md2->model, frame, durs, tics, nextFrame, &p, finalscale, flip, color);
+ HWD.pfnSetShader(4); // model shader
+ HWD.pfnDrawModel(md2->model, frame, durs, tics, nextFrame, &p, finalscale, flip, &Surf);
}
}
diff --git a/src/hardware/hw_md2.h b/src/hardware/hw_md2.h
index 57d8026b..fab8e6ad 100644
--- a/src/hardware/hw_md2.h
+++ b/src/hardware/hw_md2.h
@@ -1,18 +1,12 @@
-// Emacs style mode select -*- C++ -*-
+// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
-//
+// Copyright (C) 1993-1996 by id Software, Inc.
// Copyright (C) 1998-2000 by DooM Legacy Team.
+// Copyright (C) 1999-2019 by Sonic Team Junior.
//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file
/// \brief MD2 Handling
diff --git a/src/hardware/hw_trick.c b/src/hardware/hw_trick.c
index 97d86b94..de4a76c5 100644
--- a/src/hardware/hw_trick.c
+++ b/src/hardware/hw_trick.c
@@ -44,6 +44,7 @@
#include "../doomstat.h"
#ifdef HWRENDER
+#include "hw_main.h"
#include "hw_glob.h"
#include "hw_dll.h"
#include "../r_local.h"
diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c
index 9fcc8d15..d4b04e1f 100644
--- a/src/hardware/r_opengl/r_opengl.c
+++ b/src/hardware/r_opengl/r_opengl.c
@@ -1,18 +1,12 @@
-// Emacs style mode select -*- C++ -*-
+// SONIC ROBO BLAST 2
//-----------------------------------------------------------------------------
+// Copyright (C) 1993-1996 by id Software, Inc.
+// Copyright (C) 1998-2000 by DooM Legacy Team.
+// Copyright (C) 1999-2019 by Sonic Team Junior.
//
-// Copyright (C) 1998-2018 by Sonic Team Junior.
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
/// \file
/// \brief OpenGL API for Sonic Robo Blast 2
@@ -49,7 +43,7 @@ static const GLubyte white[4] = { 255, 255, 255, 255 };
// ==========================================================================
// With OpenGL 1.1+, the first texture should be 1
-#define NOTEXTURE_NUM 1 // small white texture
+#define NOTEXTURE_NUM 0
#define FIRST_TEX_AVAIL (NOTEXTURE_NUM + 1)
#define N_PI_DEMI (M_PIl/2.0f) //(1.5707963268f)
@@ -66,10 +60,6 @@ static float NEAR_CLIPPING_PLANE = NZCLIP_PLANE;
static GLuint NextTexAvail = FIRST_TEX_AVAIL;
static GLuint tex_downloaded = 0;
static GLfloat fov = 90.0f;
-#if 0
-static GLuint pal_col = 0;
-static FRGBAFloat const_pal_col;
-#endif
static FBITFIELD CurrentPolyFlags;
static FTextureInfo* gr_cachetail = NULL;
@@ -87,17 +77,24 @@ static GLint mag_filter = GL_LINEAR;
static GLint anisotropic_filter = 0;
static FTransform md2_transform;
+const GLubyte *gl_version = NULL;
+const GLubyte *gl_renderer = NULL;
const GLubyte *gl_extensions = NULL;
//Hurdler: 04/10/2000: added for the kick ass coronas as Boris wanted;-)
-static GLfloat modelMatrix[16];
-static GLfloat projMatrix[16];
-static GLint viewport[4];
+static GLfloat modelMatrix[16];
+static GLfloat projMatrix[16];
+static GLint viewport[4];
+
+#ifdef USE_PALETTED_TEXTURE
+ PFNGLCOLORTABLEEXTPROC glColorTableEXT = NULL;
+ GLubyte palette_tex[256*3];
+#endif
// Yay for arbitrary numbers! NextTexAvail is buggy for some reason.
// Sryder: NextTexAvail is broken for these because palette changes or changes to the texture filter or antialiasing
// flush all of the stored textures, leaving them unavailable at times such as between levels
-// These need to start at 0 and be set to their number, and be reset to 0 when deleted so that intel GPUs
+// These need to start at 0 and be set to their number, and be reset to 0 when deleted so that Intel GPUs
// can know when the textures aren't there, as textures are always considered resident in their virtual memory
// TODO: Store them in a more normal way
#define SCRTEX_SCREENTEXTURE 4294967295U
@@ -108,9 +105,6 @@ static GLuint screentexture = 0;
static GLuint startScreenWipe = 0;
static GLuint endScreenWipe = 0;
static GLuint finalScreenTexture = 0;
-#if 0
-GLuint screentexture = FIRST_TEX_AVAIL;
-#endif
// shortcut for ((float)1/i)
static const GLfloat byte2float[256] = {
@@ -148,31 +142,32 @@ static const GLfloat byte2float[256] = {
0.972549f, 0.976471f, 0.980392f, 0.984314f, 0.988235f, 0.992157f, 0.996078f, 1.000000f
};
-float byteasfloat(UINT8 fbyte)
-{
- return (float)(byte2float[fbyte]*2.0f);
-}
-
-static I_Error_t I_Error_GL = NULL;
-
// -----------------+
-// DBG_Printf : Output error messages to debug log if DEBUG_TO_FILE is defined,
+// GL_DBG_Printf : Output debug messages to debug log if DEBUG_TO_FILE is defined,
// : else do nothing
// Returns :
// -----------------+
-FUNCPRINTF void DBG_Printf(const char *lpFmt, ...)
+
+#ifdef DEBUG_TO_FILE
+FILE *gllogstream;
+#endif
+
+FUNCPRINTF void GL_DBG_Printf(const char *format, ...)
{
#ifdef DEBUG_TO_FILE
- char str[4096] = "";
+ char str[4096] = "";
va_list arglist;
- va_start (arglist, lpFmt);
- vsnprintf (str, 4096, lpFmt, arglist);
- va_end (arglist);
- if (gllogstream)
- fwrite(str, strlen(str), 1, gllogstream);
+ if (!gllogstream)
+ gllogstream = fopen("ogllog.txt", "w");
+
+ va_start(arglist, format);
+ vsnprintf(str, 4096, format, arglist);
+ va_end(arglist);
+
+ fwrite(str, strlen(str), 1, gllogstream);
#else
- (void)lpFmt;
+ (void)format;
#endif
}
@@ -190,9 +185,6 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...)
#define pglEnable glEnable
#define pglDisable glDisable
#define pglGetFloatv glGetFloatv
-//glGetIntegerv
-//glGetString
-#define pglHint glHint
/* Depth Buffer */
#define pglClearDepth glClearDepth
@@ -206,7 +198,7 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...)
#define pglPushMatrix glPushMatrix
#define pglPopMatrix glPopMatrix
#define pglLoadIdentity glLoadIdentity
-#define pglMultMatrixf glMultMatrixf
+#define pglMultMatrixd glMultMatrixd
#define pglRotatef glRotatef
#define pglScalef glScalef
#define pglTranslatef glTranslatef
@@ -231,6 +223,7 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...)
#define pglLightfv glLightfv
#define pglLightModelfv glLightModelfv
#define pglMaterialfv glMaterialfv
+#define pglMateriali glMateriali
/* Raster functions */
#define pglPixelStorei glPixelStorei
@@ -247,6 +240,7 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...)
/* 1.1 functions */
/* texture objects */ //GL_EXT_texture_object
+#define pglGenTextures glGenTextures
#define pglDeleteTextures glDeleteTextures
#define pglBindTexture glBindTexture
/* texture mapping */ //GL_EXT_copy_texture
@@ -259,7 +253,6 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...)
/* Miscellaneous */
typedef void (APIENTRY * PFNglClearColor) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
static PFNglClearColor pglClearColor;
-//glClear
typedef void (APIENTRY * PFNglColorMask) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
static PFNglColorMask pglColorMask;
typedef void (APIENTRY * PFNglAlphaFunc) (GLenum func, GLclampf ref);
@@ -278,8 +271,6 @@ typedef void (APIENTRY * PFNglDisable) (GLenum cap);
static PFNglDisable pglDisable;
typedef void (APIENTRY * PFNglGetFloatv) (GLenum pname, GLfloat *params);
static PFNglGetFloatv pglGetFloatv;
-//glGetIntegerv
-//glGetString
/* Depth Buffer */
typedef void (APIENTRY * PFNglClearDepth) (GLclampd depth);
@@ -337,7 +328,6 @@ static PFNglBufferData pglBufferData;
typedef void (APIENTRY * PFNglDeleteBuffers) (GLsizei n, const GLuint *buffers);
static PFNglDeleteBuffers pglDeleteBuffers;
-
/* Lighting */
typedef void (APIENTRY * PFNglShadeModel) (GLenum mode);
static PFNglShadeModel pglShadeModel;
@@ -347,6 +337,8 @@ typedef void (APIENTRY * PFNglLightModelfv) (GLenum pname, GLfloat *params);
static PFNglLightModelfv pglLightModelfv;
typedef void (APIENTRY * PFNglMaterialfv) (GLint face, GLenum pname, GLfloat *params);
static PFNglMaterialfv pglMaterialfv;
+typedef void (APIENTRY * PFNglMateriali) (GLint face, GLenum pname, GLint param);
+static PFNglMateriali pglMateriali;
/* Raster functions */
typedef void (APIENTRY * PFNglPixelStorei) (GLenum pname, GLint param);
@@ -370,6 +362,8 @@ static PFNglFogfv pglFogfv;
/* 1.1 functions */
/* texture objects */ //GL_EXT_texture_object
+typedef void (APIENTRY * PFNglGenTextures) (GLsizei n, const GLuint *textures);
+static PFNglGenTextures pglGenTextures;
typedef void (APIENTRY * PFNglDeleteTextures) (GLsizei n, const GLuint *textures);
static PFNglDeleteTextures pglDeleteTextures;
typedef void (APIENTRY * PFNglBindTexture) (GLenum target, GLuint texture);
@@ -421,7 +415,7 @@ boolean SetupGLfunc(void)
func = GetGLFunc(#proc); \
if (!func) \
{ \
- DBG_Printf("failed to get OpenGL function: %s", #proc); \
+ GL_DBG_Printf("failed to get OpenGL function: %s\n", #proc); \
} \
GETOPENGLFUNC(pglClearColor, glClearColor)
@@ -439,22 +433,23 @@ boolean SetupGLfunc(void)
GETOPENGLFUNC(pglGetIntegerv, glGetIntegerv)
GETOPENGLFUNC(pglGetString, glGetString)
- GETOPENGLFUNC(pglClearDepth , glClearDepth)
- GETOPENGLFUNC(pglDepthFunc , glDepthFunc)
- GETOPENGLFUNC(pglDepthMask , glDepthMask)
- GETOPENGLFUNC(pglDepthRange , glDepthRange)
+ GETOPENGLFUNC(pglClearDepth, glClearDepth)
+ GETOPENGLFUNC(pglDepthFunc, glDepthFunc)
+ GETOPENGLFUNC(pglDepthMask, glDepthMask)
+ GETOPENGLFUNC(pglDepthRange, glDepthRange)
- GETOPENGLFUNC(pglMatrixMode , glMatrixMode)
- GETOPENGLFUNC(pglViewport , glViewport)
- GETOPENGLFUNC(pglPushMatrix , glPushMatrix)
- GETOPENGLFUNC(pglPopMatrix , glPopMatrix)
- GETOPENGLFUNC(pglLoadIdentity , glLoadIdentity)
- GETOPENGLFUNC(pglMultMatrixf , glMultMatrixf)
- GETOPENGLFUNC(pglRotatef , glRotatef)
- GETOPENGLFUNC(pglScalef , glScalef)
- GETOPENGLFUNC(pglTranslatef , glTranslatef)
+ GETOPENGLFUNC(pglMatrixMode, glMatrixMode)
+ GETOPENGLFUNC(pglViewport, glViewport)
+ GETOPENGLFUNC(pglPushMatrix, glPushMatrix)
+ GETOPENGLFUNC(pglPopMatrix, glPopMatrix)
+ GETOPENGLFUNC(pglLoadIdentity, glLoadIdentity)
+ GETOPENGLFUNC(pglMultMatrixf, glMultMatrixf)
+ GETOPENGLFUNC(pglRotatef, glRotatef)
+ GETOPENGLFUNC(pglScalef, glScalef)
+ GETOPENGLFUNC(pglTranslatef, glTranslatef)
GETOPENGLFUNC(pglColor4ubv, glColor4ubv)
+
GETOPENGLFUNC(pglVertexPointer, glVertexPointer)
GETOPENGLFUNC(pglNormalPointer, glNormalPointer)
GETOPENGLFUNC(pglTexCoordPointer, glTexCoordPointer)
@@ -463,38 +458,250 @@ boolean SetupGLfunc(void)
GETOPENGLFUNC(pglEnableClientState, glEnableClientState)
GETOPENGLFUNC(pglDisableClientState, glDisableClientState)
- GETOPENGLFUNC(pglShadeModel , glShadeModel)
+ GETOPENGLFUNC(pglShadeModel, glShadeModel)
GETOPENGLFUNC(pglLightfv, glLightfv)
- GETOPENGLFUNC(pglLightModelfv , glLightModelfv)
- GETOPENGLFUNC(pglMaterialfv , glMaterialfv)
+ GETOPENGLFUNC(pglLightModelfv, glLightModelfv)
+ GETOPENGLFUNC(pglMaterialfv, glMaterialfv)
+ GETOPENGLFUNC(pglMateriali, glMateriali)
- GETOPENGLFUNC(pglPixelStorei , glPixelStorei)
- GETOPENGLFUNC(pglReadPixels , glReadPixels)
+ GETOPENGLFUNC(pglPixelStorei, glPixelStorei)
+ GETOPENGLFUNC(pglReadPixels, glReadPixels)
- GETOPENGLFUNC(pglTexEnvi , glTexEnvi)
- GETOPENGLFUNC(pglTexParameteri , glTexParameteri)
- GETOPENGLFUNC(pglTexImage2D , glTexImage2D)
+ GETOPENGLFUNC(pglTexEnvi, glTexEnvi)
+ GETOPENGLFUNC(pglTexParameteri, glTexParameteri)
+ GETOPENGLFUNC(pglTexImage2D, glTexImage2D)
- GETOPENGLFUNC(pglFogf , glFogf)
- GETOPENGLFUNC(pglFogfv , glFogfv)
+ GETOPENGLFUNC(pglFogf, glFogf)
+ GETOPENGLFUNC(pglFogfv, glFogfv)
- GETOPENGLFUNC(pglDeleteTextures , glDeleteTextures)
- GETOPENGLFUNC(pglBindTexture , glBindTexture)
+ GETOPENGLFUNC(pglGenTextures, glGenTextures)
+ GETOPENGLFUNC(pglDeleteTextures, glDeleteTextures)
+ GETOPENGLFUNC(pglBindTexture, glBindTexture)
- GETOPENGLFUNC(pglCopyTexImage2D , glCopyTexImage2D)
- GETOPENGLFUNC(pglCopyTexSubImage2D , glCopyTexSubImage2D)
+ GETOPENGLFUNC(pglCopyTexImage2D, glCopyTexImage2D)
+ GETOPENGLFUNC(pglCopyTexSubImage2D, glCopyTexSubImage2D)
#undef GETOPENGLFUNC
-
- pgluBuild2DMipmaps = GetGLFunc("gluBuild2DMipmaps");
-
#endif
return true;
}
-// This has to be done after the context is created so the version number can be obtained
-// This is stupid -- even some of the oldest usable OpenGL hardware today supports 1.3-level featureset.
-boolean SetupGLFunc13(void)
+static INT32 glstate_fog_mode = 0;
+static float glstate_fog_density = 0;
+
+INT32 gl_leveltime = 0;
+
+#ifdef GL_SHADERS
+typedef GLuint (APIENTRY *PFNglCreateShader) (GLenum);
+typedef void (APIENTRY *PFNglShaderSource) (GLuint, GLsizei, const GLchar**, GLint*);
+typedef void (APIENTRY *PFNglCompileShader) (GLuint);
+typedef void (APIENTRY *PFNglGetShaderiv) (GLuint, GLenum, GLint*);
+typedef void (APIENTRY *PFNglGetShaderInfoLog) (GLuint, GLsizei, GLsizei*, GLchar*);
+typedef void (APIENTRY *PFNglDeleteShader) (GLuint);
+typedef GLuint (APIENTRY *PFNglCreateProgram) (void);
+typedef void (APIENTRY *PFNglAttachShader) (GLuint, GLuint);
+typedef void (APIENTRY *PFNglLinkProgram) (GLuint);
+typedef void (APIENTRY *PFNglGetProgramiv) (GLuint, GLenum, GLint*);
+typedef void (APIENTRY *PFNglUseProgram) (GLuint);
+typedef void (APIENTRY *PFNglUniform1i) (GLint, GLint);
+typedef void (APIENTRY *PFNglUniform1f) (GLint, GLfloat);
+typedef void (APIENTRY *PFNglUniform2f) (GLint, GLfloat, GLfloat);
+typedef void (APIENTRY *PFNglUniform3f) (GLint, GLfloat, GLfloat, GLfloat);
+typedef void (APIENTRY *PFNglUniform4f) (GLint, GLfloat, GLfloat, GLfloat, GLfloat);
+typedef void (APIENTRY *PFNglUniform1fv) (GLint, GLsizei, const GLfloat*);
+typedef void (APIENTRY *PFNglUniform2fv) (GLint, GLsizei, const GLfloat*);
+typedef void (APIENTRY *PFNglUniform3fv) (GLint, GLsizei, const GLfloat*);
+typedef GLint (APIENTRY *PFNglGetUniformLocation) (GLuint, const GLchar*);
+
+static PFNglCreateShader pglCreateShader;
+static PFNglShaderSource pglShaderSource;
+static PFNglCompileShader pglCompileShader;
+static PFNglGetShaderiv pglGetShaderiv;
+static PFNglGetShaderInfoLog pglGetShaderInfoLog;
+static PFNglDeleteShader pglDeleteShader;
+static PFNglCreateProgram pglCreateProgram;
+static PFNglAttachShader pglAttachShader;
+static PFNglLinkProgram pglLinkProgram;
+static PFNglGetProgramiv pglGetProgramiv;
+static PFNglUseProgram pglUseProgram;
+static PFNglUniform1i pglUniform1i;
+static PFNglUniform1f pglUniform1f;
+static PFNglUniform2f pglUniform2f;
+static PFNglUniform3f pglUniform3f;
+static PFNglUniform4f pglUniform4f;
+static PFNglUniform1fv pglUniform1fv;
+static PFNglUniform2fv pglUniform2fv;
+static PFNglUniform3fv pglUniform3fv;
+static PFNglGetUniformLocation pglGetUniformLocation;
+
+#define MAXSHADERS 16
+#define MAXSHADERPROGRAMS 16
+
+// 18032019
+static char *gl_customvertexshaders[MAXSHADERS];
+static char *gl_customfragmentshaders[MAXSHADERS];
+
+static boolean gl_allowshaders = false;
+static boolean gl_shadersenabled = false;
+static GLuint gl_currentshaderprogram = 0;
+
+// 13062019
+typedef enum
+{
+ // lighting
+ gluniform_mix_color,
+ gluniform_fade_color,
+ gluniform_lighting,
+
+ // fog
+ gluniform_fog_mode,
+ gluniform_fog_density,
+
+ // misc. (custom shaders)
+ gluniform_leveltime,
+
+ gluniform_max,
+} gluniform_t;
+
+typedef struct gl_shaderprogram_s
+{
+ GLuint program;
+ boolean custom;
+ GLint uniforms[gluniform_max+1];
+} gl_shaderprogram_t;
+static gl_shaderprogram_t gl_shaderprograms[MAXSHADERPROGRAMS];
+
+// ========================
+// Fragment shader macros
+// ========================
+
+//
+// GLSL Software fragment shader
+//
+
+#define GLSL_INTERNAL_FOG_FUNCTION \
+ "float fog(const float dist, const float density, const float globaldensity) {\n" \
+ "const float LOG2 = -1.442695;\n" \
+ "float d = density * dist;\n" \
+ "return 1.0 - clamp(exp2(d * sqrt(d) * globaldensity * LOG2), 0.0, 1.0);\n" \
+ "}\n"
+
+// https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_gpu_shader_fp64.txt
+#define GLSL_INTERNAL_FOG_MIX \
+ "float fog_distance = gl_FragCoord.z / gl_FragCoord.w;\n" \
+ "float fog_attenuation = floor(fog(fog_distance, 0.0001 * ((256.0-lighting)/24.0), fog_density)*10.0)/10.0;\n" \
+ "vec4 fog_color = vec4(fade_color[0], fade_color[1], fade_color[2], 1.0);\n" \
+ "vec4 mixed_color = texel * mix_color;\n" \
+ "vec4 fog_mix = mix(mixed_color, fog_color, fog_attenuation);\n" \
+ "vec4 final_color = mix(fog_mix, fog_color, ((256.0-lighting)/256.0));\n" \
+ "final_color[3] = mixed_color[3];\n"
+
+#define GLSL_SOFTWARE_FRAGMENT_SHADER \
+ "uniform sampler2D tex;\n" \
+ "uniform vec4 mix_color;\n" \
+ "uniform vec4 fade_color;\n" \
+ "uniform float lighting;\n" \
+ "uniform int fog_mode;\n" \
+ "uniform float fog_density;\n" \
+ GLSL_INTERNAL_FOG_FUNCTION \
+ "void main(void) {\n" \
+ "vec4 texel = texture2D(tex, gl_TexCoord[0].st);\n" \
+ GLSL_INTERNAL_FOG_MIX \
+ "gl_FragColor = final_color;\n" \
+ "}\0"
+
+//
+// GLSL generic fragment shader
+//
+
+#define GLSL_DEFAULT_FRAGMENT_SHADER \
+ "uniform sampler2D tex;\n" \
+ "uniform vec4 mix_color;\n" \
+ "void main(void) {\n" \
+ "gl_FragColor = texture2D(tex, gl_TexCoord[0].st) * mix_color;\n" \
+ "}\0"
+
+static const char *fragment_shaders[] = {
+ // Default fragment shader
+ GLSL_DEFAULT_FRAGMENT_SHADER,
+
+ // Floor fragment shader
+ GLSL_SOFTWARE_FRAGMENT_SHADER,
+
+ // Wall fragment shader
+ GLSL_SOFTWARE_FRAGMENT_SHADER,
+
+ // Sprite fragment shader
+ GLSL_SOFTWARE_FRAGMENT_SHADER,
+
+ // Model fragment shader
+ GLSL_SOFTWARE_FRAGMENT_SHADER,
+
+ // Water fragment shader
+ GLSL_SOFTWARE_FRAGMENT_SHADER,
+
+ // Fog fragment shader
+ "void main(void) {\n"
+ "gl_FragColor = gl_Color;\n"
+ "}\0",
+
+ // Sky fragment shader
+ "uniform sampler2D tex;\n"
+ "void main(void) {\n"
+ "gl_FragColor = texture2D(tex, gl_TexCoord[0].st);\n" \
+ "}\0",
+
+ NULL,
+};
+
+// ======================
+// Vertex shader macros
+// ======================
+
+//
+// GLSL generic vertex shader
+//
+
+#define GLSL_DEFAULT_VERTEX_SHADER \
+ "void main()\n" \
+ "{\n" \
+ "gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;\n" \
+ "gl_FrontColor = gl_Color;\n" \
+ "gl_TexCoord[0].xy = gl_MultiTexCoord0.xy;\n" \
+ "gl_ClipVertex = gl_ModelViewMatrix*gl_Vertex;\n" \
+ "}\0"
+
+static const char *vertex_shaders[] = {
+ // Default vertex shader
+ GLSL_DEFAULT_VERTEX_SHADER,
+
+ // Floor vertex shader
+ GLSL_DEFAULT_VERTEX_SHADER,
+
+ // Wall vertex shader
+ GLSL_DEFAULT_VERTEX_SHADER,
+
+ // Sprite vertex shader
+ GLSL_DEFAULT_VERTEX_SHADER,
+
+ // Model vertex shader
+ GLSL_DEFAULT_VERTEX_SHADER,
+
+ // Water vertex shader
+ GLSL_DEFAULT_VERTEX_SHADER,
+
+ // Fog vertex shader
+ GLSL_DEFAULT_VERTEX_SHADER,
+
+ // Sky vertex shader
+ GLSL_DEFAULT_VERTEX_SHADER,
+
+ NULL,
+};
+
+#endif // GL_SHADERS
+
+void SetupGLFunc4(void)
{
pglActiveTexture = GetGLFunc("glActiveTexture");
pglMultiTexCoord2f = GetGLFunc("glMultiTexCoord2f");
@@ -505,7 +712,200 @@ boolean SetupGLFunc13(void)
pglBufferData = GetGLFunc("glBufferData");
pglDeleteBuffers = GetGLFunc("glDeleteBuffers");
- return true;
+#ifdef GL_SHADERS
+ pglCreateShader = GetGLFunc("glCreateShader");
+ pglShaderSource = GetGLFunc("glShaderSource");
+ pglCompileShader = GetGLFunc("glCompileShader");
+ pglGetShaderiv = GetGLFunc("glGetShaderiv");
+ pglGetShaderInfoLog = GetGLFunc("glGetShaderInfoLog");
+ pglDeleteShader = GetGLFunc("glDeleteShader");
+ pglCreateProgram = GetGLFunc("glCreateProgram");
+ pglAttachShader = GetGLFunc("glAttachShader");
+ pglLinkProgram = GetGLFunc("glLinkProgram");
+ pglGetProgramiv = GetGLFunc("glGetProgramiv");
+ pglUseProgram = GetGLFunc("glUseProgram");
+ pglUniform1i = GetGLFunc("glUniform1i");
+ pglUniform1f = GetGLFunc("glUniform1f");
+ pglUniform2f = GetGLFunc("glUniform2f");
+ pglUniform3f = GetGLFunc("glUniform3f");
+ pglUniform4f = GetGLFunc("glUniform4f");
+ pglUniform1fv = GetGLFunc("glUniform1fv");
+ pglUniform2fv = GetGLFunc("glUniform2fv");
+ pglUniform3fv = GetGLFunc("glUniform3fv");
+ pglGetUniformLocation = GetGLFunc("glGetUniformLocation");
+#endif
+
+ // GLU
+ pgluBuild2DMipmaps = GetGLFunc("gluBuild2DMipmaps");
+}
+
+// jimita
+EXPORT void HWRAPI(LoadShaders) (void)
+{
+#ifdef GL_SHADERS
+ GLuint gl_vertShader, gl_fragShader;
+ GLint i, result;
+
+ gl_customvertexshaders[0] = NULL;
+ gl_customfragmentshaders[0] = NULL;
+
+ for (i = 0; vertex_shaders[i] && fragment_shaders[i]; i++)
+ {
+ gl_shaderprogram_t *shader;
+ const GLchar* vert_shader = vertex_shaders[i];
+ const GLchar* frag_shader = fragment_shaders[i];
+ boolean custom = ((gl_customvertexshaders[i] || gl_customfragmentshaders[i]) && (i > 0));
+
+ // 18032019
+ if (gl_customvertexshaders[i])
+ vert_shader = gl_customvertexshaders[i];
+ if (gl_customfragmentshaders[i])
+ frag_shader = gl_customfragmentshaders[i];
+
+ if (i >= MAXSHADERS)
+ break;
+ if (i >= MAXSHADERPROGRAMS)
+ break;
+
+ //
+ // Load and compile vertex shader
+ //
+ gl_vertShader = pglCreateShader(GL_VERTEX_SHADER);
+ if (!gl_vertShader)
+ I_Error("Hardware driver: Error creating vertex shader %d", i);
+
+ pglShaderSource(gl_vertShader, 1, &vert_shader, NULL);
+ pglCompileShader(gl_vertShader);
+
+ // check for compile errors
+ pglGetShaderiv(gl_vertShader, GL_COMPILE_STATUS, &result);
+ if (result == GL_FALSE)
+ {
+ GLchar* infoLog;
+ GLint logLength;
+
+ pglGetShaderiv(gl_vertShader, GL_INFO_LOG_LENGTH, &logLength);
+
+ infoLog = malloc(logLength);
+ pglGetShaderInfoLog(gl_vertShader, logLength, NULL, infoLog);
+
+ I_Error("Hardware driver: Error compiling vertex shader %d\n%s", i, infoLog);
+ }
+
+ //
+ // Load and compile fragment shader
+ //
+ gl_fragShader = pglCreateShader(GL_FRAGMENT_SHADER);
+ if (!gl_fragShader)
+ I_Error("Hardware driver: Error creating fragment shader %d", i);
+
+ pglShaderSource(gl_fragShader, 1, &frag_shader, NULL);
+ pglCompileShader(gl_fragShader);
+
+ // check for compile errors
+ pglGetShaderiv(gl_fragShader, GL_COMPILE_STATUS, &result);
+ if (result == GL_FALSE)
+ {
+ GLchar* infoLog;
+ GLint logLength;
+
+ pglGetShaderiv(gl_fragShader, GL_INFO_LOG_LENGTH, &logLength);
+
+ infoLog = malloc(logLength);
+ pglGetShaderInfoLog(gl_fragShader, logLength, NULL, infoLog);
+
+ I_Error("Hardware driver: Error compiling fragment shader %d\n%s", i, infoLog);
+ }
+
+ shader = &gl_shaderprograms[i];
+ shader->program = pglCreateProgram();
+ shader->custom = custom;
+ pglAttachShader(shader->program, gl_vertShader);
+ pglAttachShader(shader->program, gl_fragShader);
+ pglLinkProgram(shader->program);
+
+ // check link status
+ pglGetProgramiv(shader->program, GL_LINK_STATUS, &result);
+ if (result != GL_TRUE)
+ I_Error("Hardware driver: Error linking shader program %d", i);
+
+ // delete the shader objects
+ pglDeleteShader(gl_vertShader);
+ pglDeleteShader(gl_fragShader);
+
+ // 13062019
+#define GETUNI(uniform) pglGetUniformLocation(shader->program, uniform);
+
+ // lighting
+ shader->uniforms[gluniform_mix_color] = GETUNI("mix_color");
+ shader->uniforms[gluniform_fade_color] = GETUNI("fade_color");
+ shader->uniforms[gluniform_lighting] = GETUNI("lighting");
+
+ // fog
+ shader->uniforms[gluniform_fog_mode] = GETUNI("fog_mode");
+ shader->uniforms[gluniform_fog_density] = GETUNI("fog_density");
+
+ // misc. (custom shaders)
+ shader->uniforms[gluniform_leveltime] = GETUNI("leveltime");
+
+#undef GETUNI
+ }
+#endif
+}
+
+EXPORT void HWRAPI(LoadCustomShader) (int number, char *shader, size_t size, boolean fragment)
+{
+#ifdef GL_SHADERS
+ if (number < 1 || number > MAXSHADERS)
+ I_Error("LoadCustomShader(): cannot load shader %d (max %d)", number, MAXSHADERS);
+
+ if (fragment)
+ {
+ gl_customfragmentshaders[number] = malloc(size+1);
+ strncpy(gl_customfragmentshaders[number], shader, size);
+ gl_customfragmentshaders[number][size] = 0;
+ }
+ else
+ {
+ gl_customvertexshaders[number] = malloc(size+1);
+ strncpy(gl_customvertexshaders[number], shader, size);
+ gl_customvertexshaders[number][size] = 0;
+ }
+#endif
+}
+
+EXPORT void HWRAPI(InitCustomShaders) (void)
+{
+#ifdef GL_SHADERS
+ KillShaders();
+ LoadShaders();
+#endif
+}
+
+EXPORT void HWRAPI(SetShader) (int shader)
+{
+#ifdef GL_SHADERS
+ if (gl_allowshaders)
+ {
+ gl_shadersenabled = true;
+ gl_currentshaderprogram = shader;
+ }
+ else
+#endif
+ gl_shadersenabled = false;
+}
+
+EXPORT void HWRAPI(UnSetShader) (void)
+{
+#ifdef GL_SHADERS
+ gl_shadersenabled = false;
+ gl_currentshaderprogram = 0;
+#endif
+}
+
+EXPORT void HWRAPI(KillShaders) (void)
+{
+ // unused.........................
}
// -----------------+
@@ -513,7 +913,7 @@ boolean SetupGLFunc13(void)
// -----------------+
static void SetNoTexture(void)
{
- // Set small white texture.
+ // Disable texture.
if (tex_downloaded != NOTEXTURE_NUM)
{
pglBindTexture(GL_TEXTURE_2D, NOTEXTURE_NUM);
@@ -533,7 +933,7 @@ static void GLPerspective(GLfloat fovy, GLfloat aspect)
const GLfloat zNear = NEAR_CLIPPING_PLANE;
const GLfloat zFar = FAR_CLIPPING_PLANE;
const GLfloat radians = (GLfloat)(fovy / 2.0f * M_PIl / 180.0f);
- const GLfloat sine = sinf(radians);
+ const GLfloat sine = sin(radians);
const GLfloat deltaZ = zFar - zNear;
GLfloat cotangent;
@@ -547,56 +947,15 @@ static void GLPerspective(GLfloat fovy, GLfloat aspect)
m[1][1] = cotangent;
m[2][2] = -(zFar + zNear) / deltaZ;
m[3][2] = -2.0f * zNear * zFar / deltaZ;
-
pglMultMatrixf(&m[0][0]);
}
-static void GLProject(GLfloat objX, GLfloat objY, GLfloat objZ,
- GLfloat* winX, GLfloat* winY, GLfloat* winZ)
-{
- GLfloat in[4], out[4];
- int i;
-
- for (i=0; i<4; i++)
- {
- out[i] =
- objX * modelMatrix[0*4+i] +
- objY * modelMatrix[1*4+i] +
- objZ * modelMatrix[2*4+i] +
- modelMatrix[3*4+i];
- }
- for (i=0; i<4; i++)
- {
- in[i] =
- out[0] * projMatrix[0*4+i] +
- out[1] * projMatrix[1*4+i] +
- out[2] * projMatrix[2*4+i] +
- out[3] * projMatrix[3*4+i];
- }
- if (fpclassify(in[3]) == FP_ZERO) return;
- in[0] /= in[3];
- in[1] /= in[3];
- in[2] /= in[3];
- /* Map x, y and z to range 0-1 */
- in[0] = in[0] * 0.5f + 0.5f;
- in[1] = in[1] * 0.5f + 0.5f;
- in[2] = in[2] * 0.5f + 0.5f;
-
- /* Map x,y to viewport */
- in[0] = in[0] * viewport[2] + viewport[0];
- in[1] = in[1] * viewport[3] + viewport[1];
-
- *winX=in[0];
- *winY=in[1];
- *winZ=in[2];
-}
-
// -----------------+
// SetModelView :
// -----------------+
void SetModelView(GLint w, GLint h)
{
-// DBG_Printf("SetModelView(): %dx%d\n", (int)w, (int)h);
+ //GL_DBG_Printf("SetModelView(): %dx%d\n", (int)w, (int)h);
// The screen textures need to be flushed if the width or height change so that they be remade for the correct size
if (screen_width != w || screen_height != h)
@@ -617,128 +976,64 @@ void SetModelView(GLint w, GLint h)
pglLoadIdentity();
GLPerspective(fov, ASPECT_RATIO);
- //pglScalef(1.0f, 320.0f/200.0f, 1.0f); // gr_scalefrustum (ORIGINAL_ASPECT)
// added for new coronas' code (without depth buffer)
pglGetIntegerv(GL_VIEWPORT, viewport);
pglGetFloatv(GL_PROJECTION_MATRIX, projMatrix);
}
-
// -----------------+
// SetStates : Set permanent states
// -----------------+
void SetStates(void)
{
- // Bind little white RGBA texture to ID NOTEXTURE_NUM.
- /*
- FUINT Data[8*8];
- INT32 i;
- */
-#ifdef GL_LIGHT_MODEL_AMBIENT
- GLfloat LightDiffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
-#endif
-
-// DBG_Printf("SetStates()\n");
-
- // Hurdler: not necessary, is it?
- pglShadeModel(GL_SMOOTH); // iterate vertice colors
- //pglShadeModel(GL_FLAT);
-
pglEnable(GL_TEXTURE_2D); // two-dimensional texturing
-
pglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
pglAlphaFunc(GL_NOTEQUAL, 0.0f);
-
- //pglBlendFunc(GL_ONE, GL_ZERO); // copy pixel to frame buffer (opaque)
pglEnable(GL_BLEND); // enable color blending
pglColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
- //pglDisable(GL_DITHER); // faB: ??? (undocumented in OpenGL 1.1)
- // Hurdler: yes, it is!
pglEnable(GL_DEPTH_TEST); // check the depth buffer
pglDepthMask(GL_TRUE); // enable writing to depth buffer
pglClearDepth(1.0f);
pglDepthRange(0.0f, 1.0f);
pglDepthFunc(GL_LEQUAL);
- // this set CurrentPolyFlags to the acctual configuration
+ // this set CurrentPolyFlags to the actual configuration
CurrentPolyFlags = 0xffffffff;
SetBlend(0);
- /*
- for (i = 0; i < 64; i++)
- Data[i] = 0xffFFffFF; // white pixel
- */
-
tex_downloaded = (GLuint)-1;
SetNoTexture();
- //pglBindTexture(GL_TEXTURE_2D, NOTEXTURE_NUM);
- //tex_downloaded = NOTEXTURE_NUM;
- //pglTexImage2D(GL_TEXTURE_2D, 0, 4, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, Data);
pglPolygonOffset(-1.0f, -1.0f);
- //pglEnable(GL_CULL_FACE);
- //pglCullFace(GL_FRONT);
-
- //glFogi(GL_FOG_MODE, GL_EXP);
- //pglHint(GL_FOG_HINT, GL_FASTEST);
- //pglFogfv(GL_FOG_COLOR, fogcolor);
- //pglFogf(GL_FOG_DENSITY, 0.0005f);
-
- // Lighting for models
-#ifdef GL_LIGHT_MODEL_AMBIENT
- pglLightModelfv(GL_LIGHT_MODEL_AMBIENT, LightDiffuse);
- pglEnable(GL_LIGHT0);
-#endif
-
// bp : when no t&l :)
pglLoadIdentity();
pglScalef(1.0f, 1.0f, -1.0f);
pglGetFloatv(GL_MODELVIEW_MATRIX, modelMatrix); // added for new coronas' code (without depth buffer)
}
-
// -----------------+
// Flush : flush OpenGL textures
// : Clear list of downloaded mipmaps
// -----------------+
void Flush(void)
{
- //DBG_Printf ("HWR_Flush()\n");
+ //GL_DBG_Printf("HWR_Flush()\n");
while (gr_cachehead)
{
// ceci n'est pas du tout necessaire vu que tu les a charger normalement et
// donc il sont dans ta liste !
-#if 0
- //Hurdler: 25/04/2000: now support colormap in hardware mode
- FTextureInfo *tmp = gr_cachehead->nextskin;
-
- // The memory should be freed in the main code
- while (tmp)
- {
- pglDeleteTextures(1, &tmp->downloaded);
- tmp->downloaded = 0;
- tmp = tmp->nextcolormap;
- }
-#endif
pglDeleteTextures(1, (GLuint *)&gr_cachehead->downloaded);
gr_cachehead->downloaded = 0;
gr_cachehead = gr_cachehead->nextmipmap;
}
gr_cachetail = gr_cachehead = NULL; //Hurdler: well, gr_cachehead is already NULL
NextTexAvail = FIRST_TEX_AVAIL;
-#if 0
- if (screentexture != FIRST_TEX_AVAIL)
- {
- pglDeleteTextures(1, &screentexture);
- screentexture = FIRST_TEX_AVAIL;
- }
-#endif
tex_downloaded = 0;
}
@@ -776,10 +1071,8 @@ INT32 isExtAvailable(const char *extension, const GLubyte *start)
// Init : Initialise the OpenGL interface API
// Returns :
// -----------------+
-EXPORT boolean HWRAPI(Init) (I_Error_t FatalErrorFunction)
+EXPORT boolean HWRAPI(Init) (void)
{
- I_Error_GL = FatalErrorFunction;
- DBG_Printf ("%s %s\n", DRIVER_STRING, VERSIONSTRING);
return LoadGL();
}
@@ -789,7 +1082,6 @@ EXPORT boolean HWRAPI(Init) (I_Error_t FatalErrorFunction)
// -----------------+
EXPORT void HWRAPI(ClearMipMapCache) (void)
{
- // DBG_Printf ("HWR_Flush(exe)\n");
Flush();
}
@@ -803,7 +1095,7 @@ EXPORT void HWRAPI(ReadRect) (INT32 x, INT32 y, INT32 width, INT32 height,
INT32 dst_stride, UINT16 * dst_data)
{
INT32 i;
- // DBG_Printf ("ReadRect()\n");
+ //GL_DBG_Printf("ReadRect()\n");
if (dst_stride == width*3)
{
GLubyte*top = (GLvoid*)dst_data, *bottom = top + dst_stride * (height - 1);
@@ -851,7 +1143,7 @@ EXPORT void HWRAPI(ReadRect) (INT32 x, INT32 y, INT32 width, INT32 height,
// -----------------+
EXPORT void HWRAPI(GClipRect) (INT32 minx, INT32 miny, INT32 maxx, INT32 maxy, float nearclip)
{
- // DBG_Printf ("GClipRect(%d, %d, %d, %d)\n", minx, miny, maxx, maxy);
+ //GL_DBG_Printf("GClipRect(%d, %d, %d, %d)\n", minx, miny, maxx, maxy);
pglViewport(minx, screen_height-maxy, maxx-minx, maxy-miny);
NEAR_CLIPPING_PLANE = nearclip;
@@ -875,7 +1167,7 @@ EXPORT void HWRAPI(ClearBuffer) (FBOOLEAN ColorMask,
FBOOLEAN DepthMask,
FRGBAFloat * ClearColor)
{
- // DBG_Printf ("ClearBuffer(%d)\n", alpha);
+ //GL_DBG_Printf("ClearBuffer(%d)\n", alpha);
GLbitfield ClearMask = 0;
if (ColorMask)
@@ -910,7 +1202,7 @@ EXPORT void HWRAPI(Draw2DLine) (F2DCoord * v1,
F2DCoord * v2,
RGBA_t Color)
{
- // DBG_Printf ("DrawLine() (%f %f %f) %d\n", v1->x, -v1->y, -v1->z, v1->argb);
+ //GL_DBG_Printf("DrawLine(): %f %f, %f %f\n", v1->x, v1->y, v2->x, v2->y);
GLfloat p[12];
GLfloat dx, dy;
GLfloat angle;
@@ -1002,7 +1294,6 @@ EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags)
break;
}
}
-
if (Xor & PF_NoAlphaTest)
{
if (PolyFlags & PF_NoAlphaTest)
@@ -1018,7 +1309,6 @@ EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags)
else
pglDisable(GL_POLYGON_OFFSET_FILL);
}
-
if (Xor&PF_NoDepthTest)
{
if (PolyFlags & PF_NoDepthTest)
@@ -1055,22 +1345,19 @@ EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags)
}
else
#endif
+
+ // mix texture colour with Surface->PolyColor
if (PolyFlags & PF_Modulated)
- { // mix texture colour with Surface->FlatColor
pglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- }
+ // colour from texture is unchanged before blending
else
- { // colour from texture is unchanged before blending
pglTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- }
}
if (Xor & PF_Occlude) // depth test but (no) depth write
{
if (PolyFlags&PF_Occlude)
- {
pglDepthMask(1);
- }
else
pglDepthMask(0);
}
@@ -1088,9 +1375,7 @@ EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags)
}
}
if (PolyFlags & PF_NoTexture)
- {
SetNoTexture();
- }
}
CurrentPolyFlags = PolyFlags;
}
@@ -1121,11 +1406,22 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo)
const GLvoid *ptex = tex;
INT32 w, h;
- //DBG_Printf ("DownloadMipmap %d %x\n",NextTexAvail,pTexInfo->grInfo.data);
+ //GL_DBG_Printf("DownloadMipmap %d\n", NextTexAvail, pTexInfo->grInfo.data);
w = pTexInfo->width;
h = pTexInfo->height;
+#ifdef USE_PALETTED_TEXTURE
+ if (glColorTableEXT &&
+ (pTexInfo->grInfo.format == GR_TEXFMT_P_8) &&
+ !(pTexInfo->flags & TF_CHROMAKEYED))
+ {
+ // do nothing here.
+ // Not a problem with MiniGL since we don't use paletted texture
+ }
+ else
+#endif
+
if ((pTexInfo->grInfo.format == GR_TEXFMT_P_8) ||
(pTexInfo->grInfo.format == GR_TEXFMT_AP_88))
{
@@ -1207,7 +1503,7 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo)
}
}
else
- DBG_Printf ("SetTexture(bad format) %ld\n", pTexInfo->grInfo.format);
+ GL_DBG_Printf("SetTexture(bad format) %ld\n", pTexInfo->grInfo.format);
pTexInfo->downloaded = NextTexAvail++;
tex_downloaded = pTexInfo->downloaded;
@@ -1225,6 +1521,17 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo)
pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter);
}
+#ifdef USE_PALETTED_TEXTURE
+ //Hurdler: not really supported and not tested recently
+ if (glColorTableEXT &&
+ (pTexInfo->grInfo.format == GR_TEXFMT_P_8) &&
+ !(pTexInfo->flags & TF_CHROMAKEYED))
+ {
+ glColorTableEXT(GL_TEXTURE_2D, GL_RGB8, 256, GL_RGB, GL_UNSIGNED_BYTE, palette_tex);
+ pglTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, w, h, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, pTexInfo->grInfo.data);
+ }
+ else
+#endif
if (pTexInfo->grInfo.format == GR_TEXFMT_ALPHA_INTENSITY_88)
{
//pglTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, ptex);
@@ -1309,90 +1616,124 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo)
}
}
+static void load_shaders(FSurfaceInfo *Surface, GLRGBAFloat *mix, GLRGBAFloat *fade)
+{
+#ifdef GL_SHADERS
+ if (gl_shadersenabled)
+ {
+ gl_shaderprogram_t *shader = &gl_shaderprograms[gl_currentshaderprogram];
+ if (shader->program)
+ {
+ boolean custom = (gl_shaderprograms[gl_currentshaderprogram].custom);
+ // 13062019
+ // Check for fog
+ //if (changed)
+ {
+ if (!custom)
+ {
+ if (glstate_fog_mode == 0) // disabled
+ {
+ // Nevermind!
+ pglUseProgram(0);
+ return;
+ }
+ else // enabled
+ pglUseProgram(gl_shaderprograms[gl_currentshaderprogram].program);
+ }
+ else // always load custom shaders
+ pglUseProgram(gl_shaderprograms[gl_currentshaderprogram].program);
+ }
+
+ // set uniforms
+ {
+ #define UNIFORM_1(uniform, a, function) \
+ if (uniform != -1) \
+ function (uniform, a);
+
+ #define UNIFORM_2(uniform, a, b, function) \
+ if (uniform != -1) \
+ function (uniform, a, b);
+
+ #define UNIFORM_3(uniform, a, b, c, function) \
+ if (uniform != -1) \
+ function (uniform, a, b, c);
+
+ #define UNIFORM_4(uniform, a, b, c, d, function) \
+ if (uniform != -1) \
+ function (uniform, a, b, c, d);
+
+ // polygon
+ UNIFORM_4(shader->uniforms[gluniform_mix_color], mix->red, mix->green, mix->blue, mix->alpha, pglUniform4f);
+
+ // 13062019
+ // Check for fog
+ if (glstate_fog_mode == 1)
+ {
+ // glstate
+ UNIFORM_1(shader->uniforms[gluniform_fog_density], glstate_fog_density, pglUniform1f);
+
+ // polygon
+ UNIFORM_4(shader->uniforms[gluniform_fade_color], fade->red, fade->green, fade->blue, fade->alpha, pglUniform4f);
+ UNIFORM_1(shader->uniforms[gluniform_lighting], Surface->LightInfo.light_level, pglUniform1f);
+
+ // Custom shader uniforms
+ if (custom)
+ {
+ UNIFORM_1(shader->uniforms[gluniform_fog_mode], glstate_fog_mode, pglUniform1i);
+ UNIFORM_1(shader->uniforms[gluniform_leveltime], (float)gl_leveltime, pglUniform1f);
+ }
+ }
+
+ #undef UNIFORM_1
+ #undef UNIFORM_2
+ #undef UNIFORM_3
+ #undef UNIFORM_4
+ }
+ }
+ else
+ pglUseProgram(0);
+ }
+ else
+#endif
+ pglUseProgram(0);
+}
// -----------------+
// DrawPolygon : Render a polygon, set the texture, set render mode
// -----------------+
-EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf,
- //FTextureInfo *pTexInfo,
- FOutVector *pOutVerts,
- FUINT iNumPts,
- FBITFIELD PolyFlags)
+EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts, FBITFIELD PolyFlags)
{
- FUINT i;
- FUINT j;
-
- if ((PolyFlags & PF_Corona) && (oglflags & GLF_NOZBUFREAD))
- PolyFlags &= ~(PF_NoDepthTest|PF_Corona);
+ static GLRGBAFloat mix = {0,0,0,0};
+ static GLRGBAFloat fade = {0,0,0,0};
SetBlend(PolyFlags); //TODO: inline (#pragma..)
- // If Modulated, mix the surface colour to the texture
- if ((CurrentPolyFlags & PF_Modulated) && pSurf)
- pglColor4ubv((GLubyte*)&pSurf->FlatColor.s);
-
- // this test is added for new coronas' code (without depth buffer)
- // I think I should do a separate function for drawing coronas, so it will be a little faster
- if (PolyFlags & PF_Corona) // check to see if we need to draw the corona
+ // PolyColor
+ if (pSurf)
{
- //rem: all 8 (or 8.0f) values are hard coded: it can be changed to a higher value
- GLfloat buf[8][8];
- GLfloat cx, cy, cz;
- GLfloat px = 0.0f, py = 0.0f, pz = -1.0f;
- GLfloat scalef = 0.0f;
+ // If Modulated, mix the surface colour to the texture
+ if (CurrentPolyFlags & PF_Modulated)
+ {
+ // Mix color
+ mix.red = byte2float[pSurf->PolyColor.s.red];
+ mix.green = byte2float[pSurf->PolyColor.s.green];
+ mix.blue = byte2float[pSurf->PolyColor.s.blue];
+ mix.alpha = byte2float[pSurf->PolyColor.s.alpha];
- GLubyte c[4];
+ pglColor4ubv((GLubyte*)&pSurf->PolyColor.s);
+ }
- float alpha;
-
- cx = (pOutVerts[0].x + pOutVerts[2].x) / 2.0f; // we should change the coronas' ...
- cy = (pOutVerts[0].y + pOutVerts[2].y) / 2.0f; // ... code so its only done once.
- cz = pOutVerts[0].z;
-
- // I dont know if this is slow or not
- GLProject(cx, cy, cz, &px, &py, &pz);
- //DBG_Printf("Projection: (%f, %f, %f)\n", px, py, pz);
-
- if ((pz < 0.0l) ||
- (px < -8.0l) ||
- (py < viewport[1]-8.0l) ||
- (px > viewport[2]+8.0l) ||
- (py > viewport[1]+viewport[3]+8.0l))
- return;
-
- // the damned slow glReadPixels functions :(
- pglReadPixels((INT32)px-4, (INT32)py, 8, 8, GL_DEPTH_COMPONENT, GL_FLOAT, buf);
- //DBG_Printf("DepthBuffer: %f %f\n", buf[0][0], buf[3][3]);
-
- for (i = 0; i < 8; i++)
- for (j = 0; j < 8; j++)
- scalef += (pz > buf[i][j]+0.00005f) ? 0 : 1;
-
- // quick test for screen border (not 100% correct, but looks ok)
- if (px < 4) scalef -= (GLfloat)(8*(4-px));
- if (py < viewport[1]+4) scalef -= (GLfloat)(8*(viewport[1]+4-py));
- if (px > viewport[2]-4) scalef -= (GLfloat)(8*(4-(viewport[2]-px)));
- if (py > viewport[1]+viewport[3]-4) scalef -= (GLfloat)(8*(4-(viewport[1]+viewport[3]-py)));
-
- scalef /= 64;
- //DBG_Printf("Scale factor: %f\n", scalef);
-
- if (scalef < 0.05f)
- return;
-
- // GLubyte c[4];
- c[0] = pSurf->FlatColor.s.red;
- c[1] = pSurf->FlatColor.s.green;
- c[2] = pSurf->FlatColor.s.blue;
-
- alpha = byte2float[pSurf->FlatColor.s.alpha];
- alpha *= scalef; // change the alpha value (it seems better than changing the size of the corona)
- c[3] = (unsigned char)(alpha * 255);
- pglColor4ubv(c);
+ // Fade color
+ fade.red = byte2float[pSurf->FadeColor.s.red];
+ fade.green = byte2float[pSurf->FadeColor.s.green];
+ fade.blue = byte2float[pSurf->FadeColor.s.blue];
+ fade.alpha = byte2float[pSurf->FadeColor.s.alpha];
}
+ load_shaders(pSurf, &mix, &fade);
+
pglVertexPointer(3, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].x);
- pglTexCoordPointer(2, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].sow);
+ pglTexCoordPointer(2, GL_FLOAT, sizeof(FOutVector), &pOutVerts[0].s);
pglDrawArrays(GL_TRIANGLE_FAN, 0, iNumPts);
if (PolyFlags & PF_RemoveYWrap)
@@ -1403,8 +1744,11 @@ EXPORT void HWRAPI(DrawPolygon) (FSurfaceInfo *pSurf,
if (PolyFlags & PF_ForceWrapY)
Clamp2D(GL_TEXTURE_WRAP_T);
-}
+#ifdef GL_SHADERS
+ pglUseProgram(0);
+#endif
+}
// ==========================================================================
//
@@ -1413,56 +1757,24 @@ EXPORT void HWRAPI(SetSpecialState) (hwdspecialstate_t IdState, INT32 Value)
{
switch (IdState)
{
-
-#if 0
- case 77:
- {
- //08/01/00: Hurdler this is a test for mirror
- if (!Value)
- ClearBuffer(false, true, 0); // clear depth buffer
- break;
- }
-#endif
-
- case HWD_SET_FOG_COLOR:
- {
- GLfloat fogcolor[4];
-
- fogcolor[0] = byte2float[((Value>>16)&0xff)];
- fogcolor[1] = byte2float[((Value>>8)&0xff)];
- fogcolor[2] = byte2float[((Value)&0xff)];
- fogcolor[3] = 0x0;
- pglFogfv(GL_FOG_COLOR, fogcolor);
- break;
- }
- case HWD_SET_FOG_DENSITY:
- pglFogf(GL_FOG_DENSITY, Value*1200/(500*1000000.0f));
+ case HWD_SET_SHADERS:
+ switch (Value)
+ {
+ case 1:
+ gl_allowshaders = true;
+ break;
+ default:
+ gl_allowshaders = false;
+ break;
+ }
break;
case HWD_SET_FOG_MODE:
- if (Value)
- {
- pglEnable(GL_FOG);
- // experimental code
- /*
- switch (Value)
- {
- case 1:
- glFogi(GL_FOG_MODE, GL_LINEAR);
- pglFogf(GL_FOG_START, -1000.0f);
- pglFogf(GL_FOG_END, 2000.0f);
- break;
- case 2:
- glFogi(GL_FOG_MODE, GL_EXP);
- break;
- case 3:
- glFogi(GL_FOG_MODE, GL_EXP2);
- break;
- }
- */
- }
- else
- pglDisable(GL_FOG);
+ glstate_fog_mode = Value;
+ break;
+
+ case HWD_SET_FOG_DENSITY:
+ glstate_fog_density = FIXED_TO_FLOAT(Value);
break;
case HWD_SET_TEXTUREFILTERMODE:
@@ -1632,6 +1944,10 @@ static void CreateModelVBO(mesh_t *mesh, mdlframe_t *frame)
pglBindBuffer(GL_ARRAY_BUFFER, frame->vboID);
pglBufferData(GL_ARRAY_BUFFER, bufferSize, buffer, GL_STATIC_DRAW);
free(buffer);
+
+ // Don't leave the array buffer bound to the model,
+ // since this is called mid-frame
+ pglBindBuffer(GL_ARRAY_BUFFER, 0);
}
static void CreateModelVBOTiny(mesh_t *mesh, tinyframe_t *frame)
@@ -1673,6 +1989,10 @@ static void CreateModelVBOTiny(mesh_t *mesh, tinyframe_t *frame)
pglBindBuffer(GL_ARRAY_BUFFER, frame->vboID);
pglBufferData(GL_ARRAY_BUFFER, bufferSize, buffer, GL_STATIC_DRAW);
free(buffer);
+
+ // Don't leave the array buffer bound to the model,
+ // since this is called mid-frame
+ pglBindBuffer(GL_ARRAY_BUFFER, 0);
}
EXPORT void HWRAPI(CreateModelVBOs) (model_t *model)
@@ -1709,12 +2029,12 @@ EXPORT void HWRAPI(CreateModelVBOs) (model_t *model)
}
}
-#define BUFFER_OFFSET(i) ((char*)NULL + (i))
+#define BUFFER_OFFSET(i) ((char*)(i))
-static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex, FTransform *pos, float scale, UINT8 flipped, UINT8 *color)
+static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex, FTransform *pos, float scale, UINT8 flipped, FSurfaceInfo *Surface)
{
- GLfloat ambient[4];
- GLfloat diffuse[4];
+ static GLRGBAFloat mix = {0,0,0,0};
+ static GLRGBAFloat fade = {0,0,0,0};
float pol = 0.0f;
float scalex, scaley, scalez;
@@ -1723,9 +2043,6 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
int i;
- // Because Otherwise, scaling the screen negatively vertically breaks the lighting
- GLfloat LightPos[] = {0.0f, 1.0f, 0.0f, 0.0f};
-
// Affect input model scaling
scale *= 0.5f;
scalex = scale;
@@ -1745,24 +2062,24 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
pol = 0.0f;
}
- if (color)
- {
- ambient[0] = (color[0]/255.0f);
- ambient[1] = (color[1]/255.0f);
- ambient[2] = (color[2]/255.0f);
- ambient[3] = (color[3]/255.0f);
- diffuse[0] = (color[0]/255.0f);
- diffuse[1] = (color[1]/255.0f);
- diffuse[2] = (color[2]/255.0f);
- diffuse[3] = (color[3]/255.0f);
+ mix.red = byte2float[Surface->PolyColor.s.red];
+ mix.green = byte2float[Surface->PolyColor.s.green];
+ mix.blue = byte2float[Surface->PolyColor.s.blue];
+ mix.alpha = byte2float[Surface->PolyColor.s.alpha];
- if (ambient[0] > 0.75f)
- ambient[0] = 0.75f;
- if (ambient[1] > 0.75f)
- ambient[1] = 0.75f;
- if (ambient[2] > 0.75f)
- ambient[2] = 0.75f;
- }
+ if (mix.alpha < 1)
+ SetBlend(PF_Translucent|PF_Modulated);
+ else
+ SetBlend(PF_Masked|PF_Modulated|PF_Occlude);
+
+ pglColor4ubv((GLubyte*)&Surface->PolyColor.s);
+
+ fade.red = byte2float[Surface->FadeColor.s.red];
+ fade.green = byte2float[Surface->FadeColor.s.green];
+ fade.blue = byte2float[Surface->FadeColor.s.blue];
+ fade.alpha = byte2float[Surface->FadeColor.s.alpha];
+
+ load_shaders(Surface, &mix, &fade);
pglEnable(GL_CULL_FACE);
pglEnable(GL_NORMALIZE);
@@ -1782,33 +2099,12 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
#else
// pos->flip is if the screen is flipped too
if (flipped != pos->flip) // If either are active, but not both, invert the model's culling
- {
pglCullFace(GL_FRONT);
- }
else
- {
pglCullFace(GL_BACK);
- }
#endif
- pglLightfv(GL_LIGHT0, GL_POSITION, LightPos);
-
- pglShadeModel(GL_SMOOTH);
- if (color)
- {
-#ifdef GL_LIGHT_MODEL_AMBIENT
- pglEnable(GL_LIGHTING);
- pglMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
- pglMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse);
-#endif
- if (color[3] < 255)
- SetBlend(PF_Translucent|PF_Modulated|PF_Clip);
- else
- SetBlend(PF_Masked|PF_Modulated|PF_Occlude|PF_Clip);
- }
-
pglPushMatrix(); // should be the same as glLoadIdentity
- //Hurdler: now it seems to work
pglTranslatef(pos->x, pos->z, pos->y);
if (flipped)
scaley = -scaley;
@@ -1845,7 +2141,6 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
pglVertexPointer(3, GL_SHORT, sizeof(vbotiny_t), BUFFER_OFFSET(0));
pglNormalPointer(GL_BYTE, sizeof(vbotiny_t), BUFFER_OFFSET(sizeof(short)*3));
pglTexCoordPointer(2, GL_FLOAT, sizeof(vbotiny_t), BUFFER_OFFSET(sizeof(short) * 3 + sizeof(char) * 6));
-
pglDrawElements(GL_TRIANGLES, mesh->numTriangles * 3, GL_UNSIGNED_SHORT, mesh->indices);
pglBindBuffer(GL_ARRAY_BUFFER, 0);
}
@@ -1853,13 +2148,12 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
{
short *vertPtr;
char *normPtr;
- int j;
+ int j = 0;
// Dangit, I soooo want to do this in a GLSL shader...
AllocLerpTinyBuffer(mesh->numVertices * sizeof(short) * 3);
vertPtr = vertTinyBuffer;
normPtr = normTinyBuffer;
- j = 0;
for (j = 0; j < mesh->numVertices * 3; j++)
{
@@ -1885,19 +2179,12 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
if (!nextframe || fpclassify(pol) == FP_ZERO)
{
// Zoom! Take advantage of just shoving the entire arrays to the GPU.
-/* pglVertexPointer(3, GL_FLOAT, 0, frame->vertices);
- pglNormalPointer(GL_FLOAT, 0, frame->normals);
- pglTexCoordPointer(2, GL_FLOAT, 0, mesh->uvs);
- pglDrawArrays(GL_TRIANGLES, 0, mesh->numTriangles * 3);*/
-
pglBindBuffer(GL_ARRAY_BUFFER, frame->vboID);
pglVertexPointer(3, GL_FLOAT, sizeof(vbo64_t), BUFFER_OFFSET(0));
pglNormalPointer(GL_FLOAT, sizeof(vbo64_t), BUFFER_OFFSET(sizeof(float) * 3));
pglTexCoordPointer(2, GL_FLOAT, sizeof(vbo64_t), BUFFER_OFFSET(sizeof(float) * 6));
pglDrawArrays(GL_TRIANGLES, 0, mesh->numTriangles * 3);
- // No tinyframes, no mesh indices
- //pglDrawElements(GL_TRIANGLES, mesh->numTriangles * 3, GL_UNSIGNED_SHORT, mesh->indices);
pglBindBuffer(GL_ARRAY_BUFFER, 0);
}
else
@@ -1910,7 +2197,6 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
AllocLerpBuffer(mesh->numVertices * sizeof(float) * 3);
vertPtr = vertBuffer;
normPtr = normBuffer;
- //int j = 0;
for (j = 0; j < mesh->numVertices * 3; j++)
{
@@ -1930,19 +2216,20 @@ static void DrawModelEx(model_t *model, INT32 frameIndex, INT32 duration, INT32
pglDisableClientState(GL_NORMAL_ARRAY);
pglPopMatrix(); // should be the same as glLoadIdentity
- if (color)
- pglDisable(GL_LIGHTING);
- pglShadeModel(GL_FLAT);
pglDisable(GL_CULL_FACE);
pglDisable(GL_NORMALIZE);
+
+#ifdef GL_SHADERS
+ pglUseProgram(0);
+#endif
}
// -----------------+
-// HWRAPI DrawMD2 : Draw an MD2 model with glcommands
+// HWRAPI DrawModel : Draw a model
// -----------------+
-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(DrawModel) (model_t *model, INT32 frameIndex, INT32 duration, INT32 tics, INT32 nextFrameIndex, FTransform *pos, float scale, UINT8 flipped, FSurfaceInfo *Surface)
{
- DrawModelEx(model, frameIndex, duration, tics, nextFrameIndex, pos, scale, flipped, color);
+ DrawModelEx(model, frameIndex, duration, tics, nextFrameIndex, pos, scale, flipped, Surface);
}
// -----------------+
@@ -1952,10 +2239,12 @@ EXPORT void HWRAPI(SetTransform) (FTransform *stransform)
{
static boolean special_splitscreen;
GLdouble used_fov;
+ boolean shearing = false;
pglLoadIdentity();
if (stransform)
{
used_fov = stransform->fovxangle;
+ shearing = stransform->shearing;
// keep a trace of the transformation for md2
memcpy(&md2_transform, stransform, sizeof (md2_transform));
@@ -1970,7 +2259,8 @@ EXPORT void HWRAPI(SetTransform) (FTransform *stransform)
else
pglScalef(stransform->scalex, stransform->scaley, -stransform->scalez);
- pglRotatef(stransform->anglex , 1.0f, 0.0f, 0.0f);
+ pglMatrixMode(GL_MODELVIEW);
+ pglRotatef(stransform->anglex, 1.0f, 0.0f, 0.0f);
pglRotatef(stransform->angley+270.0f, 0.0f, 1.0f, 0.0f);
pglTranslatef(-stransform->x, -stransform->z, -stransform->y);
@@ -1985,9 +2275,19 @@ EXPORT void HWRAPI(SetTransform) (FTransform *stransform)
pglMatrixMode(GL_PROJECTION);
pglLoadIdentity();
+
+ // jimita 14042019
+ // Simulate Software's y-shearing
+ // https://zdoom.org/wiki/Y-shearing
+ if (shearing)
+ {
+ float dy = FIXED_TO_FLOAT(AIMINGTODY(stransform->viewaiming)) * 2; //screen_width/BASEVIDWIDTH;
+ pglTranslatef(0.0f, -dy/BASEVIDHEIGHT, 0.0f);
+ }
+
if (special_splitscreen)
{
- used_fov = atan(tan(used_fov*M_PIl/360.0l)*0.8l)*360/M_PIl;
+ used_fov = atan(tan(used_fov*M_PIl/360)*0.8)*360/M_PIl;
GLPerspective((GLfloat)used_fov, 2*ASPECT_RATIO);
}
else
@@ -2011,11 +2311,6 @@ EXPORT INT32 HWRAPI(GetTextureUsed) (void)
return res;
}
-EXPORT INT32 HWRAPI(GetRenderVersion) (void)
-{
- return VERSION;
-}
-
EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2])
{
INT32 x, y;
@@ -2031,7 +2326,7 @@ EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2])
16.0f, -16.0f, 6.0f
};
- // Use a power of two texture, dammit
+ // Use a power of two texture
if(screen_width <= 1024)
texsize = 1024;
if(screen_width <= 512)
@@ -2044,8 +2339,6 @@ EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2])
pglDisable(GL_DEPTH_TEST);
pglDisable(GL_BLEND);
- // const float blackBack[16]
-
// Draw a black square behind the screen texture,
// so nothing shows through the edges
pglColor4ubv(white);
@@ -2053,6 +2346,7 @@ EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2])
pglVertexPointer(3, GL_FLOAT, 0, blackBack);
pglDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+ pglEnableClientState(GL_TEXTURE_COORD_ARRAY);
for(x=0;x 1000
-"Update P_PatchInfoTables, you big dumb head"
+#error "Update P_PatchInfoTables, you big dumb head"
#endif
// empty out free slots
@@ -20113,9 +20110,6 @@ void P_PatchInfoTables(void)
tempname[2] = (char)('0' + (char)(((i-SPR_FIRSTFREESLOT+1)/10)%10));
tempname[3] = (char)('0' + (char)((i-SPR_FIRSTFREESLOT+1)%10));
tempname[4] = '\0';
-#ifdef HWRENDER
- t_lspr[i] = &lspr[NOLIGHT];
-#endif
}
sprnames[i][0] = '\0'; // i == NUMSPRITES
memset(&states[S_FIRSTFREESLOT], 0, sizeof (state_t) * NUMSTATEFREESLOTS);
diff --git a/src/info.h b/src/info.h
index 0e23a07c..a00b53d0 100644
--- a/src/info.h
+++ b/src/info.h
@@ -226,7 +226,7 @@ void A_NapalmScatter();
void A_SpawnFreshCopy();
// ratio of states to sprites to mobj types is roughly 6 : 1 : 1
-#define NUMMOBJFREESLOTS 256
+#define NUMMOBJFREESLOTS 512
#define NUMSPRITEFREESLOTS NUMMOBJFREESLOTS
#define NUMSTATEFREESLOTS (NUMMOBJFREESLOTS*8)
@@ -4301,7 +4301,7 @@ typedef enum mobj_type
// Castle Eggman Scenery
MT_CHAIN, // CEZ Chain
- MT_FLAME, // Flame (has corona)
+ MT_FLAME, // Flame
MT_EGGSTATUE, // Eggman Statue
MT_MACEPOINT, // Mace rotation point
MT_SWINGMACEPOINT, // Mace swinging point
diff --git a/src/m_fixed.c b/src/m_fixed.c
index 5e789673..7241be9c 100644
--- a/src/m_fixed.c
+++ b/src/m_fixed.c
@@ -411,6 +411,19 @@ boolean FV3_Equal(const vector3_t *a_1, const vector3_t *a_2)
return false;
}
+// 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;
+}
+
fixed_t FV3_Dot(const vector3_t *a_1, const vector3_t *a_2)
{
return (FixedMul(a_1->x, a_2->x) + FixedMul(a_1->y, a_2->y) + FixedMul(a_1->z, a_2->z));
@@ -458,19 +471,6 @@ vector3_t *FV3_ClosestPointOnLine(const vector3_t *Line, const vector3_t *p, vec
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
diff --git a/src/m_menu.c b/src/m_menu.c
index 97b1ce9b..db50d5ff 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -372,9 +372,6 @@ static void M_HandleLevelStats(INT32 choice);
static void M_HandleConnectIP(INT32 choice);
#endif
static void M_HandleSetupMultiPlayer(INT32 choice);
-#ifdef HWRENDER
-static void M_HandleFogColor(INT32 choice);
-#endif
static void M_HandleVideoMode(INT32 choice);
static void M_HandleMonitorToggles(INT32 choice);
@@ -1285,36 +1282,24 @@ static menuitem_t OP_VideoModeMenu[] =
#ifdef HWRENDER
static menuitem_t OP_OpenGLOptionsMenu[] =
{
- {IT_SUBMENU|IT_STRING, NULL, "Fog...", &OP_OpenGLFogDef, 10},
- {IT_SUBMENU|IT_STRING, NULL, "Gamma...", &OP_OpenGLColorDef, 20},
+ {IT_STRING|IT_CVAR, NULL, "Shaders", &cv_grshaders, 10},
+ {IT_STRING|IT_CVAR, NULL, "Software Perspective", &cv_grshearing, 20},
+ {IT_STRING|IT_CVAR, NULL, "Sprite Billboarding", &cv_grspritebillboarding,30},
- {IT_STRING|IT_CVAR, NULL, "Quality", &cv_scr_depth, 35},
- {IT_STRING|IT_CVAR, NULL, "Texture Filter", &cv_grfiltermode, 45},
- {IT_STRING|IT_CVAR, NULL, "Anisotropic", &cv_granisotropicmode, 55},
-/*#ifdef _WINDOWS
- {IT_STRING|IT_CVAR, NULL, "Fullscreen", &cv_fullscreen, 50},
+ {IT_STRING|IT_CVAR, NULL, "Quality", &cv_scr_depth, 50},
+ {IT_STRING|IT_CVAR, NULL, "Texture Filter", &cv_grfiltermode, 60},
+ {IT_STRING|IT_CVAR, NULL, "Anisotropic", &cv_granisotropicmode, 70},
+#ifdef _WINDOWS
+ {IT_STRING|IT_CVAR, NULL, "Fullscreen", &cv_fullscreen, 80},
#endif
-#ifdef ALAM_LIGHTING
- {IT_SUBMENU|IT_STRING, NULL, "Lighting...", &OP_OpenGLLightingDef, 70},
-#endif*/
+ {IT_SUBMENU|IT_STRING, NULL, "Fog...", &OP_OpenGLFogDef, 100},
+ {IT_SUBMENU|IT_STRING, NULL, "Gamma...", &OP_OpenGLColorDef, 110},
};
-#ifdef ALAM_LIGHTING
-static menuitem_t OP_OpenGLLightingMenu[] =
-{
- {IT_STRING|IT_CVAR, NULL, "Coronas", &cv_grcoronas, 0},
- {IT_STRING|IT_CVAR, NULL, "Coronas size", &cv_grcoronasize, 10},
- {IT_STRING|IT_CVAR, NULL, "Dynamic lighting", &cv_grdynamiclighting, 20},
- {IT_STRING|IT_CVAR, NULL, "Static lighting", &cv_grstaticlighting, 30},
-};
-#endif
-
static menuitem_t OP_OpenGLFogMenu[] =
{
{IT_STRING|IT_CVAR, NULL, "Fog", &cv_grfog, 10},
- {IT_STRING|IT_KEYHANDLER, NULL, "Fog Color", M_HandleFogColor, 20},
- {IT_STRING|IT_CVAR, NULL, "Fog Density", &cv_grfogdensity, 30},
- {IT_STRING|IT_CVAR, NULL, "Software Fog",&cv_grsoftwarefog,40},
+ {IT_STRING|IT_CVAR, NULL, "Fog density", &cv_grfogdensity, 20},
};
static menuitem_t OP_OpenGLColorMenu[] =
@@ -2078,9 +2063,6 @@ menu_t OP_MonitorToggleDef =
#ifdef HWRENDER
menu_t OP_OpenGLOptionsDef = DEFAULTMENUSTYLE("M_VIDEO", OP_OpenGLOptionsMenu, &OP_VideoOptionsDef, 30, 30);
-#ifdef ALAM_LIGHTING
-menu_t OP_OpenGLLightingDef = DEFAULTMENUSTYLE("M_VIDEO", OP_OpenGLLightingMenu, &OP_OpenGLOptionsDef, 60, 40);
-#endif
menu_t OP_OpenGLFogDef =
{
"M_VIDEO",
@@ -4503,21 +4485,11 @@ static void M_StopMessage(INT32 choice)
// You can even put multiple images in one menu!
static void M_DrawImageDef(void)
{
- // this is probably what the V_DrawFixedPatch screen-fill bullshit was for, right
- //V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); -- never mind, screen fade
-
- // Grr. Need to autodetect for pic_ts.
- pic_t *pictest = (pic_t *)W_CachePatchName(currentMenu->menuitems[itemOn].text,PU_CACHE);
- if (!pictest->zero)
- V_DrawScaledPic(0,0,0,W_GetNumForName(currentMenu->menuitems[itemOn].text));
+ patch_t *patch = W_CachePatchName(currentMenu->menuitems[itemOn].text,PU_CACHE);
+ if (patch->width <= BASEVIDWIDTH)
+ V_DrawScaledPatch(0,0,0,patch);
else
- {
- patch_t *patch = W_CachePatchName(currentMenu->menuitems[itemOn].text,PU_CACHE);
- if (patch->height <= BASEVIDHEIGHT)
- V_DrawScaledPatch(0,0,0,patch);
- else
- V_DrawSmallScaledPatch(0,0,0,patch);
- }
+ V_DrawSmallScaledPatch(0,0,0,patch);
if (currentMenu->menuitems[itemOn].alphaKey)
{
@@ -10992,7 +10964,7 @@ static void M_QuitSRB2(INT32 choice)
// OpenGL specific options
// =====================================================================
-#define FOG_COLOR_ITEM 1
+#define FOG_DENSITY_ITEM 1
// ===================
// M_OGL_DrawFogMenu()
// ===================
@@ -11003,12 +10975,8 @@ static void M_OGL_DrawFogMenu(void)
mx = currentMenu->x;
my = currentMenu->y;
M_DrawGenericMenu(); // use generic drawer for cursor, items and title
- V_DrawString(BASEVIDWIDTH - mx - V_StringWidth(cv_grfogcolor.string, 0),
- my + currentMenu->menuitems[FOG_COLOR_ITEM].alphaKey, highlightflags, cv_grfogcolor.string);
- // blink cursor on FOG_COLOR_ITEM if selected
- if (itemOn == FOG_COLOR_ITEM && skullAnimCounter < 4)
- V_DrawCharacter(BASEVIDWIDTH - mx,
- my + currentMenu->menuitems[FOG_COLOR_ITEM].alphaKey, '_' | 0x80,false);
+ V_DrawString(BASEVIDWIDTH - mx - V_StringWidth(cv_grfogdensity.string, 0),
+ my + currentMenu->menuitems[FOG_DENSITY_ITEM].alphaKey, V_YELLOWMAP, cv_grfogdensity.string);
}
// =====================
@@ -11024,61 +10992,4 @@ static void M_OGL_DrawColorMenu(void)
V_DrawString(mx, my + currentMenu->menuitems[0].alphaKey - 10,
highlightflags, "Gamma correction");
}
-
-//===================
-// M_HandleFogColor()
-//===================
-static void M_HandleFogColor(INT32 choice)
-{
- size_t i, l;
- char temp[8];
- boolean exitmenu = false; // exit to previous menu and send name change
-
- switch (choice)
- {
- case KEY_DOWNARROW:
- S_StartSound(NULL, sfx_menu1);
- itemOn++;
- break;
-
- case KEY_UPARROW:
- S_StartSound(NULL, sfx_menu1);
- itemOn--;
- break;
-
- case KEY_ESCAPE:
- exitmenu = true;
- break;
-
- case KEY_BACKSPACE:
- S_StartSound(NULL, sfx_menu1);
- strcpy(temp, cv_grfogcolor.string);
- strcpy(cv_grfogcolor.zstring, "000000");
- l = strlen(temp)-1;
- for (i = 0; i < l; i++)
- cv_grfogcolor.zstring[i + 6 - l] = temp[i];
- break;
-
- default:
- if ((choice >= '0' && choice <= '9') || (choice >= 'a' && choice <= 'f')
- || (choice >= 'A' && choice <= 'F'))
- {
- S_StartSound(NULL, sfx_menu1);
- strcpy(temp, cv_grfogcolor.string);
- strcpy(cv_grfogcolor.zstring, "000000");
- l = strlen(temp);
- for (i = 0; i < l; i++)
- cv_grfogcolor.zstring[5 - i] = temp[l - i];
- cv_grfogcolor.zstring[5] = (char)choice;
- }
- break;
- }
- if (exitmenu)
- {
- if (currentMenu->prevMenu)
- M_SetupNextMenu(currentMenu->prevMenu);
- else
- M_ClearMenus(true);
- }
-}
#endif
diff --git a/src/m_misc.c b/src/m_misc.c
index f4a4ec29..5e8fe5dd 100644
--- a/src/m_misc.c
+++ b/src/m_misc.c
@@ -30,6 +30,7 @@
#include "g_game.h"
#include "m_misc.h"
#include "hu_stuff.h"
+#include "st_stuff.h"
#include "v_video.h"
#include "z_zone.h"
#include "g_input.h"
@@ -586,6 +587,21 @@ void M_SaveConfig(const char *filename)
fclose(f);
}
+// ==========================================================================
+// SCREENSHOTS
+// ==========================================================================
+static UINT8 screenshot_palette[768];
+static void M_CreateScreenShotPalette(void)
+{
+ size_t i, j;
+ for (i = 0, j = 0; i < 768; i += 3, j++)
+ {
+ RGBA_t locpal = pLocalPalette[(max(st_palette,0)*256)+j];
+ screenshot_palette[i] = locpal.s.red;
+ screenshot_palette[i+1] = locpal.s.green;
+ screenshot_palette[i+2] = locpal.s.blue;
+ }
+}
#if NUMSCREENS > 2
static const char *Newsnapshotfile(const char *pathname, const char *ext)
@@ -1017,6 +1033,7 @@ static boolean M_SetupaPNG(png_const_charp filename, png_bytep pal)
static inline moviemode_t M_StartMovieAPNG(const char *pathname)
{
#ifdef USE_APNG
+ UINT8 *palette;
const char *freename = NULL;
boolean ret = false;
@@ -1032,10 +1049,8 @@ static inline moviemode_t M_StartMovieAPNG(const char *pathname)
return MM_OFF;
}
- if (rendermode == render_soft)
- ret = M_SetupaPNG(va(pandf,pathname,freename), W_CacheLumpName(GetPalette(), PU_CACHE));
- else
- ret = M_SetupaPNG(va(pandf,pathname,freename), NULL);
+ if (rendermode == render_soft) M_CreateScreenShotPalette();
+ ret = M_SetupaPNG(va(pandf,pathname,freename), (palette = screenshot_palette));
if (!ret)
{
@@ -1238,7 +1253,7 @@ void M_StopMovie(void)
* \param data The image data.
* \param width Width of the picture.
* \param height Height of the picture.
- * \param palette Palette of image data
+ * \param palette Palette of image data.
* \note if palette is NULL, BGR888 format
*/
boolean M_SavePNG(const char *filename, void *data, int width, int height, const UINT8 *palette)
@@ -1260,8 +1275,7 @@ boolean M_SavePNG(const char *filename, void *data, int width, int height, const
return false;
}
- png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL,
- PNG_error, PNG_warn);
+ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, PNG_error, PNG_warn);
if (!png_ptr)
{
CONS_Debug(DBG_RENDER, "M_SavePNG: Error on initialize libpng\n");
@@ -1415,9 +1429,8 @@ void M_ScreenShot(void)
}
/** Takes a screenshot.
- * The screenshot is saved as "kartxxxx.pcx" (or "kartxxxx.tga" in hardware
- * rendermode) where xxxx is the lowest four-digit number for which a file
- * does not already exist.
+ * The screenshot is saved as "srb2xxxx.png" where xxxx is the lowest
+ * four-digit number for which a file does not already exist.
*
* \sa HWR_ScreenShot
*/
@@ -1431,6 +1444,10 @@ void M_DoScreenShot(void)
// Don't take multiple screenshots, obviously
takescreenshot = false;
+ // how does one take a screenshot without a render system?
+ if (rendermode == render_none)
+ return;
+
if (cv_screenshot_option.value == 0)
pathname = usehome ? srb2home : srb2path;
else if (cv_screenshot_option.value == 1)
@@ -1441,16 +1458,13 @@ void M_DoScreenShot(void)
pathname = cv_screenshot_folder.string;
#ifdef USE_PNG
- if (rendermode != render_none)
- freename = Newsnapshotfile(pathname,"png");
+ freename = Newsnapshotfile(pathname,"png");
#else
if (rendermode == render_soft)
freename = Newsnapshotfile(pathname,"pcx");
- else if (rendermode != render_none)
+ else if (rendermode == render_opengl)
freename = Newsnapshotfile(pathname,"tga");
#endif
- else
- I_Error("Can't take a screenshot without a render system");
if (rendermode == render_soft)
{
@@ -1464,18 +1478,16 @@ void M_DoScreenShot(void)
// save the pcx file
#ifdef HWRENDER
- if (rendermode != render_soft)
+ if (rendermode == render_opengl)
ret = HWR_Screenshot(va(pandf,pathname,freename));
else
#endif
- if (rendermode != render_none)
{
+ M_CreateScreenShotPalette();
#ifdef USE_PNG
- ret = M_SavePNG(va(pandf,pathname,freename), linear, vid.width, vid.height,
- W_CacheLumpName(GetPalette(), PU_CACHE));
+ ret = M_SavePNG(va(pandf,pathname,freename), linear, vid.width, vid.height, screenshot_palette);
#else
- ret = WritePCXfile(va(pandf,pathname,freename), linear, vid.width, vid.height,
- W_CacheLumpName(GetPalette(), PU_CACHE));
+ ret = WritePCXfile(va(pandf,pathname,freename), linear, vid.width, vid.height, screenshot_palette);
#endif
}
@@ -1483,14 +1495,14 @@ failure:
if (ret)
{
if (moviemode != MM_SCREENSHOT)
- CONS_Printf(M_GetText("screen shot %s saved in %s\n"), freename, pathname);
+ CONS_Printf(M_GetText("Screen shot %s saved in %s\n"), freename, pathname);
}
else
{
if (freename)
- CONS_Printf(M_GetText("Couldn't create screen shot %s in %s\n"), freename, pathname);
+ CONS_Alert(CONS_ERROR, M_GetText("Couldn't create screen shot %s in %s\n"), freename, pathname);
else
- CONS_Printf(M_GetText("Couldn't create screen shot (all 10000 slots used!) in %s\n"), pathname);
+ CONS_Alert(CONS_ERROR, M_GetText("Couldn't create screen shot in %s (all 10000 slots used!)\n"), pathname);
if (moviemode == MM_SCREENSHOT)
M_StopMovie();
diff --git a/src/nds/r_nds3d.c b/src/nds/r_nds3d.c
index dbdcec15..6734e8c1 100644
--- a/src/nds/r_nds3d.c
+++ b/src/nds/r_nds3d.c
@@ -160,7 +160,7 @@ void NDS3D_DrawPolygon(FSurfaceInfo *pSurf, FOutVector *pOutVerts, FUINT iNumPts
z = pOutVerts[index].z;
}
- glTexCoord2f(pOutVerts[index].sow, pOutVerts[index].tow);
+ glTexCoord2f(pOutVerts[index].s, pOutVerts[index].tow);
glVertex3f(x,y,z);
}
glEnd();
diff --git a/src/p_setup.c b/src/p_setup.c
index bf13971b..c5bded51 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -465,11 +465,7 @@ static void P_LoadRawSegs(UINT8 *data, size_t i)
li->length = P_SegLength(li);
#ifdef HWRENDER
if (rendermode == render_opengl)
- {
li->flength = P_SegLengthFloat(li);
- //Hurdler: 04/12/2000: for now, only used in hardware mode
- li->lightmaps = NULL; // list of static lightmap for this seg
- }
li->pv1 = li->pv2 = NULL;
#endif
@@ -1412,6 +1408,8 @@ static void P_LoadRawSideDefs2(void *data)
{
UINT16 i;
INT32 num;
+ size_t j;
+ UINT32 cr, cg, cb;
for (i = 0; i < numsides; i++)
{
@@ -1490,16 +1488,43 @@ static void P_LoadRawSideDefs2(void *data)
{
col = msd->toptexture;
- sec->extra_colormap->rgba =
- (HEX2INT(col[1]) << 4) + (HEX2INT(col[2]) << 0) +
- (HEX2INT(col[3]) << 12) + (HEX2INT(col[4]) << 8) +
- (HEX2INT(col[5]) << 20) + (HEX2INT(col[6]) << 16);
+ // encore mode colormaps!
+ // do it like software by aproximating a color to a palette index, and then convert it to its encore variant and then back to a color code.
+ // do this for both the start and fade colormaps.
+
+ cr = (HEX2INT(col[1]) << 4) + (HEX2INT(col[2]) << 0);
+ cg = (HEX2INT(col[3]) << 12) + (HEX2INT(col[4]) << 8);
+ cb = (HEX2INT(col[5]) << 20) + (HEX2INT(col[6]) << 16);
+
+#ifdef GLENCORE
+ if (encoremap)
+ {
+ j = encoremap[NearestColor((UINT8)cr, (UINT8)cg, (UINT8)cb)];
+ //CONS_Printf("R_CreateColormap: encoremap[%d] = %d\n", j, encoremap[j]); -- moved encoremap upwards for optimisation
+ cr = pLocalPalette[j].s.red;
+ cg = pLocalPalette[j].s.green;
+ cb = pLocalPalette[j].s.blue;
+ }
+#endif
+
+ sec->extra_colormap->rgba = cr + cg + cb;
// alpha
if (msd->toptexture[7])
sec->extra_colormap->rgba += (ALPHA2INT(col[7]) << 24);
else
sec->extra_colormap->rgba += (25 << 24);
+
+ /*nearest = NearestColor(
+ (HEX2INT(col[1]) << 4) + (HEX2INT(col[2]) << 0),
+ (HEX2INT(col[3]) << 4) + (HEX2INT(col[4]) << 0),
+ (HEX2INT(col[5]) << 4) + (HEX2INT(col[6]) << 0)
+ );
+
+ sec->extra_colormap->rgba =
+ pLocalPalette[nearest].s.red +
+ (pLocalPalette[nearest].s.green << 8) +
+ (pLocalPalette[nearest].s.blue << 16);*/
}
else
sec->extra_colormap->rgba = 0;
@@ -1508,10 +1533,24 @@ static void P_LoadRawSideDefs2(void *data)
{
col = msd->bottomtexture;
- sec->extra_colormap->fadergba =
- (HEX2INT(col[1]) << 4) + (HEX2INT(col[2]) << 0) +
- (HEX2INT(col[3]) << 12) + (HEX2INT(col[4]) << 8) +
- (HEX2INT(col[5]) << 20) + (HEX2INT(col[6]) << 16);
+ // do the exact same thing as above here.
+
+ cr = (HEX2INT(col[1]) << 4) + (HEX2INT(col[2]) << 0);
+ cg = (HEX2INT(col[3]) << 12) + (HEX2INT(col[4]) << 8);
+ cb = (HEX2INT(col[5]) << 20) + (HEX2INT(col[6]) << 16);
+
+#ifdef GLENCORE
+ if (encoremap)
+ {
+ j = encoremap[NearestColor((UINT8)cr, (UINT8)cg, (UINT8)cb)];
+ //CONS_Printf("R_CreateColormap: encoremap[%d] = %d\n", j, encoremap[j]); -- moved encoremap upwards for optimisation
+ cr = pLocalPalette[j].s.red;
+ cg = pLocalPalette[j].s.green;
+ cb = pLocalPalette[j].s.blue;
+ }
+#endif
+
+ sec->extra_colormap->fadergba = cr + cg + cb;
// alpha
if (msd->bottomtexture[7])
@@ -3089,10 +3128,6 @@ boolean P_SetupLevel(boolean skipprecip)
#ifdef HWRENDER // not win32 only 19990829 by Kin
if (rendermode != render_soft && rendermode != render_none)
{
-#ifdef ALAM_LIGHTING
- // BP: reset light between levels (we draw preview frame lights on current frame)
- HWR_ResetLights();
-#endif
// Correct missing sidedefs & deep water trick
HWR_CorrectSWTricks();
HWR_CreatePlanePolygons((INT32)numnodes - 1);
diff --git a/src/r_bsp.c b/src/r_bsp.c
index 296cbbe8..43cb6432 100644
--- a/src/r_bsp.c
+++ b/src/r_bsp.c
@@ -37,7 +37,7 @@ drawseg_t *ds_p = NULL;
// indicates doors closed wrt automap bugfix:
INT32 doorclosed;
-static boolean R_NoEncore(sector_t *sector, boolean ceiling)
+boolean R_NoEncore(sector_t *sector, boolean ceiling)
{
boolean invertencore = (GETSECSPECIAL(sector->special, 2) == 15);
#if 0 // perfect implementation
diff --git a/src/r_bsp.h b/src/r_bsp.h
index e3662e2e..1e4ca68f 100644
--- a/src/r_bsp.h
+++ b/src/r_bsp.h
@@ -40,6 +40,10 @@ void R_ClearDrawSegs(void);
void R_RenderBSPNode(INT32 bspnum);
void R_AddPortal(INT32 line1, INT32 line2, INT32 x1, INT32 x2);
+// determines when a given sector shouldn't abide by the encoremap's palette.
+// no longer a static since this is used for encore in hw_main.c as well now:
+boolean R_NoEncore(sector_t *sector, boolean ceiling);
+
#ifdef POLYOBJECTS
void R_SortPolyObjects(subsector_t *sub);
diff --git a/src/r_data.c b/src/r_data.c
index 7fb11855..b1b20f19 100644
--- a/src/r_data.c
+++ b/src/r_data.c
@@ -1177,7 +1177,6 @@ void R_ClearColormaps(void)
//
static double deltas[256][3], map[256][3];
-static UINT8 NearestColor(UINT8 r, UINT8 g, UINT8 b);
static int RoundUp(double number);
#ifdef HASINVERT
@@ -1403,7 +1402,7 @@ INT32 R_CreateColormap(char *p1, char *p2, char *p3)
// Thanks to quake2 source!
// utils3/qdata/images.c
-static UINT8 NearestColor(UINT8 r, UINT8 g, UINT8 b)
+UINT8 NearestColor(UINT8 r, UINT8 g, UINT8 b)
{
int dr, dg, db;
int distortion, bestdistortion = 256 * 256 * 4, bestcolor = 0, i;
diff --git a/src/r_data.h b/src/r_data.h
index 640b3030..78104c42 100644
--- a/src/r_data.h
+++ b/src/r_data.h
@@ -100,4 +100,6 @@ const char *R_ColormapNameForNum(INT32 num);
extern INT32 numtextures;
+UINT8 NearestColor(UINT8 r, UINT8 g, UINT8 b);
+
#endif
diff --git a/src/r_defs.h b/src/r_defs.h
index 52a3be80..00036e9e 100644
--- a/src/r_defs.h
+++ b/src/r_defs.h
@@ -526,31 +526,6 @@ typedef struct mprecipsecnode_s
boolean visited; // used in search algorithms
} mprecipsecnode_t;
-// for now, only used in hardware mode
-// maybe later for software as well?
-// that's why it's moved here
-typedef struct light_s
-{
- UINT16 type; // light,... (cfr #define in hwr_light.c)
-
- float light_xoffset;
- float light_yoffset; // y offset to adjust corona's height
-
- UINT32 corona_color; // color of the light for static lighting
- float corona_radius; // radius of the coronas
-
- UINT32 dynamic_color; // color of the light for dynamic lighting
- float dynamic_radius; // radius of the light ball
- float dynamic_sqrradius; // radius^2 of the light ball
-} light_t;
-
-typedef struct lightmap_s
-{
- float s[2], t[2];
- light_t *light;
- struct lightmap_s *next;
-} lightmap_t;
-
//
// The lineseg.
//
@@ -579,8 +554,6 @@ typedef struct seg_s
void *pv1; // polyvertex_t
void *pv2; // polyvertex_t
float flength; // length of the seg, used by hardware renderer
-
- lightmap_t *lightmaps; // for static lightmap
#endif
// Why slow things down by calculating lightlists for every thick side?
diff --git a/src/r_main.c b/src/r_main.c
index 358a24bb..09cfb5e8 100644
--- a/src/r_main.c
+++ b/src/r_main.c
@@ -137,7 +137,7 @@ static CV_PossibleValue_t drawdist_precip_cons_t[] = {
{1024, "1024"}, {1536, "1536"}, {2048, "2048"},
{0, "None"}, {0, NULL}};
-static CV_PossibleValue_t fov_cons_t[] = {{0, "MIN"}, {179*FRACUNIT, "MAX"}, {0, NULL}};
+static CV_PossibleValue_t fov_cons_t[] = {{45*FRACUNIT, "MIN"}, {120*FRACUNIT, "MAX"}, {0, NULL}};
//static CV_PossibleValue_t precipdensity_cons_t[] = {{0, "None"}, {1, "Light"}, {2, "Moderate"}, {4, "Heavy"}, {6, "Thick"}, {8, "V.Thick"}, {0, NULL}};
static CV_PossibleValue_t translucenthud_cons_t[] = {{0, "MIN"}, {10, "MAX"}, {0, NULL}};
@@ -181,7 +181,9 @@ consvar_t cv_drawdist = {"drawdist", "Infinite", CV_SAVE, drawdist_cons_t, NULL,
//consvar_t cv_drawdist_nights = {"drawdist_nights", "2048", CV_SAVE, drawdist_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_drawdist_precip = {"drawdist_precip", "1024", CV_SAVE, drawdist_precip_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
//consvar_t cv_precipdensity = {"precipdensity", "Moderate", CV_SAVE, precipdensity_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
-consvar_t cv_fov = {"fov", "90", CV_FLOAT|CV_CALL, fov_cons_t, Fov_OnChange, 0, NULL, NULL, 0, 0, NULL};
+
+// cap fov, fov too high tears software apart.
+consvar_t cv_fov = {"fov", "90", CV_FLOAT|CV_CALL|CV_SAVE, fov_cons_t, Fov_OnChange, 0, NULL, NULL, 0, 0, NULL};
// Okay, whoever said homremoval causes a performance hit should be shot.
consvar_t cv_homremoval = {"homremoval", "Yes", CV_SAVE, homremoval_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
@@ -686,11 +688,6 @@ void R_ExecuteSetViewSize(void)
R_InitTextureMapping();
-#ifdef HWRENDER
- if (rendermode != render_soft)
- HWR_InitTextureMapping();
-#endif
-
// thing clipping
for (i = 0; i < viewwidth; i++)
screenheightarray[i] = (INT16)viewheight;
@@ -820,29 +817,31 @@ subsector_t *R_IsPointInSubsector(fixed_t x, fixed_t y)
static mobj_t *viewmobj;
-// WARNING: a should be unsigned but to add with 2048, it isn't!
-#define AIMINGTODY(a) FixedDiv((FINETANGENT((2048+(((INT32)a)>>ANGLETOFINESHIFT)) & FINEMASK)*160)>>FRACBITS, fovtan)
-
// recalc necessary stuff for mouseaiming
// slopes are already calculated for the full possible view (which is 4*viewheight).
// 18/08/18: (No it's actually 16*viewheight, thanks Jimita for finding this out)
static void R_SetupFreelook(void)
{
INT32 dy = 0;
+
+ // clip it in the case we are looking a hardware 90 degrees full aiming
+ // (lmps, network and use F12...)
+ if (rendermode == render_soft
+#ifdef HWRENDER
+ || cv_grshearing.value
+#endif
+ )
+ G_SoftwareClipAimingPitch((INT32 *)&aimingangle);
+
if (rendermode == render_soft)
{
- // clip it in the case we are looking a hardware 90 degrees full aiming
- // (lmps, network and use F12...)
- G_SoftwareClipAimingPitch((INT32 *)&aimingangle);
- dy = AIMINGTODY(aimingangle) * viewwidth/BASEVIDWIDTH;
+ dy = (AIMINGTODY(aimingangle)>>FRACBITS) * viewwidth/BASEVIDWIDTH;
yslope = &yslopetab[viewheight*8 - (viewheight/2 + dy)];
}
centery = (viewheight/2) + dy;
centeryfrac = centery<0 && SHORT(patch.topoffset)
+
@@ -222,7 +223,6 @@
-
@@ -488,4 +488,4 @@
-
\ No newline at end of file
+
diff --git a/src/sdl/Srb2SDL-vc10.vcxproj.filters b/src/sdl/Srb2SDL-vc10.vcxproj.filters
index 8556627b..9e5b9837 100644
--- a/src/sdl/Srb2SDL-vc10.vcxproj.filters
+++ b/src/sdl/Srb2SDL-vc10.vcxproj.filters
@@ -231,9 +231,6 @@
Hw_Hardware
-
- Hw_Hardware
-
Hw_Hardware
@@ -639,7 +636,7 @@
Hw_Hardware
-
+
Hw_Hardware
@@ -924,4 +921,4 @@
SDLApp
-
\ No newline at end of file
+
diff --git a/src/sdl/Srb2SDL-vc9.vcproj b/src/sdl/Srb2SDL-vc9.vcproj
index 3898aeba..b21eedb8 100644
--- a/src/sdl/Srb2SDL-vc9.vcproj
+++ b/src/sdl/Srb2SDL-vc9.vcproj
@@ -2410,10 +2410,6 @@
RelativePath="..\hardware\hw_drv.h"
>
-
-
diff --git a/src/sdl/Srb2SDL.dsp b/src/sdl/Srb2SDL.dsp
index 879113ca..ce35e2e2 100644
--- a/src/sdl/Srb2SDL.dsp
+++ b/src/sdl/Srb2SDL.dsp
@@ -7,19 +7,19 @@
CFG=Srb2SDL - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
-!MESSAGE
+!MESSAGE
!MESSAGE NMAKE /f "Srb2SDL.mak".
-!MESSAGE
+!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
+!MESSAGE
!MESSAGE NMAKE /f "Srb2SDL.mak" CFG="Srb2SDL - Win32 Debug"
-!MESSAGE
+!MESSAGE
!MESSAGE Possible choices for configuration are:
-!MESSAGE
+!MESSAGE
!MESSAGE "Srb2SDL - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "Srb2SDL - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE
+!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
@@ -85,7 +85,7 @@ LINK32=link.exe
# ADD LINK32 SDL.lib SDL_mixer.lib user32.lib advapi32.lib ws2_32.lib /nologo /subsystem:console /pdb:"C:\srb2demo2\srb2sdldebug.pdb" /debug /machine:I386 /out:"C:\srb2demo2\srb2sdldebug.exe" /pdbtype:sept
# SUBTRACT LINK32 /pdb:none
-!ENDIF
+!ENDIF
# Begin Target
@@ -213,7 +213,7 @@ SOURCE=.\SDL_main\SDL_win32_main.c
# PROP Exclude_From_Build 1
-!ENDIF
+!ENDIF
# End Source File
# Begin Source File
@@ -274,7 +274,7 @@ InputName=tmap
# End Custom Build
-!ENDIF
+!ENDIF
# End Source File
# Begin Source File
@@ -308,7 +308,7 @@ InputName=tmap_mmx
# End Custom Build
-!ENDIF
+!ENDIF
# End Source File
# Begin Source File
@@ -339,7 +339,7 @@ InputName=tmap_vc
# End Custom Build
-!ENDIF
+!ENDIF
# End Source File
# End Group
@@ -576,10 +576,6 @@ SOURCE=..\hardware\hw_drv.h
# End Source File
# Begin Source File
-SOURCE=..\hardware\hw_glide.h
-# End Source File
-# Begin Source File
-
SOURCE=..\hardware\hw_glob.h
# End Source File
# Begin Source File
diff --git a/src/sdl/Srb2SDL.props b/src/sdl/Srb2SDL.props
index 260f81ee..75839a5b 100644
--- a/src/sdl/Srb2SDL.props
+++ b/src/sdl/Srb2SDL.props
@@ -5,7 +5,10 @@
- USE_WGL_SWAP;DIRECTFULLSCREEN;HAVE_SDL;HWRENDER;HW3SOUND;HAVE_FILTER;HAVE_MIXER;SDLMAIN;%(PreprocessorDefinitions)
+
+ HAVE_ZLIB;HAVE_LIBGME;USE_WGL_SWAP;DIRECTFULLSCREEN;HAVE_SDL;HWRENDER;HW3SOUND;HAVE_FILTER;HAVE_MIXER;SDLMAIN;%(PreprocessorDefinitions)
+
+ USE_WGL_SWAP;DIRECTFULLSCREEN;HAVE_SDL;HWRENDER;HW3SOUND;HAVE_FILTER;HAVE_MIXER;SDLMAIN;%(PreprocessorDefinitions)
diff --git a/src/sdl/hwsym_sdl.c b/src/sdl/hwsym_sdl.c
index 4e083b4c..09910baf 100644
--- a/src/sdl/hwsym_sdl.c
+++ b/src/sdl/hwsym_sdl.c
@@ -75,7 +75,8 @@ void *hwSym(const char *funcName,void *handle)
void *funcPointer = NULL;
#ifdef HWRENDER
if (0 == strcmp("SetPalette", funcName))
- funcPointer = &OglSdlSetPalette;
+ funcPointer = &OglSdlSetPalette;
+
GETFUNC(Init);
GETFUNC(Draw2DLine);
GETFUNC(DrawPolygon);
@@ -90,7 +91,6 @@ void *hwSym(const char *funcName,void *handle)
GETFUNC(DrawModel);
GETFUNC(CreateModelVBOs);
GETFUNC(SetTransform);
- GETFUNC(GetRenderVersion);
GETFUNC(PostImgRedraw);
GETFUNC(FlushScreenTextures);
GETFUNC(StartScreenWipe);
@@ -100,6 +100,15 @@ void *hwSym(const char *funcName,void *handle)
GETFUNC(MakeScreenTexture);
GETFUNC(MakeScreenFinalTexture);
GETFUNC(DrawScreenFinalTexture);
+
+ GETFUNC(LoadShaders);
+ GETFUNC(KillShaders);
+ GETFUNC(SetShader);
+ GETFUNC(UnSetShader);
+
+ GETFUNC(LoadCustomShader);
+ GETFUNC(InitCustomShaders);
+
#else //HWRENDER
if (0 == strcmp("FinishUpdate", funcName))
return funcPointer; //&FinishUpdate;
diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c
index 42e0a917..2ff7a83c 100644
--- a/src/sdl/i_video.c
+++ b/src/sdl/i_video.c
@@ -351,11 +351,6 @@ static INT32 Impl_SDL_Scancode_To_Keycode(SDL_Scancode code)
case SDL_SCANCODE_RGUI: return KEY_RIGHTWIN;
default: break;
}
-#ifdef HWRENDER
- DBG_Printf("Unknown incoming scancode: %d, represented %c\n",
- code,
- SDL_GetKeyName(SDL_GetKeyFromScancode(code)));
-#endif
return 0;
}
@@ -635,11 +630,6 @@ static void Impl_HandleWindowEvent(SDL_WindowEvent evt)
if (cv_usemouse.value) I_StartupMouse();
}
//else firsttimeonmouse = SDL_FALSE;
-
- capslock = !!( SDL_GetModState() & KMOD_CAPS );// in case CL changes
-
- if (USE_MOUSEINPUT)
- SDLdoGrabMouse();
}
else if (!mousefocus && !kbfocus)
{
@@ -1296,6 +1286,8 @@ void I_StartupMouse(void)
//
void I_OsPolling(void)
{
+ SDL_Keymod mod;
+
if (consolevent)
I_GetConsoleEvents();
if (SDL_WasInit(SDL_INIT_JOYSTICK) == SDL_INIT_JOYSTICK)
@@ -1310,6 +1302,18 @@ void I_OsPolling(void)
I_GetMouseEvents();
I_GetEvent();
+
+ mod = SDL_GetModState();
+ /* Handle here so that our state is always synched with the system. */
+ shiftdown = ctrldown = altdown = 0;
+ capslock = false;
+ if (mod & KMOD_LSHIFT) shiftdown |= 1;
+ if (mod & KMOD_RSHIFT) shiftdown |= 2;
+ if (mod & KMOD_LCTRL) ctrldown |= 1;
+ if (mod & KMOD_RCTRL) ctrldown |= 2;
+ if (mod & KMOD_LALT) altdown |= 1;
+ if (mod & KMOD_RALT) altdown |= 2;
+ if (mod & KMOD_CAPS) capslock = true;
}
//
@@ -1828,9 +1832,11 @@ void I_StartupGraphics(void)
framebuffer = SDL_TRUE;
}
if (M_CheckParm("-software"))
- {
rendermode = render_soft;
- }
+#ifdef HWRENDER
+ else if (M_CheckParm("-opengl"))
+ rendermode = render_opengl;
+#endif
usesdl2soft = M_CheckParm("-softblit");
borderlesswindow = M_CheckParm("-borderless");
@@ -1838,9 +1844,8 @@ void I_StartupGraphics(void)
//SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY>>1,SDL_DEFAULT_REPEAT_INTERVAL<<2);
VID_Command_ModeList_f();
#ifdef HWRENDER
- if (M_CheckParm("-opengl") || rendermode == render_opengl)
+ if (rendermode == render_opengl)
{
- rendermode = render_opengl;
HWD.pfnInit = hwSym("Init",NULL);
HWD.pfnFinishUpdate = NULL;
HWD.pfnDraw2DLine = hwSym("Draw2DLine",NULL);
@@ -1857,7 +1862,6 @@ void I_StartupGraphics(void)
HWD.pfnDrawModel = hwSym("DrawModel",NULL);
HWD.pfnCreateModelVBOs = hwSym("CreateModelVBOs",NULL);
HWD.pfnSetTransform = hwSym("SetTransform",NULL);
- HWD.pfnGetRenderVersion = hwSym("GetRenderVersion",NULL);
HWD.pfnPostImgRedraw = hwSym("PostImgRedraw",NULL);
HWD.pfnFlushScreenTextures=hwSym("FlushScreenTextures",NULL);
HWD.pfnStartScreenWipe = hwSym("StartScreenWipe",NULL);
@@ -1867,13 +1871,17 @@ void I_StartupGraphics(void)
HWD.pfnMakeScreenTexture= hwSym("MakeScreenTexture",NULL);
HWD.pfnMakeScreenFinalTexture=hwSym("MakeScreenFinalTexture",NULL);
HWD.pfnDrawScreenFinalTexture=hwSym("DrawScreenFinalTexture",NULL);
- // check gl renderer lib
- if (HWD.pfnGetRenderVersion() != VERSION)
- I_Error("%s", M_GetText("The version of the renderer doesn't match the version of the executable\nBe sure you have installed SRB2Kart properly.\n"));
- if (!HWD.pfnInit(I_Error)) // let load the OpenGL library
- {
+
+ HWD.pfnLoadShaders = hwSym("LoadShaders",NULL);
+ HWD.pfnKillShaders = hwSym("KillShaders",NULL);
+ HWD.pfnSetShader = hwSym("SetShader",NULL);
+ HWD.pfnUnSetShader = hwSym("UnSetShader",NULL);
+
+ HWD.pfnLoadCustomShader = hwSym("LoadCustomShader",NULL);
+ HWD.pfnInitCustomShaders = hwSym("InitCustomShaders",NULL);
+
+ if (!HWD.pfnInit()) // load the OpenGL library
rendermode = render_soft;
- }
}
#endif
diff --git a/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj b/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj
index de12201f..ee0bf469 100644
--- a/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj
+++ b/src/sdl/macosx/Srb2mac.pbproj/project.pbxproj
@@ -1064,13 +1064,6 @@
path = ../../hardware/hw_drv.h;
refType = 2;
};
- 8417773B085A106C000C01D8 = {
- fileEncoding = 30;
- isa = PBXFileReference;
- name = hw_glide.h;
- path = ../../hardware/hw_glide.h;
- refType = 2;
- };
8417773C085A106C000C01D8 = {
fileEncoding = 30;
isa = PBXFileReference;
diff --git a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj
index a8ecbf7f..00930bfb 100644
--- a/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj
+++ b/src/sdl/macosx/Srb2mac.xcodeproj/project.pbxproj
@@ -181,7 +181,6 @@
1E44AE640B67CC2B00BAD059 /* hw_cache.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_cache.c; path = ../../hardware/hw_cache.c; sourceTree = SOURCE_ROOT; };
1E44AE650B67CC2B00BAD059 /* hw_dll.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_dll.h; path = ../../hardware/hw_dll.h; sourceTree = SOURCE_ROOT; };
1E44AE660B67CC2B00BAD059 /* hw_drv.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_drv.h; path = ../../hardware/hw_drv.h; sourceTree = SOURCE_ROOT; };
- 1E44AE670B67CC2B00BAD059 /* hw_glide.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_glide.h; path = ../../hardware/hw_glide.h; sourceTree = SOURCE_ROOT; };
1E44AE680B67CC2B00BAD059 /* hw_light.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_light.c; path = ../../hardware/hw_light.c; sourceTree = SOURCE_ROOT; };
1E44AE690B67CC2B00BAD059 /* hw_light.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_light.h; path = ../../hardware/hw_light.h; sourceTree = SOURCE_ROOT; };
1E44AE6A0B67CC2B00BAD059 /* hw3sound.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw3sound.h; path = ../../hardware/hw3sound.h; sourceTree = SOURCE_ROOT; };
@@ -535,7 +534,6 @@
1E44AE640B67CC2B00BAD059 /* hw_cache.c */,
1E44AE650B67CC2B00BAD059 /* hw_dll.h */,
1E44AE660B67CC2B00BAD059 /* hw_drv.h */,
- 1E44AE670B67CC2B00BAD059 /* hw_glide.h */,
1E44AE680B67CC2B00BAD059 /* hw_light.c */,
1E44AE690B67CC2B00BAD059 /* hw_light.h */,
1E44AE6A0B67CC2B00BAD059 /* hw3sound.h */,
@@ -1219,7 +1217,7 @@
C01FCF4B08A954540054247B /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
- CURRENT_PROJECT_VERSION = 2.1.23;
+ CURRENT_PROJECT_VERSION = 2.1.24;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
NORMALSRB2,
@@ -1231,7 +1229,7 @@
C01FCF4C08A954540054247B /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
- CURRENT_PROJECT_VERSION = 2.1.23;
+ CURRENT_PROJECT_VERSION = 2.1.24;
GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_PREPROCESSOR_DEFINITIONS = (
diff --git a/src/sdl/ogl_sdl.c b/src/sdl/ogl_sdl.c
index 4347b35b..b006047f 100644
--- a/src/sdl/ogl_sdl.c
+++ b/src/sdl/ogl_sdl.c
@@ -36,6 +36,7 @@
#ifdef HWRENDER
#include "../hardware/r_opengl/r_opengl.h"
+#include "../hardware/hw_main.h"
#include "ogl_sdl.h"
#include "../i_system.h"
#include "hwsym_sdl.h"
@@ -89,15 +90,15 @@ boolean LoadGL(void)
const char *OGLLibname = NULL;
const char *GLULibname = NULL;
- if (M_CheckParm ("-OGLlib") && M_IsNextParm())
+ if (M_CheckParm("-OGLlib") && M_IsNextParm())
OGLLibname = M_GetNextParm();
if (SDL_GL_LoadLibrary(OGLLibname) != 0)
{
- I_OutputMsg("Could not load OpenGL Library: %s\n"
+ CONS_Alert(CONS_ERROR, "Could not load OpenGL Library: %s\n"
"Falling back to Software mode.\n", SDL_GetError());
- if (!M_CheckParm ("-OGLlib"))
- I_OutputMsg("If you know what is the OpenGL library's name, use -OGLlib\n");
+ if (!M_CheckParm("-OGLlib"))
+ CONS_Printf("If you know what is the OpenGL library's name, use -OGLlib\n");
return 0;
}
@@ -117,7 +118,7 @@ boolean LoadGL(void)
GLULibname = NULL;
#endif
- if (M_CheckParm ("-GLUlib") && M_IsNextParm())
+ if (M_CheckParm("-GLUlib") && M_IsNextParm())
GLULibname = M_GetNextParm();
if (GLULibname)
@@ -127,15 +128,15 @@ boolean LoadGL(void)
return SetupGLfunc();
else
{
- I_OutputMsg("Could not load GLU Library: %s\n", GLULibname);
- if (!M_CheckParm ("-GLUlib"))
- I_OutputMsg("If you know what is the GLU library's name, use -GLUlib\n");
+ CONS_Alert(CONS_ERROR, "Could not load GLU Library: %s\n", GLULibname);
+ if (!M_CheckParm("-GLUlib"))
+ CONS_Printf("If you know what is the GLU library's name, use -GLUlib\n");
}
}
else
{
- I_OutputMsg("Could not load GLU Library\n");
- I_OutputMsg("If you know what is the GLU library's name, use -GLUlib\n");
+ CONS_Alert(CONS_ERROR, "Could not load GLU Library\n");
+ CONS_Printf("If you know what is the GLU library's name, use -GLUlib\n");
}
#endif
return SetupGLfunc();
@@ -151,31 +152,29 @@ boolean LoadGL(void)
*/
boolean OglSdlSurface(INT32 w, INT32 h)
{
- INT32 cbpp;
- const GLvoid *glvendor = NULL, *glrenderer = NULL, *glversion = NULL;
+ INT32 cbpp = cv_scr_depth.value < 16 ? 16 : cv_scr_depth.value;
+ static boolean first_init = false;
- cbpp = cv_scr_depth.value < 16 ? 16 : cv_scr_depth.value;
-
- glvendor = pglGetString(GL_VENDOR);
- // Get info and extensions.
- //BP: why don't we make it earlier ?
- //Hurdler: we cannot do that before intialising gl context
- glrenderer = pglGetString(GL_RENDERER);
- glversion = pglGetString(GL_VERSION);
- gl_extensions = pglGetString(GL_EXTENSIONS);
-
- DBG_Printf("Vendor : %s\n", glvendor);
- DBG_Printf("Renderer : %s\n", glrenderer);
- DBG_Printf("Version : %s\n", glversion);
- DBG_Printf("Extensions : %s\n", gl_extensions);
oglflags = 0;
+ if (!first_init)
+ {
+ gl_version = pglGetString(GL_VERSION);
+ gl_renderer = pglGetString(GL_RENDERER);
+ gl_extensions = pglGetString(GL_EXTENSIONS);
+
+ GL_DBG_Printf("OpenGL %s\n", gl_version);
+ GL_DBG_Printf("GPU: %s\n", gl_renderer);
+ GL_DBG_Printf("Extensions: %s\n", gl_extensions);
+ }
+ first_init = true;
+
if (isExtAvailable("GL_EXT_texture_filter_anisotropic", gl_extensions))
pglGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maximumAnisotropy);
else
maximumAnisotropy = 1;
- SetupGLFunc13();
+ SetupGLFunc4();
granisotropicmode_cons_t[1].value = maximumAnisotropy;
@@ -221,7 +220,7 @@ void OglSdlFinishUpdate(boolean waitvbl)
HWR_DrawScreenFinalTexture(realwidth, realheight);
}
-EXPORT void HWRAPI( OglSdlSetPalette) (RGBA_t *palette, RGBA_t *pgamma)
+EXPORT void HWRAPI(OglSdlSetPalette) (RGBA_t *palette, RGBA_t *pgamma)
{
INT32 i = -1;
UINT32 redgamma = pgamma->s.red, greengamma = pgamma->s.green,
diff --git a/src/sdl12/Srb2SDL-vc10.vcxproj b/src/sdl12/Srb2SDL-vc10.vcxproj
index 0ac7e9e5..d7f13751 100644
--- a/src/sdl12/Srb2SDL-vc10.vcxproj
+++ b/src/sdl12/Srb2SDL-vc10.vcxproj
@@ -1375,7 +1375,6 @@
-
diff --git a/src/sdl12/Srb2SDL-vc9.vcproj b/src/sdl12/Srb2SDL-vc9.vcproj
index fa386e38..9d807be2 100644
--- a/src/sdl12/Srb2SDL-vc9.vcproj
+++ b/src/sdl12/Srb2SDL-vc9.vcproj
@@ -2410,10 +2410,6 @@
RelativePath="..\hardware\hw_drv.h"
>
-
-
diff --git a/src/sdl12/Srb2SDL.dsp b/src/sdl12/Srb2SDL.dsp
index 879113ca..ce35e2e2 100644
--- a/src/sdl12/Srb2SDL.dsp
+++ b/src/sdl12/Srb2SDL.dsp
@@ -7,19 +7,19 @@
CFG=Srb2SDL - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
-!MESSAGE
+!MESSAGE
!MESSAGE NMAKE /f "Srb2SDL.mak".
-!MESSAGE
+!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
+!MESSAGE
!MESSAGE NMAKE /f "Srb2SDL.mak" CFG="Srb2SDL - Win32 Debug"
-!MESSAGE
+!MESSAGE
!MESSAGE Possible choices for configuration are:
-!MESSAGE
+!MESSAGE
!MESSAGE "Srb2SDL - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "Srb2SDL - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE
+!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
@@ -85,7 +85,7 @@ LINK32=link.exe
# ADD LINK32 SDL.lib SDL_mixer.lib user32.lib advapi32.lib ws2_32.lib /nologo /subsystem:console /pdb:"C:\srb2demo2\srb2sdldebug.pdb" /debug /machine:I386 /out:"C:\srb2demo2\srb2sdldebug.exe" /pdbtype:sept
# SUBTRACT LINK32 /pdb:none
-!ENDIF
+!ENDIF
# Begin Target
@@ -213,7 +213,7 @@ SOURCE=.\SDL_main\SDL_win32_main.c
# PROP Exclude_From_Build 1
-!ENDIF
+!ENDIF
# End Source File
# Begin Source File
@@ -274,7 +274,7 @@ InputName=tmap
# End Custom Build
-!ENDIF
+!ENDIF
# End Source File
# Begin Source File
@@ -308,7 +308,7 @@ InputName=tmap_mmx
# End Custom Build
-!ENDIF
+!ENDIF
# End Source File
# Begin Source File
@@ -339,7 +339,7 @@ InputName=tmap_vc
# End Custom Build
-!ENDIF
+!ENDIF
# End Source File
# End Group
@@ -576,10 +576,6 @@ SOURCE=..\hardware\hw_drv.h
# End Source File
# Begin Source File
-SOURCE=..\hardware\hw_glide.h
-# End Source File
-# Begin Source File
-
SOURCE=..\hardware\hw_glob.h
# End Source File
# Begin Source File
diff --git a/src/sdl12/hwsym_sdl.c b/src/sdl12/hwsym_sdl.c
index 49340138..b6f6313f 100644
--- a/src/sdl12/hwsym_sdl.c
+++ b/src/sdl12/hwsym_sdl.c
@@ -49,14 +49,6 @@
#define _CREATE_DLL_ // necessary for Unix AND Windows
-#ifdef HWRENDER
-#include "../hardware/hw_drv.h"
-#include "ogl_sdl.h"
-#ifdef STATIC_OPENGL
-#include "../hardware/r_opengl/r_opengl.h"
-#endif
-#endif
-
#ifdef HW3SOUND
#include "../hardware/hw3dsdrv.h"
#endif
@@ -79,39 +71,8 @@
void *hwSym(const char *funcName,void *handle)
{
void *funcPointer = NULL;
-#ifdef HWRENDER
- if (0 == strcmp("SetPalette", funcName))
- funcPointer = &OglSdlSetPalette;
- GETFUNC(Init);
- GETFUNC(Draw2DLine);
- GETFUNC(DrawPolygon);
- GETFUNC(SetBlend);
- GETFUNC(ClearBuffer);
- GETFUNC(SetTexture);
- GETFUNC(ReadRect);
- GETFUNC(GClipRect);
- GETFUNC(ClearMipMapCache);
- GETFUNC(SetSpecialState);
- GETFUNC(GetTextureUsed);
- GETFUNC(DrawMD2);
- GETFUNC(DrawMD2i);
- GETFUNC(SetTransform);
- GETFUNC(GetRenderVersion);
-#ifdef SHUFFLE
- GETFUNC(PostImgRedraw);
-#endif //SHUFFLE
- GETFUNC(FlushScreenTextures);
- GETFUNC(StartScreenWipe);
- GETFUNC(EndScreenWipe);
- GETFUNC(DoScreenWipe);
- GETFUNC(DrawIntermissionBG);
- GETFUNC(MakeScreenTexture);
- GETFUNC(MakeScreenFinalTexture);
- GETFUNC(DrawScreenFinalTexture);
-#else //HWRENDER
if (0 == strcmp("FinishUpdate", funcName))
return funcPointer; //&FinishUpdate;
-#endif //!HWRENDER
#ifdef STATIC3DS
GETFUNC(Startup);
GETFUNC(AddSfx);
diff --git a/src/sdl12/i_video.c b/src/sdl12/i_video.c
index a2a20c61..45ce67cf 100644
--- a/src/sdl12/i_video.c
+++ b/src/sdl12/i_video.c
@@ -104,13 +104,6 @@
#include "../console.h"
#include "../command.h"
#include "sdlmain.h"
-#ifdef HWRENDER
-#include "../hardware/hw_main.h"
-#include "../hardware/hw_drv.h"
-// For dynamic referencing of HW rendering functions
-#include "hwsym_sdl.h"
-#include "ogl_sdl.h"
-#endif
#ifdef REMOTE_DEBUGGING
#ifdef _WII
@@ -169,9 +162,7 @@ static SDL_bool disable_mouse = SDL_FALSE;
static INT32 firstEntry = 0;
// SDL vars
-#ifndef HWRENDER //[segabor] !!! I had problem compiling this source with gcc 3.3
static SDL_Surface *vidSurface = NULL;
-#endif
static SDL_Surface *bufSurface = NULL;
static SDL_Surface *icoSurface = NULL;
static SDL_Color localPalette[256];
@@ -664,11 +655,7 @@ static void VID_Command_ModeList_f(void)
{
#if !defined (DC) && !defined (_WIN32_WCE) && !defined (_PSP) && !defined(GP2X)
INT32 i;
-#ifdef HWRENDER
- if (rendermode == render_opengl)
- modeList = SDL_ListModes(NULL, SDL_OPENGL|SDL_FULLSCREEN);
- else
-#endif
+
modeList = SDL_ListModes(NULL, surfaceFlagsF|SDL_HWSURFACE); //Alam: At least hardware surface
if (modeList == (SDL_Rect **)0 && cv_fullscreen.value)
@@ -1277,11 +1264,7 @@ void I_UpdateNoBlit(void)
{
if (!vidSurface)
return;
-#ifdef HWRENDER
- if (rendermode != render_soft)
- OglSdlFinishUpdate(cv_vidwait.value);
- else
-#endif
+
if (vidSurface->flags&SDL_DOUBLEBUF)
SDL_Flip(vidSurface);
else if (exposevideo)
@@ -1494,12 +1477,6 @@ void I_FinishUpdate(void)
else
I_OutputMsg("%s\n",SDL_GetError());
}
-#ifdef HWRENDER
- else
- {
- OglSdlFinishUpdate(cv_vidwait.value);
- }
-#endif
exposevideo = SDL_FALSE;
}
@@ -1646,11 +1623,6 @@ void VID_PrepareModeList(void)
firstEntry = 0;
-#ifdef HWRENDER
- if (rendermode == render_opengl)
- modeList = SDL_ListModes(NULL, SDL_OPENGL|SDL_FULLSCREEN);
- else
-#endif
modeList = SDL_ListModes(NULL, surfaceFlagsF|SDL_HWSURFACE); //Alam: At least hardware surface
if (disable_fullscreen?0:cv_fullscreen.value) // only fullscreen needs preparation
@@ -1786,23 +1758,6 @@ INT32 VID_SetMode(INT32 modeNum)
I_Error("Could not set vidmode: %s\n",SDL_GetError());
}
}
-#ifdef HWRENDER
- else // (render_soft != rendermode)
- {
- if (!OglSdlSurface(vid.width, vid.height, true))
- {
- cv_fullscreen.value = 0;
- modeNum = VID_GetModeForSize(vid.width,vid.height);
- vid.width = windowedModes[modeNum][0];
- vid.height = windowedModes[modeNum][1];
- if (!OglSdlSurface(vid.width, vid.height,false))
- I_Error("Could not set vidmode: %s\n",SDL_GetError());
- }
-
- realwidth = (Uint16)vid.width;
- realheight = (Uint16)vid.height;
- }
-#endif
}
else //(cv_fullscreen.value)
{
@@ -1815,15 +1770,6 @@ INT32 VID_SetMode(INT32 modeNum)
if (!vidSurface)
I_Error("Could not set vidmode: %s\n",SDL_GetError());
}
-#ifdef HWRENDER
- else //(render_soft != rendermode)
- {
- if (!OglSdlSurface(vid.width, vid.height, false))
- I_Error("Could not set vidmode: %s\n",SDL_GetError());
- realwidth = (Uint16)vid.width;
- realheight = (Uint16)vid.height;
- }
-#endif
}
vid.modenum = VID_GetModeForSize(vidSurface->w,vidSurface->h);
@@ -1950,92 +1896,31 @@ void I_StartupGraphics(void)
//DisableAero(); //also disable Aero on Vista
#endif
-#ifdef HWRENDER
- if (M_CheckParm("-opengl") || rendermode == render_opengl)
- {
- rendermode = render_opengl;
- HWD.pfnInit = hwSym("Init",NULL);
- HWD.pfnFinishUpdate = NULL;
- HWD.pfnDraw2DLine = hwSym("Draw2DLine",NULL);
- HWD.pfnDrawPolygon = hwSym("DrawPolygon",NULL);
- HWD.pfnSetBlend = hwSym("SetBlend",NULL);
- HWD.pfnClearBuffer = hwSym("ClearBuffer",NULL);
- HWD.pfnSetTexture = hwSym("SetTexture",NULL);
- HWD.pfnReadRect = hwSym("ReadRect",NULL);
- HWD.pfnGClipRect = hwSym("GClipRect",NULL);
- HWD.pfnClearMipMapCache = hwSym("ClearMipMapCache",NULL);
- HWD.pfnSetSpecialState = hwSym("SetSpecialState",NULL);
- HWD.pfnSetPalette = hwSym("SetPalette",NULL);
- HWD.pfnGetTextureUsed = hwSym("GetTextureUsed",NULL);
- HWD.pfnDrawMD2 = hwSym("DrawMD2",NULL);
- HWD.pfnDrawMD2i = hwSym("DrawMD2i",NULL);
- HWD.pfnSetTransform = hwSym("SetTransform",NULL);
- HWD.pfnGetRenderVersion = hwSym("GetRenderVersion",NULL);
-#ifdef SHUFFLE
- HWD.pfnPostImgRedraw = hwSym("PostImgRedraw",NULL);
-#endif
- HWD.pfnFlushScreenTextures=hwSym("FlushScreenTextures",NULL);
- HWD.pfnStartScreenWipe = hwSym("StartScreenWipe",NULL);
- HWD.pfnEndScreenWipe = hwSym("EndScreenWipe",NULL);
- HWD.pfnDoScreenWipe = hwSym("DoScreenWipe",NULL);
- HWD.pfnDrawIntermissionBG=hwSym("DrawIntermissionBG",NULL);
- HWD.pfnMakeScreenTexture= hwSym("MakeScreenTexture",NULL);
- // check gl renderer lib
- if (HWD.pfnGetRenderVersion() != VERSION)
- I_Error("%s", M_GetText("The version of the renderer doesn't match the version of the executable\nBe sure you have installed SRB2 properly.\n"));
-#if 1 //#ifdef _WIN32_WCE
- vid.width = BASEVIDWIDTH;
- vid.height = BASEVIDHEIGHT;
-#else
- vid.width = 640; // hack to make voodoo cards work in 640x480
- vid.height = 480;
-#endif
- if (HWD.pfnInit(I_Error)) // let load the OpenGL library
- {
- /*
- * We want at least 1 bit R, G, and B,
- * and at least 16 bpp. Why 1 bit? May be more?
- */
- SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 1);
- SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 1);
- SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 1);
- SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
- if (!OglSdlSurface(vid.width, vid.height, (USE_FULLSCREEN)))
- if (!OglSdlSurface(vid.width, vid.height, !(USE_FULLSCREEN)))
- rendermode = render_soft;
- }
- else
- rendermode = render_soft;
- }
-#else
rendermode = render_soft; //force software mode when there no HWRENDER code
-#endif
- if (render_soft == rendermode)
- {
#if defined(_WII)
- vid.width = 640;
- vid.height = 480;
+ vid.width = 640;
+ vid.height = 480;
#elif defined(_PS3)
- vid.width = 720;
- vid.height = 480;
+ vid.width = 720;
+ vid.height = 480;
#else
- vid.width = BASEVIDWIDTH;
- vid.height = BASEVIDHEIGHT;
+ vid.width = BASEVIDWIDTH;
+ vid.height = BASEVIDHEIGHT;
#endif
- SDLSetMode(vid.width, vid.height, BitsPerPixel, surfaceFlagsW);
- if (!vidSurface)
- {
- CONS_Printf(M_GetText("Could not set vidmode: %s\n") ,SDL_GetError());
- vid.rowbytes = 0;
- graphics_started = true;
- return;
- }
- vid.rowbytes = vid.width * vid.bpp;
- vid.direct = SDLGetDirect();
- vid.buffer = malloc(vid.rowbytes*vid.height*NUMSCREENS);
- if (vid.buffer) memset(vid.buffer,0x00,vid.rowbytes*vid.height*NUMSCREENS);
- else CONS_Printf("%s", M_GetText("Not enough memory for video buffer\n"));
+ SDLSetMode(vid.width, vid.height, BitsPerPixel, surfaceFlagsW);
+ if (!vidSurface)
+ {
+ CONS_Printf(M_GetText("Could not set vidmode: %s\n") ,SDL_GetError());
+ vid.rowbytes = 0;
+ graphics_started = true;
+ return;
}
+ vid.rowbytes = vid.width * vid.bpp;
+ vid.direct = SDLGetDirect();
+ vid.buffer = malloc(vid.rowbytes*vid.height*NUMSCREENS);
+ if (vid.buffer) memset(vid.buffer,0x00,vid.rowbytes*vid.height*NUMSCREENS);
+ else CONS_Printf("%s", M_GetText("Not enough memory for video buffer\n"));
+
if (M_CheckParm("-nomousegrab"))
mousegrabok = SDL_FALSE;
#ifdef _DEBUG
@@ -2091,10 +1976,6 @@ void I_ShutdownGraphics(void)
#endif
graphics_started = false;
CONS_Printf("%s", M_GetText("shut down\n"));
-#ifdef HWRENDER
- if (GLUhandle)
- hwClose(GLUhandle);
-#endif
#ifndef _arch_dreamcast
SDL_QuitSubSystem(SDL_INIT_VIDEO);
#endif
diff --git a/src/sdl12/macosx/Srb2mac.pbproj/project.pbxproj b/src/sdl12/macosx/Srb2mac.pbproj/project.pbxproj
index 1f8e3276..1fe2ea2d 100644
--- a/src/sdl12/macosx/Srb2mac.pbproj/project.pbxproj
+++ b/src/sdl12/macosx/Srb2mac.pbproj/project.pbxproj
@@ -1064,13 +1064,6 @@
path = ../../hardware/hw_drv.h;
refType = 2;
};
- 8417773B085A106C000C01D8 = {
- fileEncoding = 30;
- isa = PBXFileReference;
- name = hw_glide.h;
- path = ../../hardware/hw_glide.h;
- refType = 2;
- };
8417773C085A106C000C01D8 = {
fileEncoding = 30;
isa = PBXFileReference;
diff --git a/src/sdl12/macosx/Srb2mac.xcodeproj/project.pbxproj b/src/sdl12/macosx/Srb2mac.xcodeproj/project.pbxproj
index 69c544c5..9b9d33b7 100644
--- a/src/sdl12/macosx/Srb2mac.xcodeproj/project.pbxproj
+++ b/src/sdl12/macosx/Srb2mac.xcodeproj/project.pbxproj
@@ -181,7 +181,6 @@
1E44AE640B67CC2B00BAD059 /* hw_cache.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_cache.c; path = ../../hardware/hw_cache.c; sourceTree = SOURCE_ROOT; };
1E44AE650B67CC2B00BAD059 /* hw_dll.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_dll.h; path = ../../hardware/hw_dll.h; sourceTree = SOURCE_ROOT; };
1E44AE660B67CC2B00BAD059 /* hw_drv.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_drv.h; path = ../../hardware/hw_drv.h; sourceTree = SOURCE_ROOT; };
- 1E44AE670B67CC2B00BAD059 /* hw_glide.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_glide.h; path = ../../hardware/hw_glide.h; sourceTree = SOURCE_ROOT; };
1E44AE680B67CC2B00BAD059 /* hw_light.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = hw_light.c; path = ../../hardware/hw_light.c; sourceTree = SOURCE_ROOT; };
1E44AE690B67CC2B00BAD059 /* hw_light.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw_light.h; path = ../../hardware/hw_light.h; sourceTree = SOURCE_ROOT; };
1E44AE6A0B67CC2B00BAD059 /* hw3sound.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = hw3sound.h; path = ../../hardware/hw3sound.h; sourceTree = SOURCE_ROOT; };
@@ -535,7 +534,6 @@
1E44AE640B67CC2B00BAD059 /* hw_cache.c */,
1E44AE650B67CC2B00BAD059 /* hw_dll.h */,
1E44AE660B67CC2B00BAD059 /* hw_drv.h */,
- 1E44AE670B67CC2B00BAD059 /* hw_glide.h */,
1E44AE680B67CC2B00BAD059 /* hw_light.c */,
1E44AE690B67CC2B00BAD059 /* hw_light.h */,
1E44AE6A0B67CC2B00BAD059 /* hw3sound.h */,
@@ -1219,7 +1217,7 @@
C01FCF4B08A954540054247B /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
- CURRENT_PROJECT_VERSION = 2.1.23;
+ CURRENT_PROJECT_VERSION = 2.1.24;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
NORMALSRB2,
@@ -1231,7 +1229,7 @@
C01FCF4C08A954540054247B /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
- CURRENT_PROJECT_VERSION = 2.1.23;
+ CURRENT_PROJECT_VERSION = 2.1.24;
GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_PREPROCESSOR_DEFINITIONS = (
diff --git a/src/sdl12/ogl_sdl.c b/src/sdl12/ogl_sdl.c
deleted file mode 100644
index eb7e9996..00000000
--- a/src/sdl12/ogl_sdl.c
+++ /dev/null
@@ -1,317 +0,0 @@
-// Emacs style mode select -*- C++ -*-
-//-----------------------------------------------------------------------------
-//
-// Copyright (C) 1998-2000 by DooM Legacy Team.
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-//-----------------------------------------------------------------------------
-/// \file
-/// \brief SDL specific part of the OpenGL API for SRB2
-
-#ifdef _MSC_VER
-#pragma warning(disable : 4214 4244)
-#endif
-
-#ifdef HAVE_SDL
-
-#include "SDL.h"
-
-#ifdef _MSC_VER
-#pragma warning(default : 4214 4244)
-#endif
-
-#include "../doomdef.h"
-
-#ifdef HWRENDER
-#include "../hardware/r_opengl/r_opengl.h"
-#include "ogl_sdl.h"
-#include "../i_system.h"
-#include "hwsym_sdl.h"
-#include "../m_argv.h"
-
-#ifdef DEBUG_TO_FILE
-#include
-#if defined (_WIN32) && !defined (__CYGWIN__)
-#include
-#else
-#include
-#endif
-#include
-#include
-#endif
-
-#ifdef USE_WGL_SWAP
-PFNWGLEXTSWAPCONTROLPROC wglSwapIntervalEXT = NULL;
-#else
-typedef int (*PFNGLXSWAPINTERVALPROC) (int);
-PFNGLXSWAPINTERVALPROC glXSwapIntervalSGIEXT = NULL;
-#endif
-
-#ifndef STATIC_OPENGL
-PFNglClear pglClear;
-PFNglGetIntegerv pglGetIntegerv;
-PFNglGetString pglGetString;
-#endif
-
-#ifdef _PSP
-static const Uint32 WOGLFlags = SDL_HWSURFACE|SDL_OPENGL/*|SDL_RESIZABLE*/;
-static const Uint32 FOGLFlags = SDL_HWSURFACE|SDL_OPENGL|SDL_FULLSCREEN;
-#else
-static const Uint32 WOGLFlags = SDL_OPENGL/*|SDL_RESIZABLE*/;
-static const Uint32 FOGLFlags = SDL_OPENGL|SDL_FULLSCREEN;
-#endif
-
-/** \brief SDL video display surface
-*/
-SDL_Surface *vidSurface = NULL;
-INT32 oglflags = 0;
-void *GLUhandle = NULL;
-
-#ifndef STATIC_OPENGL
-void *GetGLFunc(const char *proc)
-{
- if (strncmp(proc, "glu", 3) == 0)
- {
- if (GLUhandle)
- return hwSym(proc, GLUhandle);
- else
- return NULL;
- }
- return SDL_GL_GetProcAddress(proc);
-}
-#endif
-
-boolean LoadGL(void)
-{
-#ifndef STATIC_OPENGL
- const char *OGLLibname = NULL;
- const char *GLULibname = NULL;
-
- if (M_CheckParm ("-OGLlib") && M_IsNextParm())
- OGLLibname = M_GetNextParm();
-
- if (SDL_GL_LoadLibrary(OGLLibname) != 0)
- {
- I_OutputMsg("Could not load OpenGL Library: %s\n"
- "Falling back to Software mode.\n", SDL_GetError());
- if (!M_CheckParm ("-OGLlib"))
- I_OutputMsg("If you know what is the OpenGL library's name, use -OGLlib\n");
- return 0;
- }
-
-#if 0
- GLULibname = "/proc/self/exe";
-#elif defined (_WIN32)
- GLULibname = "GLU32.DLL";
-#elif defined (__MACH__)
- GLULibname = "/System/Library/Frameworks/OpenGL.framework/Libraries/libGLU.dylib";
-#elif defined (macintos)
- GLULibname = "OpenGLLibrary";
-#elif defined (__unix__)
- GLULibname = "libGLU.so.1";
-#elif defined (__HAIKU__)
- GLULibname = "libGLU.so";
-#else
- GLULibname = NULL;
-#endif
-
- if (M_CheckParm ("-GLUlib") && M_IsNextParm())
- GLULibname = M_GetNextParm();
-
- if (GLULibname)
- {
- GLUhandle = hwOpen(GLULibname);
- if (GLUhandle)
- return SetupGLfunc();
- else
- {
- I_OutputMsg("Could not load GLU Library: %s\n", GLULibname);
- if (!M_CheckParm ("-GLUlib"))
- I_OutputMsg("If you know what is the GLU library's name, use -GLUlib\n");
- }
- }
- else
- {
- I_OutputMsg("Could not load GLU Library\n");
- I_OutputMsg("If you know what is the GLU library's name, use -GLUlib\n");
- }
-#endif
- return SetupGLfunc();
-}
-
-/** \brief The OglSdlSurface function
-
- \param w width
- \param h height
- \param isFullscreen if true, go fullscreen
-
- \return if true, changed video mode
-*/
-boolean OglSdlSurface(INT32 w, INT32 h, boolean isFullscreen)
-{
- INT32 cbpp;
- Uint32 OGLFlags;
- const GLvoid *glvendor = NULL, *glrenderer = NULL, *glversion = NULL;
-
- cbpp = cv_scr_depth.value < 16 ? 16 : cv_scr_depth.value;
-
- if (vidSurface)
- {
- //Alam: SDL_Video system free vidSurface for me
-#ifdef VOODOOSAFESWITCHING
- SDL_QuitSubSystem(SDL_INIT_VIDEO);
- SDL_InitSubSystem(SDL_INIT_VIDEO);
-#endif
- }
-
- if (isFullscreen)
- OGLFlags = FOGLFlags;
- else
- OGLFlags = WOGLFlags;
-
- cbpp = SDL_VideoModeOK(w, h, cbpp, OGLFlags);
- if (cbpp < 16)
- return true; //Alam: Let just say we did, ok?
-
- vidSurface = SDL_SetVideoMode(w, h, cbpp, OGLFlags);
- if (!vidSurface)
- return false;
-
- glvendor = pglGetString(GL_VENDOR);
- // Get info and extensions.
- //BP: why don't we make it earlier ?
- //Hurdler: we cannot do that before intialising gl context
- glrenderer = pglGetString(GL_RENDERER);
- glversion = pglGetString(GL_VERSION);
- gl_extensions = pglGetString(GL_EXTENSIONS);
-
- DBG_Printf("Vendor : %s\n", glvendor);
- DBG_Printf("Renderer : %s\n", glrenderer);
- DBG_Printf("Version : %s\n", glversion);
- DBG_Printf("Extensions : %s\n", gl_extensions);
- oglflags = 0;
-
-#ifdef _WIN32
- // BP: disable advenced feature that don't work on somes hardware
- // Hurdler: Now works on G400 with bios 1.6 and certified drivers 6.04
- if (strstr(glrenderer, "810")) oglflags |= GLF_NOZBUFREAD;
-#elif defined (unix) || defined (UNIXCOMMON)
- // disable advanced features not working on somes hardware
- if (strstr(glrenderer, "G200")) oglflags |= GLF_NOTEXENV;
- if (strstr(glrenderer, "G400")) oglflags |= GLF_NOTEXENV;
-#endif
- DBG_Printf("oglflags : 0x%X\n", oglflags );
-
-#ifdef USE_PALETTED_TEXTURE
- if (isExtAvailable("GL_EXT_paletted_texture", gl_extensions))
- glColorTableEXT = SDL_GL_GetProcAddress("glColorTableEXT");
- else
- glColorTableEXT = NULL;
-#endif
-
-#ifdef USE_WGL_SWAP
- if (isExtAvailable("WGL_EXT_swap_control", gl_extensions))
- wglSwapIntervalEXT = SDL_GL_GetProcAddress("wglSwapIntervalEXT");
- else
- wglSwapIntervalEXT = NULL;
-#else
- if (isExtAvailable("GLX_SGI_swap_control", gl_extensions))
- glXSwapIntervalSGIEXT = SDL_GL_GetProcAddress("glXSwapIntervalSGI");
- else
- glXSwapIntervalSGIEXT = NULL;
-#endif
-
-#ifndef KOS_GL_COMPATIBILITY
- if (isExtAvailable("GL_EXT_texture_filter_anisotropic", gl_extensions))
- pglGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &maximumAnisotropy);
- else
-#endif
- maximumAnisotropy = 0;
-
- SetupGLFunc13();
-
- granisotropicmode_cons_t[1].value = maximumAnisotropy;
-
- SetModelView(w, h);
- SetStates();
- pglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
-
- HWR_Startup();
-#ifdef KOS_GL_COMPATIBILITY
- textureformatGL = GL_ARGB4444;
-#else
- textureformatGL = cbpp > 16 ? GL_RGBA : GL_RGB5_A1;
-#endif
-
- return true;
-}
-
-/** \brief The OglSdlFinishUpdate function
-
- \param vidwait wait for video sync
-
- \return void
-*/
-void OglSdlFinishUpdate(boolean waitvbl)
-{
- static boolean oldwaitvbl = false;
- if (oldwaitvbl != waitvbl)
- {
-#ifdef USE_WGL_SWAP
- if (wglSwapIntervalEXT)
- wglSwapIntervalEXT(waitvbl);
-#else
- if (glXSwapIntervalSGIEXT)
- glXSwapIntervalSGIEXT(waitvbl);
-#endif
- }
- oldwaitvbl = waitvbl;
-
- SDL_GL_SwapBuffers();
-}
-
-EXPORT void HWRAPI( OglSdlSetPalette) (RGBA_t *palette, RGBA_t *pgamma)
-{
- INT32 i = -1;
- UINT32 redgamma = pgamma->s.red, greengamma = pgamma->s.green,
- bluegamma = pgamma->s.blue;
-
-#if 0 // changing the gamma to 127 is a bad idea
- i = SDL_SetGamma(byteasfloat(redgamma), byteasfloat(greengamma), byteasfloat(bluegamma));
-#endif
- if (i == 0) redgamma = greengamma = bluegamma = 0x7F; //Alam: cool
- for (i = 0; i < 256; i++)
- {
- myPaletteData[i].s.red = (UINT8)MIN((palette[i].s.red * redgamma) /127, 255);
- myPaletteData[i].s.green = (UINT8)MIN((palette[i].s.green * greengamma)/127, 255);
- myPaletteData[i].s.blue = (UINT8)MIN((palette[i].s.blue * bluegamma) /127, 255);
- myPaletteData[i].s.alpha = palette[i].s.alpha;
- }
-#ifdef USE_PALETTED_TEXTURE
- if (glColorTableEXT)
- {
- for (i = 0; i < 256; i++)
- {
- palette_tex[(3*i)+0] = palette[i].s.red;
- palette_tex[(3*i)+1] = palette[i].s.green;
- palette_tex[(3*i)+2] = palette[i].s.blue;
- }
- glColorTableEXT(GL_TEXTURE_2D, GL_RGB8, 256, GL_RGB, GL_UNSIGNED_BYTE, palette_tex);
- }
-#endif
- // on a chang�de palette, il faut recharger toutes les textures
- // jaja, und noch viel mehr ;-)
- Flush();
-}
-
-#endif //HWRENDER
-#endif //SDL
diff --git a/src/sdl12/ogl_sdl.h b/src/sdl12/ogl_sdl.h
deleted file mode 100644
index 43c28fa4..00000000
--- a/src/sdl12/ogl_sdl.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Emacs style mode select -*- C++ -*-
-//-----------------------------------------------------------------------------
-//
-// Copyright (C) 1998-2000 by DooM Legacy Team.
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 2
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//-----------------------------------------------------------------------------
-/// \file
-/// \brief SDL specific part of the OpenGL API for SRB2
-
-#include "../v_video.h"
-
-extern SDL_Surface *vidSurface;
-extern void *GLUhandle;
-
-boolean OglSdlSurface(INT32 w, INT32 h, boolean isFullscreen);
-
-void OglSdlFinishUpdate(boolean vidwait);
-
-#ifdef _CREATE_DLL_
-EXPORT void HWRAPI( OglSdlSetPalette ) (RGBA_t *palette, RGBA_t *pgamma);
-#endif
diff --git a/src/sounds.h b/src/sounds.h
index bb46ea9d..dfd0bbdc 100644
--- a/src/sounds.h
+++ b/src/sounds.h
@@ -54,7 +54,7 @@ typedef enum
} skinsound_t;
// free sfx for S_AddSoundFx()
-#define NUMSFXFREESLOTS 800 // Matches SOC Editor.
+#define NUMSFXFREESLOTS 1600 // Matches SOC Editor.
#define NUMSKINSFXSLOTS (MAXSKINS*NUMSKINSOUNDS)
//
diff --git a/src/st_stuff.c b/src/st_stuff.c
index 50bac3ee..aafc5255 100644
--- a/src/st_stuff.c
+++ b/src/st_stuff.c
@@ -203,7 +203,7 @@ void ST_Ticker(void)
}
// 0 is default, any others are special palettes.
-static INT32 st_palette = 0;
+INT32 st_palette = 0;
void ST_doPaletteStuff(void)
{
@@ -614,9 +614,7 @@ static void ST_drawDebugInfo(void)
}
if (cv_debug & DBG_MEMORY)
- {
V_DrawRightAlignedString(320, height, V_MONOSPACE, va("Heap used: %7sKB", sizeu1(Z_TagsUsage(0, INT32_MAX)>>10)));
- }
}
/*
@@ -2039,8 +2037,6 @@ static void ST_overlayDrawer(void)
break;
}
}
-
- ST_drawDebugInfo();
}
void ST_DrawDemoTitleEntry(void)
@@ -2142,4 +2138,5 @@ void ST_Drawer(void)
else
V_DrawFadeScreen(120, 15-timeinmap); // Then gradually fade out from there
}
+ ST_drawDebugInfo();
}
diff --git a/src/st_stuff.h b/src/st_stuff.h
index 16f7b881..5ed5dd1c 100644
--- a/src/st_stuff.h
+++ b/src/st_stuff.h
@@ -61,6 +61,7 @@ boolean ST_SameTeam(player_t *a, player_t *b);
//--------------------
extern boolean st_overlay; // sb overlay on or off when fullscreen
+extern INT32 st_palette; // 0 is default, any others are special palettes.
extern lumpnum_t st_borderpatchnum;
// patches, also used in intermission
diff --git a/src/v_video.c b/src/v_video.c
index 9233eda4..6292ffc6 100644
--- a/src/v_video.c
+++ b/src/v_video.c
@@ -27,7 +27,7 @@
#include "doomstat.h"
#ifdef HWRENDER
-#include "hardware/hw_glob.h"
+#include "hardware/hw_main.h"
#endif
// Each screen is [vid.width*vid.height];
@@ -58,29 +58,25 @@ static void CV_Gammaxxx_ONChange(void);
// - You can change them in software,
// but they won't do anything.
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 grfogdensity_cons_t[] = {{FRACUNIT/8, "MIN"}, {FRACUNIT*2, "MAX"}, {0, NULL}};
-consvar_t cv_grfovchange = {"gr_fovchange", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
+consvar_t cv_grshaders = {"gr_shaders", "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_grsoftwarefog = {"gr_softwarefog", "Off", CV_SAVE, grsoftwarefog_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL};
+consvar_t cv_grfogdensity = {"gr_fogdensity", "0.30", CV_SAVE|CV_FLOAT, grfogdensity_cons_t, 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_grgammared = {"gr_gammared", "127", CV_SAVE|CV_CALL, grgamma_cons_t,
CV_Gammaxxx_ONChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grgammagreen = {"gr_gammagreen", "127", CV_SAVE|CV_CALL, grgamma_cons_t,
CV_Gammaxxx_ONChange, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grgammablue = {"gr_gammablue", "127", CV_SAVE|CV_CALL, grgamma_cons_t,
CV_Gammaxxx_ONChange, 0, NULL, NULL, 0, 0, NULL};
-#ifdef ALAM_LIGHTING
-consvar_t cv_grdynamiclighting = {"gr_dynamiclighting", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
-consvar_t cv_grstaticlighting = {"gr_staticlighting", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
-consvar_t cv_grcoronas = {"gr_coronas", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
-consvar_t cv_grcoronasize = {"gr_coronasize", "1", CV_SAVE| CV_FLOAT, 0, NULL, 0, NULL, NULL, 0, 0, NULL};
-#endif
//static CV_PossibleValue_t CV_MD2[] = {{0, "Off"}, {1, "On"}, {2, "Old"}, {0, NULL}};
// console variables in development
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_grshearing = {"gr_shearing", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
consvar_t cv_grspritebillboarding = {"gr_spritebillboarding", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL};
#endif
@@ -350,7 +346,7 @@ void V_DrawFixedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_t
#ifdef HWRENDER
//if (rendermode != render_soft && !con_startup) // Why?
- if (rendermode != render_soft)
+ if (rendermode == render_opengl)
{
HWR_DrawFixedPatch((GLPatch_t *)patch, x, y, pscale, scrn, colormap);
return;
@@ -572,8 +568,7 @@ void V_DrawCroppedPatch(fixed_t x, fixed_t y, fixed_t pscale, INT32 scrn, patch_
return;
#ifdef HWRENDER
- // Done
- if (rendermode != render_soft && !con_startup)
+ if (rendermode == render_opengl)
{
HWR_DrawCroppedPatch((GLPatch_t*)patch,x,y,pscale,scrn,sx,sy,w,h);
return;
@@ -719,61 +714,6 @@ void V_DrawBlock(INT32 x, INT32 y, INT32 scrn, INT32 width, INT32 height, const
}
}
-static void V_BlitScaledPic(INT32 px1, INT32 py1, INT32 scrn, pic_t *pic);
-// Draw a linear pic, scaled, TOTALLY CRAP CODE!!! OPTIMISE AND ASM!!
-//
-void V_DrawScaledPic(INT32 rx1, INT32 ry1, INT32 scrn, INT32 lumpnum)
-{
-#ifdef HWRENDER
- if (rendermode != render_soft)
- {
- HWR_DrawPic(rx1, ry1, lumpnum);
- return;
- }
-#endif
-
- V_BlitScaledPic(rx1, ry1, scrn, W_CacheLumpNum(lumpnum, PU_CACHE));
-}
-
-static void V_BlitScaledPic(INT32 rx1, INT32 ry1, INT32 scrn, pic_t * pic)
-{
- INT32 dupx, dupy;
- INT32 x, y;
- UINT8 *src, *dest;
- INT32 width, height;
-
- width = SHORT(pic->width);
- height = SHORT(pic->height);
- scrn &= V_PARAMMASK;
-
- if (pic->mode != 0)
- {
- CONS_Debug(DBG_RENDER, "pic mode %d not supported in Software\n", pic->mode);
- return;
- }
-
- dest = screens[scrn] + max(0, ry1 * vid.width) + max(0, rx1);
- // y cliping to the screen
- if (ry1 + height * vid.dupy >= vid.width)
- height = (vid.width - ry1) / vid.dupy - 1;
- // WARNING no x clipping (not needed for the moment)
-
- for (y = max(0, -ry1 / vid.dupy); y < height; y++)
- {
- for (dupy = vid.dupy; dupy; dupy--)
- {
- src = pic->data + y * width;
- for (x = 0; x < width; x++)
- {
- for (dupx = vid.dupx; dupx; dupx--)
- *dest++ = *src;
- src++;
- }
- dest += vid.width - vid.dupx * width;
- }
- }
-}
-
//
// Fills a box of pixels with a single color, NOTE: scaled to screen size
//
@@ -786,7 +726,7 @@ void V_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c)
return;
#ifdef HWRENDER
- if (rendermode != render_soft && !con_startup)
+ if (rendermode == render_opengl)
{
HWR_DrawFill(x, y, w, h, c);
return;
@@ -906,7 +846,7 @@ void V_DrawFillConsoleMap(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c)
return;
#ifdef HWRENDER
- if (rendermode != render_soft && rendermode != render_none)
+ if (rendermode == render_opengl)
{
UINT32 hwcolor = V_GetHWConsBackColor();
HWR_DrawConsoleFill(x, y, w, h, hwcolor, c); // we still use the regular color stuff but only for flags. actual draw color is "hwcolor" for this.
@@ -1117,7 +1057,7 @@ void V_DrawFlatFill(INT32 x, INT32 y, INT32 w, INT32 h, lumpnum_t flatnum)
size_t size, lflatsize, flatshift;
#ifdef HWRENDER
- if (rendermode != render_soft && rendermode != render_none)
+ if (rendermode == render_opengl)
{
HWR_DrawFlatFill(x, y, w, h, flatnum);
return;
@@ -1317,7 +1257,7 @@ void V_DrawFadeConsBack(INT32 plines)
UINT8 *deststop, *buf;
#ifdef HWRENDER // not win32 only 19990829 by Kin
- if (rendermode != render_soft && rendermode != render_none)
+ if (rendermode == render_opengl)
{
UINT32 hwcolor = V_GetHWConsBackColor();
HWR_DrawConsoleBack(hwcolor, plines);
@@ -2423,8 +2363,7 @@ void V_DoPostProcessor(INT32 view, postimg_t type, INT32 param)
INT32 yoffset, xoffset;
#ifdef HWRENDER
- // draw a hardware converted patch
- if (rendermode != render_soft && rendermode != render_none)
+ if (rendermode != render_soft)
return;
#endif
diff --git a/src/v_video.h b/src/v_video.h
index c8485c17..c94a796f 100644
--- a/src/v_video.h
+++ b/src/v_video.h
@@ -142,9 +142,6 @@ void V_DrawContinueIcon(INT32 x, INT32 y, INT32 flags, INT32 skinnum, UINT8 skin
// Draw a linear block of pixels into the view buffer.
void V_DrawBlock(INT32 x, INT32 y, INT32 scrn, INT32 width, INT32 height, const UINT8 *src);
-// draw a pic_t, SCALED
-void V_DrawScaledPic (INT32 px1, INT32 py1, INT32 scrn, INT32 lumpnum);
-
// fill a box with a single color
void V_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c);
void V_DrawFillConsoleMap(INT32 x, INT32 y, INT32 w, INT32 h, INT32 c);
diff --git a/src/w_wad.c b/src/w_wad.c
index da82a276..f6ca297f 100644
--- a/src/w_wad.c
+++ b/src/w_wad.c
@@ -196,6 +196,7 @@ static inline void W_LoadDehackedLumpsPK3(UINT16 wadnum)
LUA_LoadLump(wadnum, posStart);
}
#endif
+
posStart = W_CheckNumForFolderStartPK3("SOC/", wadnum, 0);
if (posStart != INT16_MAX)
{
@@ -212,7 +213,6 @@ static inline void W_LoadDehackedLumpsPK3(UINT16 wadnum)
DEH_LoadDehackedLumpPwad(wadnum, posStart);
free(name);
}
-
}
}
@@ -764,6 +764,11 @@ UINT16 W_InitFile(const char *filename)
wadfiles[numwadfiles] = wadfile;
numwadfiles++; // must come BEFORE W_LoadDehackedLumps, so any addfile called by COM_BufInsertText called by Lua doesn't overwrite what we just loaded
+#ifdef HWRENDER
+ if (rendermode == render_opengl)
+ HWR_LoadShaders(numwadfiles - 1, (wadfile->type == RET_PK3));
+#endif
+
// TODO: HACK ALERT - Load Lua & SOC stuff right here. I feel like this should be out of this place, but... Let's stick with this for now.
switch (wadfile->type)
{
@@ -1532,6 +1537,7 @@ void *W_CachePatchName(const char *name, INT32 tag)
return W_CachePatchNum(W_GetNumForName("MISSING"), tag);
return W_CachePatchNum(num, tag);
}
+
#ifndef NOMD5
/**
@@ -1720,11 +1726,14 @@ int W_VerifyNMUSlumps(const char *filename)
{"RRINGS", 6}, // Rings HUD (not named as SBO)
{"YB_", 3}, // Intermission graphics, goes with the above
{"M_", 2}, // As does menu stuff
-
{"MKFNT", 5}, // Kart font changes
{"K_", 2}, // Kart graphic changes
{"MUSICDEF", 8}, // Kart song definitions
+#ifdef HWRENDER
+ {"SHADERS", 7},
+ {"SH_", 3},
+#endif
{NULL, 0},
};
return W_VerifyFile(filename, NMUSlist, false);
diff --git a/src/win32/CMakeLists.txt b/src/win32/CMakeLists.txt
index 39b01588..71ce88d0 100644
--- a/src/win32/CMakeLists.txt
+++ b/src/win32/CMakeLists.txt
@@ -1,10 +1,5 @@
file(GLOB SRB2_WIN_SOURCES *.c *.h *.rc)
-if(${SRB2_CONFIG_HWRENDER})
- set(SRB2_WIN_SOURCES ${SRB2_WIN_SOURCES} ${SRB2_HWRENDER_SOURCES} ${SRB2_HWRENDER_HEADERS})
- set(SRB2_WIN_SOURCES ${SRB2_WIN_SOURCES} ${SRB2_R_OPENGL_SOURCES} ${SRB2_R_OPENGL_HEADERS})
-endif()
-
add_executable(SRB2DD EXCLUDE_FROM_ALL WIN32
${SRB2_WIN_SOURCES}
)
diff --git a/src/win32/Srb2win-vc10.vcxproj b/src/win32/Srb2win-vc10.vcxproj
index ced3d128..65500d9b 100644
--- a/src/win32/Srb2win-vc10.vcxproj
+++ b/src/win32/Srb2win-vc10.vcxproj
@@ -91,6 +91,7 @@
+
@@ -222,19 +223,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -388,20 +376,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -502,4 +476,4 @@
-
\ No newline at end of file
+
diff --git a/src/win32/Srb2win-vc10.vcxproj.filters b/src/win32/Srb2win-vc10.vcxproj.filters
index 8f607796..e5401d72 100644
--- a/src/win32/Srb2win-vc10.vcxproj.filters
+++ b/src/win32/Srb2win-vc10.vcxproj.filters
@@ -87,30 +87,6 @@
Win32app
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
Hw_Hardware
@@ -480,45 +456,6 @@
Win32app
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
-
- Hw_Hardware
-
Hw_Hardware
@@ -897,4 +834,4 @@
A_Asm
-
\ No newline at end of file
+
diff --git a/src/win32/Srb2win-vc9.vcproj b/src/win32/Srb2win-vc9.vcproj
index a64b8638..cac081ad 100644
--- a/src/win32/Srb2win-vc9.vcproj
+++ b/src/win32/Srb2win-vc9.vcproj
@@ -2151,10 +2151,6 @@
RelativePath="..\hardware\hw_drv.h"
>
-
-
diff --git a/src/win32/Srb2win.dsp b/src/win32/Srb2win.dsp
index 501bd26b..c52873f7 100644
--- a/src/win32/Srb2win.dsp
+++ b/src/win32/Srb2win.dsp
@@ -7,19 +7,19 @@
CFG=Srb2win - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
-!MESSAGE
+!MESSAGE
!MESSAGE NMAKE /f "Srb2win.mak".
-!MESSAGE
+!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
+!MESSAGE
!MESSAGE NMAKE /f "Srb2win.mak" CFG="Srb2win - Win32 Debug"
-!MESSAGE
+!MESSAGE
!MESSAGE Possible choices for configuration are:
-!MESSAGE
+!MESSAGE
!MESSAGE "Srb2win - Win32 Release" (based on "Win32 (x86) Application")
!MESSAGE "Srb2win - Win32 Debug" (based on "Win32 (x86) Application")
-!MESSAGE
+!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
@@ -84,7 +84,7 @@ LINK32=link.exe
# ADD LINK32 dxguid.lib user32.lib gdi32.lib winmm.lib advapi32.lib ws2_32.lib dinput.lib /nologo /subsystem:windows /profile /debug /machine:I386 /out:"C:\srb2demo2\srb2debug.exe"
# SUBTRACT LINK32 /nodefaultlib
-!ENDIF
+!ENDIF
# Begin Target
@@ -148,7 +148,7 @@ SOURCE=.\Srb2win.rc
!ELSEIF "$(CFG)" == "Srb2win - Win32 Debug"
-!ENDIF
+!ENDIF
# End Source File
# Begin Source File
@@ -233,7 +233,7 @@ InputName=tmap
# End Custom Build
-!ENDIF
+!ENDIF
# End Source File
# Begin Source File
@@ -266,7 +266,7 @@ InputName=tmap_mmx
# End Custom Build
-!ENDIF
+!ENDIF
# End Source File
# Begin Source File
@@ -298,7 +298,7 @@ InputName=tmap_vc
# End Custom Build
-!ENDIF
+!ENDIF
# End Source File
# End Group
@@ -535,10 +535,6 @@ SOURCE=..\hardware\hw_drv.h
# End Source File
# Begin Source File
-SOURCE=..\hardware\hw_glide.h
-# End Source File
-# Begin Source File
-
SOURCE=..\hardware\hw_glob.h
# End Source File
# Begin Source File
diff --git a/src/win32/Srb2win.props b/src/win32/Srb2win.props
index 44a30d50..fa152f0c 100644
--- a/src/win32/Srb2win.props
+++ b/src/win32/Srb2win.props
@@ -5,7 +5,10 @@
- _WINDOWS;%(PreprocessorDefinitions)
+
+ HAVE_ZLIB;HAVE_LIBGME;_WINDOWS;%(PreprocessorDefinitions)
+
+ _WINDOWS;%(PreprocessorDefinitions)
diff --git a/src/win32/win_dll.c b/src/win32/win_dll.c
index bc67f04a..77ddc6e3 100644
--- a/src/win32/win_dll.c
+++ b/src/win32/win_dll.c
@@ -17,9 +17,6 @@
/// \brief load and initialise the 3D driver DLL
#include "../doomdef.h"
-#ifdef HWRENDER
-#include "../hardware/hw_drv.h" // get the standard 3D Driver DLL exports prototypes
-#endif
#ifdef HW3SOUND
#include "../hardware/hw3dsdrv.h" // get the 3D sound driver DLL export prototypes
@@ -30,7 +27,7 @@
#include "win_dll.h"
#include "win_main.h" // I_ShowLastError()
-#if defined(HWRENDER) || defined(HW3SOUND)
+#if defined(HW3SOUND)
typedef struct loadfunc_s {
LPCSTR fnName;
LPVOID fnPointer;
@@ -84,92 +81,6 @@ static VOID UnloadDLL (HMODULE* pModule)
}
#endif
-// ==========================================================================
-// STANDARD 3D DRIVER DLL FOR DOOM LEGACY
-// ==========================================================================
-
-// note : the 3D driver loading should be put somewhere else..
-
-#ifdef HWRENDER
-static HMODULE hwdModule = NULL;
-
-static loadfunc_t hwdFuncTable[] = {
-#ifdef _X86_
- {"Init@4", &hwdriver.pfnInit},
- {"Shutdown@0", &hwdriver.pfnShutdown},
- {"GetModeList@8", &hwdriver.pfnGetModeList},
- {"SetPalette@8", &hwdriver.pfnSetPalette},
- {"FinishUpdate@4", &hwdriver.pfnFinishUpdate},
- {"Draw2DLine@12", &hwdriver.pfnDraw2DLine},
- {"DrawPolygon@16", &hwdriver.pfnDrawPolygon},
- {"SetBlend@4", &hwdriver.pfnSetBlend},
- {"ClearBuffer@12", &hwdriver.pfnClearBuffer},
- {"SetTexture@4", &hwdriver.pfnSetTexture},
- {"ReadRect@24", &hwdriver.pfnReadRect},
- {"GClipRect@20", &hwdriver.pfnGClipRect},
- {"ClearMipMapCache@0", &hwdriver.pfnClearMipMapCache},
- {"SetSpecialState@8", &hwdriver.pfnSetSpecialState},
- {"DrawModel@16", &hwdriver.pfnDrawModel},
- {"SetTransform@4", &hwdriver.pfnSetTransform},
- {"GetTextureUsed@0", &hwdriver.pfnGetTextureUsed},
- {"GetRenderVersion@0", &hwdriver.pfnGetRenderVersion},
-#ifdef SHUFFLE
- {"PostImgRedraw@4", &hwdriver.pfnPostImgRedraw},
-#endif
- {"FlushScreenTextures@0",&hwdriver.pfnFlushScreenTextures},
- {"StartScreenWipe@0", &hwdriver.pfnStartScreenWipe},
- {"EndScreenWipe@0", &hwdriver.pfnEndScreenWipe},
- {"DoScreenWipe@4", &hwdriver.pfnDoScreenWipe},
- {"DrawIntermissionBG@0",&hwdriver.pfnDrawIntermissionBG},
- {"MakeScreenTexture@0", &hwdriver.pfnMakeScreenTexture},
- {"MakeScreenFinalTexture@0", &hwdriver.pfnMakeScreenFinalTexture},
- {"DrawScreenFinalTexture@8", &hwdriver.pfnDrawScreenFinalTexture},
-#else
- {"Init", &hwdriver.pfnInit},
- {"Shutdown", &hwdriver.pfnShutdown},
- {"GetModeList", &hwdriver.pfnGetModeList},
- {"SetPalette", &hwdriver.pfnSetPalette},
- {"FinishUpdate", &hwdriver.pfnFinishUpdate},
- {"Draw2DLine", &hwdriver.pfnDraw2DLine},
- {"DrawPolygon", &hwdriver.pfnDrawPolygon},
- {"SetBlend", &hwdriver.pfnSetBlend},
- {"ClearBuffer", &hwdriver.pfnClearBuffer},
- {"SetTexture", &hwdriver.pfnSetTexture},
- {"ReadRect", &hwdriver.pfnReadRect},
- {"GClipRect", &hwdriver.pfnGClipRect},
- {"ClearMipMapCache", &hwdriver.pfnClearMipMapCache},
- {"SetSpecialState", &hwdriver.pfnSetSpecialState},
- {"DrawModel", &hwdriver.pfnDrawModel},
- {"SetTransform", &hwdriver.pfnSetTransform},
- {"GetTextureUsed", &hwdriver.pfnGetTextureUsed},
- {"GetRenderVersion", &hwdriver.pfnGetRenderVersion},
-#ifdef SHUFFLE
- {"PostImgRedraw", &hwdriver.pfnPostImgRedraw},
-#endif
- {"FlushScreenTextures", &hwdriver.pfnFlushScreenTextures},
- {"StartScreenWipe", &hwdriver.pfnStartScreenWipe},
- {"EndScreenWipe", &hwdriver.pfnEndScreenWipe},
- {"DoScreenWipe", &hwdriver.pfnDoScreenWipe},
- {"DrawIntermissionBG", &hwdriver.pfnDrawIntermissionBG},
- {"MakeScreenTexture", &hwdriver.pfnMakeScreenTexture},
- {"MakeScreenFinalTexture", &hwdriver.pfnMakeScreenFinalTexture},
- {"DrawScreenFinalTexture", &hwdriver.pfnDrawScreenFinalTexture},
-#endif
- {NULL,NULL}
-};
-
-BOOL Init3DDriver (LPCSTR dllName)
-{
- hwdModule = LoadDLL(dllName, hwdFuncTable);
- return (hwdModule != NULL);
-}
-
-VOID Shutdown3DDriver (VOID)
-{
- UnloadDLL(&hwdModule);
-}
-#endif
-
#ifdef HW3SOUND
static HMODULE hwsModule = NULL;
diff --git a/src/win32/win_dll.h b/src/win32/win_dll.h
index b4b25958..f69a8c21 100644
--- a/src/win32/win_dll.h
+++ b/src/win32/win_dll.h
@@ -20,11 +20,6 @@
#define RPC_NO_WINDOWS_H
#include
-#ifdef HWRENDER
-BOOL Init3DDriver (LPCSTR dllName);
-VOID Shutdown3DDriver (VOID);
-#endif
-
#ifdef HW3SOUND
BOOL Init3DSDriver(LPCSTR dllName);
VOID Shutdown3DSDriver(VOID);
diff --git a/src/win32/win_vid.c b/src/win32/win_vid.c
index 45f96e9d..ecdd0167 100644
--- a/src/win32/win_vid.c
+++ b/src/win32/win_vid.c
@@ -36,12 +36,6 @@
#include "../command.h"
#include "../screen.h"
-#ifdef HWRENDER
-#include "win_dll.h" // loading the render DLL
-#include "../hardware/hw_drv.h" // calling driver init & shutdown
-#include "../hardware/hw_main.h" // calling HWR module init & shutdown
-#endif
-
// -------
// Globals
// -------
@@ -222,12 +216,7 @@ void I_StartupGraphics(void)
if (graphics_started)
return;
-#ifdef HWRENDER
- else if (M_CheckParm("-opengl"))
- rendermode = render_opengl;
- else
-#endif
- rendermode = render_soft;
+ rendermode = render_soft;
if (dedicated)
rendermode = render_none;
@@ -245,10 +234,6 @@ void I_StartupGraphics(void)
// ------------------
void I_ShutdownGraphics(void)
{
-#ifdef HWRENDER
- const rendermode_t oldrendermode = rendermode;
-#endif
-
// This is BAD because it makes the I_Error box screw up!
// rendermode = render_none;
@@ -273,15 +258,6 @@ void I_ShutdownGraphics(void)
bmiMain = NULL;
}
-#ifdef HWRENDER
- if (oldrendermode != render_soft)
- {
- HWR_Shutdown(); // free stuff from the hardware renderer
- HWD.pfnShutdown(); // close 3d card display
- Shutdown3DDriver(); // free the driver DLL
- }
-#endif
-
// free the last video mode screen buffers
if (vid.buffer)
{
@@ -289,10 +265,7 @@ void I_ShutdownGraphics(void)
vid.buffer = NULL;
}
-#ifdef HWRENDER
- if (rendermode == render_soft)
-#endif
- CloseDirectDraw();
+ CloseDirectDraw();
graphics_started = false;
}
@@ -380,11 +353,6 @@ void I_FinishUpdate(void)
DIB_RGB_COLORS);
}
else
-#ifdef HWRENDER
- if (rendermode != render_soft)
- HWD.pfnFinishUpdate(cv_vidwait.value);
- else
-#endif
{
// DIRECT DRAW
// copy virtual screen to real screen
@@ -486,9 +454,6 @@ void I_SetPalette(RGBA_t *palette)
}
}
else
-#ifdef HWRENDER
- if (rendermode == render_soft)
-#endif
{
PALETTEENTRY mainpal[256];
@@ -680,56 +645,14 @@ static VOID VID_Init(VOID)
bDIBMode = TRUE;
bAppFullScreen = FALSE;
-#ifdef HWRENDER
- // initialize the appropriate display device
- if (rendermode != render_soft)
+ if (!bWinParm)
{
- const char *drvname = NULL;
-
- switch (rendermode)
- {
- case render_opengl:
- drvname = "r_opengl.dll";
- break;
- default:
- I_Error("Unknown hardware render mode");
- }
-
- // load the DLL
- if (drvname && Init3DDriver(drvname))
- {
- int hwdversion = HWD.pfnGetRenderVersion();
- if (hwdversion != VERSION)
- CONS_Alert(CONS_WARNING, M_GetText("This r_opengl version is not supported, use it at your own risk!\n"));
-
- // perform initialisations
- HWD.pfnInit(I_Error);
- // get available display modes for the device
- HWD.pfnGetModeList(&pvidmodes, &numvidmodes);
- }
- else
- {
- switch (rendermode)
- {
- case render_opengl:
- I_Error("Error initializing OpenGL");
- default:
- break;
- }
- rendermode = render_soft;
- }
+ if (!CreateDirectDrawInstance())
+ bWinParm = TRUE;
+ else // get available display modes for the device
+ VID_GetExtraModes();
}
- if (rendermode == render_soft)
-#endif
- if (!bWinParm)
- {
- if (!CreateDirectDrawInstance())
- bWinParm = TRUE;
- else // get available display modes for the device
- VID_GetExtraModes();
- }
-
// the game boots in 320x200 standard VGA, but
// we need a highcolor mode to run the game in highcolor
if (highcolor && !numvidmodes)
@@ -927,14 +850,6 @@ INT32 VID_SetMode(INT32 modenum)
// we switch to fullscreen
bAppFullScreen = TRUE;
bDIBMode = FALSE;
-#ifdef HWRENDER
- if (rendermode != render_soft)
- {
- // purge all patch graphics stored in software format
- //Z_FreeTags (PU_PURGELEVEL, PU_PURGELEVEL+100);
- HWR_Startup();
- }
-#endif
}
I_RestartSysMouse();
diff --git a/src/win32ce/win_dll.c b/src/win32ce/win_dll.c
index 8b88f84d..2bda7126 100644
--- a/src/win32ce/win_dll.c
+++ b/src/win32ce/win_dll.c
@@ -17,9 +17,6 @@
/// \brief load and initialise the 3D driver DLL
#include "../doomdef.h"
-#ifdef HWRENDER
-#include "../hardware/hw_drv.h" // get the standard 3D Driver DLL exports prototypes
-#endif
#ifdef HW3SOUND
#include "../hardware/hw3dsdrv.h" // get the 3D sound driver DLL export prototypes
@@ -28,7 +25,7 @@
#include "win_dll.h"
#include "win_main.h" // I_GetLastErrorMsgBox()
-#if defined(HWRENDER) || defined(HW3SOUND)
+#if defined(HW3SOUND)
typedef struct loadfunc_s {
LPCSTR fnName;
LPVOID fnPointer;
@@ -82,49 +79,6 @@ static inline VOID UnloadDLL (HMODULE* pModule)
}
#endif
-// ==========================================================================
-// STANDARD 3D DRIVER DLL FOR DOOM LEGACY
-// ==========================================================================
-
-// note : the 3D driver loading should be put somewhere else..
-
-#ifdef HWRENDER
-static HMODULE hwdModule = NULL;
-
-static loadfunc_t hwdFuncTable[] = {
- {"_Init@4", &hwdriver.pfnInit},
- {"_Shutdown@0", &hwdriver.pfnShutdown},
- {"_GetModeList@8", &hwdriver.pfnGetModeList},
- {"_SetPalette@8", &hwdriver.pfnSetPalette},
- {"_FinishUpdate@4", &hwdriver.pfnFinishUpdate},
- {"_Draw2DLine@12", &hwdriver.pfnDraw2DLine},
- {"_DrawPolygon@16", &hwdriver.pfnDrawPolygon},
- {"_SetBlend@4", &hwdriver.pfnSetBlend},
- {"_ClearBuffer@12", &hwdriver.pfnClearBuffer},
- {"_SetTexture@4", &hwdriver.pfnSetTexture},
- {"_ReadRect@24", &hwdriver.pfnReadRect},
- {"_GClipRect@20", &hwdriver.pfnGClipRect},
- {"_ClearMipMapCache@0",&hwdriver.pfnClearMipMapCache},
- {"_SetSpecialState@8", &hwdriver.pfnSetSpecialState},
- {"_DrawMD2@16", &hwdriver.pfnDrawMD2},
- {"_SetTransform@4", &hwdriver.pfnSetTransform},
- {"_GetTextureUsed@0", &hwdriver.pfnGetTextureUsed},
- {"_GetRenderVersion@0",&hwdriver.pfnGetRenderVersion},
- {NULL,NULL}
-};
-
-BOOL Init3DDriver (LPCSTR dllName)
-{
- hwdModule = LoadDLL(dllName, hwdFuncTable);
- return (hwdModule != NULL);
-}
-
-VOID Shutdown3DDriver (VOID)
-{
- UnloadDLL(&hwdModule);
-}
-#endif
-
#ifdef HW3SOUND
static HMODULE hwsModule = NULL;
diff --git a/src/win32ce/win_dll.h b/src/win32ce/win_dll.h
index b4b25958..f69a8c21 100644
--- a/src/win32ce/win_dll.h
+++ b/src/win32ce/win_dll.h
@@ -20,11 +20,6 @@
#define RPC_NO_WINDOWS_H
#include
-#ifdef HWRENDER
-BOOL Init3DDriver (LPCSTR dllName);
-VOID Shutdown3DDriver (VOID);
-#endif
-
#ifdef HW3SOUND
BOOL Init3DSDriver(LPCSTR dllName);
VOID Shutdown3DSDriver(VOID);
diff --git a/src/win32ce/win_vid.c b/src/win32ce/win_vid.c
index 244dfaf3..439103f3 100644
--- a/src/win32ce/win_vid.c
+++ b/src/win32ce/win_vid.c
@@ -34,12 +34,6 @@
#include "../command.h"
#include "../screen.h"
-#ifdef HWRENDER
-#include "win_dll.h" // loading the render DLL
-#include "../hardware/hw_drv.h" // calling driver init & shutdown
-#include "../hardware/hw_main.h" // calling HWR module init & shutdown
-#endif
-
// -------
// Globals
// -------
@@ -110,13 +104,6 @@ void I_StartupGraphics(void)
if (graphics_started)
return;
-#ifdef HWRENDER
- if (M_CheckParm("-opengl"))
- rendermode = render_opengl;
- else
- rendermode = render_soft;
-#endif
-
if (dedicated)
rendermode = render_none;
else
@@ -152,15 +139,6 @@ void I_ShutdownGraphics(void)
bmiMain = NULL;
}
-#ifdef HWRENDER
- if (rendermode != render_soft)
- {
- HWR_Shutdown(); // free stuff from the hardware renderer
- HWD.pfnShutdown(); // close 3d card display
- Shutdown3DDriver(); // free the driver DLL
- }
-#endif
-
// free the last video mode screen buffers
if (vid.buffer)
{
@@ -168,10 +146,7 @@ void I_ShutdownGraphics(void)
vid.buffer = NULL;
}
-#ifdef HWRENDER
- if (rendermode == render_soft)
-#endif
- CloseDirectDraw();
+ CloseDirectDraw();
graphics_started = false;
}
@@ -212,11 +187,6 @@ void I_FinishUpdate(void)
DIB_RGB_COLORS);
}
else
-#ifdef HWRENDER
- if (rendermode != render_soft)
- HWD.pfnFinishUpdate(cv_vidwait.value);
- else
-#endif
{
// DIRECT DRAW
// copy virtual screen to real screen
@@ -295,9 +265,6 @@ void I_SetPalette(RGBA_t *palette)
}
}
else
-#ifdef HWRENDER
- if (rendermode == render_soft)
-#endif
{
PALETTEENTRY mainpal[256];
@@ -458,56 +425,14 @@ static void VID_Init(void)
bDIBMode = TRUE;
bAppFullScreen = FALSE;
-#ifdef HWRENDER
- // initialize the appropriate display device
- if (rendermode != render_soft)
+ if (!bWinParm)
{
- const char *drvname = NULL;
-
- switch (rendermode)
- {
- case render_opengl:
- drvname = "r_opengl.dll";
- break;
- default:
- I_Error("Unknown hardware render mode");
- }
-
- // load the DLL
- if (drvname && Init3DDriver(drvname))
- {
- int hwdversion = HWD.pfnGetRenderVersion();
- if (hwdversion != VERSION)
- CONS_Printf("WARNING: This r_opengl version is not supported, use it at your own risk.\n");
-
- // perform initialisations
- HWD.pfnInit(I_Error);
- // get available display modes for the device
- HWD.pfnGetModeList(&pvidmodes, &numvidmodes);
- }
- else
- {
- switch (rendermode)
- {
- case render_opengl:
- I_Error("Error initializing OpenGL");
- default:
- break;
- }
- rendermode = render_soft;
- }
+ if (!CreateDirectDrawInstance())
+ I_Error("Error initializing DirectDraw");
+ // get available display modes for the device
+ VID_GetExtraModes();
}
- if (rendermode == render_soft)
-#endif
- if (!bWinParm)
- {
- if (!CreateDirectDrawInstance())
- I_Error("Error initializing DirectDraw");
- // get available display modes for the device
- VID_GetExtraModes();
- }
-
// the game boots in 320x200 standard VGA, but
// we need a highcolor mode to run the game in highcolor
if (highcolor && !numvidmodes)
@@ -705,14 +630,6 @@ INT32 VID_SetMode(INT32 modenum)
// we switch to fullscreen
bAppFullScreen = TRUE;
bDIBMode = FALSE;
-#ifdef HWRENDER
- if (rendermode != render_soft)
- {
- // purge all patch graphics stored in software format
- //Z_FreeTags (PU_PURGELEVEL, PU_PURGELEVEL+100);
- HWR_Startup();
- }
-#endif
}
I_RestartSysMouse();
diff --git a/src/z_zone.c b/src/z_zone.c
index a3e13422..dae7dff0 100644
--- a/src/z_zone.c
+++ b/src/z_zone.c
@@ -637,7 +637,6 @@ void Command_Memfree_f(void)
CONS_Printf(M_GetText("Mipmap patches : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRPATCHCOLMIPMAP)>>10));
CONS_Printf(M_GetText("HW Texture cache : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRCACHE)>>10));
CONS_Printf(M_GetText("Plane polygons : %7s KB\n"), sizeu1(Z_TagUsage(PU_HWRPLANE)>>10));
- CONS_Printf(M_GetText("HW Texture used : %7d KB\n"), HWR_GetTextureUsed()>>10);
}
#endif