diff --git a/engine/client/console.c b/engine/client/console.c index b2ca74d44..2b9d7f1f1 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -942,7 +942,15 @@ void Con_PrintFlags(const char *txt, unsigned int setflags, unsigned int clearfl { setflags |= con_main.parseflags; setflags &= ~clearflags; - Con_PrintCon(&con_main, txt, setflags); + +// also echo to debugging console + Sys_Printf ("%s", txt); // also echo to debugging console + +// log all messages to file + Con_Log (txt); + + if (con_initialized) + Con_PrintCon(&con_main, txt, setflags); } void Con_CycleConsole(void) diff --git a/engine/client/image.c b/engine/client/image.c index 09fd99f4d..128b5fcc7 100644 --- a/engine/client/image.c +++ b/engine/client/image.c @@ -2498,7 +2498,7 @@ static qboolean Image_ReadDDSFile(texid_t tex, unsigned int flags, char *fname, } else if (*(int*)&fmtheader.ddpfPixelFormat.dwFourCC == (('D'<<0)|('X'<<8)|('T'<<16)|('2'<<24))) //dx3 with premultiplied alpha { -// if (!(tex->flags & IF_PREMULTIPLYALPHA)) + if (!(tex->flags & IF_PREMULTIPLYALPHA)) return false; encoding = PTI_S3RGBA3; pad = 8; diff --git a/engine/client/textedit.c b/engine/client/textedit.c index 36a04d83a..0368706a3 100644 --- a/engine/client/textedit.c +++ b/engine/client/textedit.c @@ -833,6 +833,8 @@ console_t *Con_TextEditor(const char *fname, const char *line, qboolean newfile) if (line) Con_Editor_GoToLine(con, atoi(line)); + else + Con_Editor_GoToLine(con, 1); Con_Footerf(con, false, " ^2%i lines", con->linecount); diff --git a/engine/client/winquake.rc b/engine/client/winquake.rc index a850028a5..eb345a62b 100644 --- a/engine/client/winquake.rc +++ b/engine/client/winquake.rc @@ -85,24 +85,24 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. #ifdef CONFIG_FILE_NAME -IDI_ICON1 ICON BRANDING_ICON + IDI_ICON1 ICON BRANDING_ICON #elif defined(BRANDING_ICON) -IDI_ICON1 ICON BRANDING_ICON -#if defined( _MSC_VER ) && ( _MSC_VER >= 1500 ) -ID1_ICON2 ICON "fte_eukara.ico" + IDI_ICON1 ICON BRANDING_ICON + #if defined( _MSC_VER ) && ( _MSC_VER >= 1500 ) + IDI_ICON2 ICON "fte_eukara.ico" + #else + IDI_ICON2 ICON "fte_eukaranopng.ico" + #endif + IDI_ICON3 ICON "bymorphed.ico" + IDI_ICON4 ICON "q2.ico" #else -ID1_ICON2 ICON "fte_eukaranopng.ico" -#endif -IDI_ICON3 ICON "bymorphed.ico" -IDI_ICON4 ICON "q2.ico" -#else -#if defined( _MSC_VER ) && ( _MSC_VER >= 1500 ) -ID1_ICON1 ICON "fte_eukara.ico" -#else -ID1_ICON1 ICON "fte_eukaranopng.ico" -#endif -IDI_ICON2 ICON "bymorphed.ico" -IDI_ICON3 ICON "q2.ico" + #if defined( _MSC_VER ) && ( _MSC_VER >= 1500 ) + IDI_ICON1 ICON "fte_eukara.ico" + #else + IDI_ICON1 ICON "fte_eukaranopng.ico" + #endif + IDI_ICON2 ICON "bymorphed.ico" + IDI_ICON3 ICON "q2.ico" #endif #ifdef CONFIG_MANIFEST_TEXT diff --git a/engine/d3d/d3d_backend.c b/engine/d3d/d3d_backend.c index faa421843..b5dce7ff4 100644 --- a/engine/d3d/d3d_backend.c +++ b/engine/d3d/d3d_backend.c @@ -2480,8 +2480,6 @@ static void D3D9BE_GenBatchVBOs(vbo_t **vbochain, batch_t *firstbatch, batch_t * index_t *vboedata; vbovdata_t *vbovdata; - vbo = Z_Malloc(sizeof(*vbo)); - maxvboverts = 0; maxvboelements = 0; for(batch = firstbatch; batch != stopbatch; batch = batch->next) @@ -2496,6 +2494,10 @@ static void D3D9BE_GenBatchVBOs(vbo_t **vbochain, batch_t *firstbatch, batch_t * if (maxvboverts > MAX_INDICIES) Sys_Error("Building a vbo with too many verticies\n"); + if (!maxvboelements) + return; + + vbo = Z_Malloc(sizeof(*vbo)); IDirect3DDevice9_CreateIndexBuffer(pD3DDev9, sizeof(index_t) * maxvboelements, 0, D3DFMT_QINDEX, D3DPOOL_MANAGED, &ebuff, NULL); IDirect3DDevice9_CreateVertexBuffer(pD3DDev9, sizeof(*vbovdata) * maxvboverts, D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, &vbuff, NULL); diff --git a/engine/d3d/vid_d3d.c b/engine/d3d/vid_d3d.c index 15ad9a5ed..649a37e63 100644 --- a/engine/d3d/vid_d3d.c +++ b/engine/d3d/vid_d3d.c @@ -4,6 +4,7 @@ #include "renderque.h" #include "glquake.h" +#include "resource.h" #ifdef D3D9QUAKE #include "winquake.h" @@ -710,6 +711,7 @@ static qboolean D3D9_VID_Init(rendererstate_t *info, unsigned char *palette) DWORD wstyle; RECT rect; MSG msg; + HICON hIcon = LoadIcon (global_hInstance, MAKEINTRESOURCE (IDI_ICON1)); //DDGAMMARAMP gammaramp; //int i; @@ -721,7 +723,7 @@ static qboolean D3D9_VID_Init(rendererstate_t *info, unsigned char *palette) 0, 0, NULL, - NULL, + hIcon, NULL, NULL, NULL, @@ -1072,12 +1074,17 @@ static qboolean (D3D9_SCR_UpdateScreen) (void) } #endif */ + + D3D9_Set2D(); + if (Media_ShowFilm()) { M_Draw(0); // V_UpdatePalette (false); Media_RecordFrame(); // R2D_BrightenScreen(); + if (R2D_Flush) + R2D_Flush(); IDirect3DDevice9_EndScene(pD3DDev9); D3D9_VID_SwapBuffers(); return true; @@ -1091,8 +1098,6 @@ static qboolean (D3D9_SCR_UpdateScreen) (void) noworld = false; nohud = false; - D3D9_Set2D(); - #ifdef VM_CG if (CG_Refresh()) nohud = true; diff --git a/engine/d3d/vid_d3d11.c b/engine/d3d/vid_d3d11.c index 22606b235..762dc02da 100644 --- a/engine/d3d/vid_d3d11.c +++ b/engine/d3d/vid_d3d11.c @@ -5,6 +5,7 @@ #include "glquake.h" #include "shader.h" #include "renderque.h" +#include "resource.h" #define COBJMACROS #include @@ -937,6 +938,7 @@ static qboolean D3D11_VID_Init(rendererstate_t *info, unsigned char *palette) DWORD wstyle; RECT rect; MSG msg; + HICON hIcon = LoadIcon (global_hInstance, MAKEINTRESOURCE (IDI_ICON1)); //DDGAMMARAMP gammaramp; //int i; @@ -948,7 +950,7 @@ static qboolean D3D11_VID_Init(rendererstate_t *info, unsigned char *palette) 0, 0, NULL, - NULL, + hIcon, NULL, NULL, NULL, diff --git a/engine/d3d/vid_d3d8.c b/engine/d3d/vid_d3d8.c index 044827c35..c638e221d 100644 --- a/engine/d3d/vid_d3d8.c +++ b/engine/d3d/vid_d3d8.c @@ -2,6 +2,7 @@ #include "gl_draw.h" #include "shader.h" #include "renderque.h" +#include "resource.h" #include "glquake.h" @@ -750,6 +751,7 @@ static qboolean D3D8_VID_Init(rendererstate_t *info, unsigned char *palette) DWORD wstyle; RECT rect; MSG msg; + HICON hIcon = LoadIcon (global_hInstance, MAKEINTRESOURCE (IDI_ICON1)); //DDGAMMARAMP gammaramp; //int i; @@ -761,7 +763,7 @@ static qboolean D3D8_VID_Init(rendererstate_t *info, unsigned char *palette) 0, 0, NULL, - NULL, + hIcon, NULL, NULL, NULL, diff --git a/engine/gl/gl_draw.c b/engine/gl/gl_draw.c index f0e0199b0..4dd4db2dc 100644 --- a/engine/gl/gl_draw.c +++ b/engine/gl/gl_draw.c @@ -350,6 +350,20 @@ qboolean GL_LoadTextureMips(texid_t tex, struct pendingtextureinfo *mips) qglTexParameteri(targ, GL_TEXTURE_WRAP_R, GL_REPEAT); } + if (targ == GL_TEXTURE_2D && mips->mipcount > 1) + { //npot mipmapped textures are awkward. + //opengl floors. + for (i = 1; i < mips->mipcount; i++) + { + if (mips->mip[i].width != (mips->mip[i-1].width>>1) || + mips->mip[i].height != (mips->mip[i-1].height>>1)) + { //okay, this mip looks like it was sized wrongly. this can easily happen with dds files made for direct3d. + mips->mipcount = i; + break; + } + } + } + //make sure the texture is complete even if the mips are not. //note that some drivers will just ignore levels that are not valid. //this means that we can't make this setting dynamic, so we might as well let the drivers know BEFORE we do the uploads, to be kind to those that are buggy.. diff --git a/engine/gl/gl_font.c b/engine/gl/gl_font.c index 9e3eee95a..9c2626d3a 100644 --- a/engine/gl/gl_font.c +++ b/engine/gl/gl_font.c @@ -856,7 +856,7 @@ qboolean Font_LoadFreeTypeFont(struct font_s *f, int height, const char *fontfil } error = FT_Err_Cannot_Open_Resource; - if (FS_FLocateFile(fontfilename, FSLF_IFFOUND, &loc)) + if (FS_FLocateFile(fontfilename, FSLF_IFFOUND, &loc) || FS_FLocateFile(va("%s.ttf", fontfilename), FSLF_IFFOUND, &loc)) { if (*loc.rawname && !loc.offset) { diff --git a/engine/vk/vk_backend.c b/engine/vk/vk_backend.c index 4b4e06fc3..3646ff959 100644 --- a/engine/vk/vk_backend.c +++ b/engine/vk/vk_backend.c @@ -4088,7 +4088,7 @@ static void BE_UploadLightmaps(qboolean force) if (!lightmap[i]) continue; - if (force) + if (force && !lightmap[i]->external) { lightmap[i]->rectchange.l = 0; lightmap[i]->rectchange.t = 0; diff --git a/engine/vk/vk_init.c b/engine/vk/vk_init.c index 08b8c8d46..9a38018d2 100644 --- a/engine/vk/vk_init.c +++ b/engine/vk/vk_init.c @@ -1145,6 +1145,20 @@ qboolean VK_LoadTextureMips (texid_t tex, struct pendingtextureinfo *mips) layers = (mips->type == PTI_CUBEMAP)?6:1; + if (layers == 1 && mips->mipcount > 1) + { //npot mipmapped textures are awkward. + //vulkan floors. + for (i = 1; i < mips->mipcount; i++) + { + if (mips->mip[i].width != (mips->mip[i-1].width>>1) || + mips->mip[i].height != (mips->mip[i-1].height>>1)) + { //okay, this mip looks like it was sized wrongly. this can easily happen with dds files. + mips->mipcount = i; + break; + } + } + } + switch(mips->encoding) { case PTI_RGB565: @@ -1314,12 +1328,15 @@ qboolean VK_LoadTextureMips (texid_t tex, struct pendingtextureinfo *mips) uint32_t blockwidth = (mips->mip[i].width+blocksize-1) / blocksize; uint32_t blockheight = (mips->mip[i].height+blocksize-1) / blocksize; - memcpy((char*)mapdata + bci.size, (char*)mips->mip[i].data, blockwidth*blockbytes*blockheight); + if (mips->mip[i].data) + memcpy((char*)mapdata + bci.size, (char*)mips->mip[i].data, blockwidth*blockbytes*blockheight); + else + memset((char*)mapdata + bci.size, 0, blockwidth*blockbytes*blockheight); //queue up a buffer->image copy for this mip region.bufferOffset = bci.size; - region.bufferRowLength = 0;//blockwidth*blockbytes; - region.bufferImageHeight = 0;//blockheight; + region.bufferRowLength = blockwidth*blocksize;//*blockbytes; + region.bufferImageHeight = blockheight*blocksize; region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; region.imageSubresource.mipLevel = i%(mips->mipcount/layers); region.imageSubresource.baseArrayLayer = i/(mips->mipcount/layers); @@ -1327,8 +1344,8 @@ qboolean VK_LoadTextureMips (texid_t tex, struct pendingtextureinfo *mips) region.imageOffset.x = 0; region.imageOffset.y = 0; region.imageOffset.z = 0; - region.imageExtent.width = mips->mip[i].width; - region.imageExtent.height = mips->mip[i].height; + region.imageExtent.width = mips->mip[i].width;//blockwidth*blocksize; + region.imageExtent.height = mips->mip[i].height;//blockheight*blocksize; region.imageExtent.depth = 1; vkCmdCopyBufferToImage(vkloadcmd, fence->stagingbuffer, target.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion);