diff --git a/source/common/2d/v_2ddrawer.cpp b/source/common/2d/v_2ddrawer.cpp index 44865797b..612eef005 100644 --- a/source/common/2d/v_2ddrawer.cpp +++ b/source/common/2d/v_2ddrawer.cpp @@ -124,7 +124,7 @@ static void Shape2D_Clear(DShape2D* self, int which) if (which & C_Verts) self->mVertices.Clear(); if (which & C_Coords) self->mCoords.Clear(); if (which & C_Indices) self->mIndices.Clear(); - self->needsVertexUpload = true; + self->bufferInfo->needsVertexUpload = true; } DEFINE_ACTION_FUNCTION_NATIVE(DShape2D, Clear, Shape2D_Clear) @@ -138,7 +138,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(DShape2D, Clear, Shape2D_Clear) static void Shape2D_PushVertex(DShape2D* self, double x, double y) { self->mVertices.Push(DVector2(x, y)); - self->needsVertexUpload = true; + self->bufferInfo->needsVertexUpload = true; } DEFINE_ACTION_FUNCTION_NATIVE(DShape2D, PushVertex, Shape2D_PushVertex) @@ -153,7 +153,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(DShape2D, PushVertex, Shape2D_PushVertex) static void Shape2D_PushCoord(DShape2D* self, double u, double v) { self->mCoords.Push(DVector2(u, v)); - self->needsVertexUpload = true; + self->bufferInfo->needsVertexUpload = true; } DEFINE_ACTION_FUNCTION_NATIVE(DShape2D, PushCoord, Shape2D_PushCoord) @@ -170,7 +170,7 @@ static void Shape2D_PushTriangle(DShape2D* self, int a, int b, int c) self->mIndices.Push(a); self->mIndices.Push(b); self->mIndices.Push(c); - self->needsVertexUpload = true; + self->bufferInfo->needsVertexUpload = true; } DEFINE_ACTION_FUNCTION_NATIVE(DShape2D, PushTriangle, Shape2D_PushTriangle) @@ -528,13 +528,15 @@ void F2DDrawer::AddTexture(FGameTexture* img, DrawParms& parms) offset = osave; } +static TArray> buffersToDestroy; + void DShape2D::OnDestroy() { if (lastParms) delete lastParms; lastParms = nullptr; mIndices.Reset(); mVertices.Reset(); mCoords.Reset(); - buffers.Reset(); + buffersToDestroy.Push(std::move(bufferInfo)); } //========================================================================== @@ -567,11 +569,11 @@ void F2DDrawer::AddShape(FGameTexture* img, DShape2D* shape, DrawParms& parms) shape->lastParms = new DrawParms(parms); } else if (shape->lastParms->vertexColorChange(parms)) { - shape->needsVertexUpload = true; - if (!shape->uploadedOnce) { - shape->bufIndex = -1; - shape->buffers.Clear(); - shape->lastCommand = -1; + shape->bufferInfo->needsVertexUpload = true; + if (!shape->bufferInfo->uploadedOnce) { + shape->bufferInfo->bufIndex = -1; + shape->bufferInfo->buffers.Clear(); + shape->bufferInfo->lastCommand = -1; } delete shape->lastParms; shape->lastParms = new DrawParms(parms); @@ -583,7 +585,7 @@ void F2DDrawer::AddShape(FGameTexture* img, DShape2D* shape, DrawParms& parms) auto osave = offset; if (parms.nooffset) offset = { 0,0 }; - if (shape->needsVertexUpload) + if (shape->bufferInfo->needsVertexUpload) { shape->minx = 16383; shape->miny = 16383; @@ -622,15 +624,15 @@ void F2DDrawer::AddShape(FGameTexture* img, DShape2D* shape, DrawParms& parms) dg.transform = shape->transform; dg.transform.Cells[0][2] += offset.X; dg.transform.Cells[1][2] += offset.Y; - dg.shape2D = shape; + dg.shape2DBufInfo = shape->bufferInfo; dg.shape2DIndexCount = shape->mIndices.Size(); - if (shape->needsVertexUpload) + if (shape->bufferInfo->needsVertexUpload) { - shape->bufIndex += 1; + shape->bufferInfo->bufIndex += 1; - shape->buffers.Reserve(1); + shape->bufferInfo->buffers.Reserve(1); - auto buf = &shape->buffers[shape->bufIndex]; + auto buf = &shape->bufferInfo->buffers[shape->bufferInfo->bufIndex]; auto verts = TArray(dg.mVertCount, true); for ( int i=0; iUploadData(&verts[0], dg.mVertCount, &shape->mIndices[0], shape->mIndices.Size()); - shape->needsVertexUpload = false; - shape->uploadedOnce = true; + shape->bufferInfo->needsVertexUpload = false; + shape->bufferInfo->uploadedOnce = true; } - dg.shape2DBufIndex = shape->bufIndex; - shape->lastCommand += 1; - dg.shape2DCommandCounter = shape->lastCommand; + dg.shape2DBufIndex = shape->bufferInfo->bufIndex; + shape->bufferInfo->lastCommand += 1; + dg.shape2DCommandCounter = shape->bufferInfo->lastCommand; AddCommand(&dg); offset = osave; } @@ -1082,6 +1084,17 @@ void F2DDrawer::Clear() screenFade = 1.f; } +//========================================================================== +// +// +// +//========================================================================== + +void F2DDrawer::OnFrameDone() +{ + buffersToDestroy.Clear(); +} + F2DVertexBuffer::F2DVertexBuffer() { mVertexBuffer = screen->CreateVertexBuffer(); diff --git a/source/common/2d/v_2ddrawer.h b/source/common/2d/v_2ddrawer.h index 8bb113905..ebcef6142 100644 --- a/source/common/2d/v_2ddrawer.h +++ b/source/common/2d/v_2ddrawer.h @@ -7,6 +7,7 @@ #include "textures.h" #include "renderstyle.h" #include "dobject.h" +#include "refcounted.h" struct DrawParms; struct FColormap; @@ -49,6 +50,7 @@ struct F2DPolygons }; class DShape2D; +struct DShape2DBufferInfo; class F2DDrawer { @@ -123,7 +125,7 @@ public: bool useTransform; DMatrix3x3 transform; - DShape2D* shape2D; + RefCountedPtr shape2DBufInfo; int shape2DBufIndex; int shape2DIndexCount; int shape2DCommandCounter; @@ -136,7 +138,7 @@ public: // If these fields match, two draw commands can be batched. bool isCompatible(const RenderCommand &other) const { - if (shape2D != nullptr || other.shape2D != nullptr) return false; + if (shape2DBufInfo != nullptr || other.shape2DBufInfo != nullptr) return false; return mTexture == other.mTexture && mType == other.mType && mTranslationId == other.mTranslationId && @@ -214,6 +216,7 @@ public: void Begin(int w, int h) { isIn2D = true; Width = w; Height = h; } void End() { isIn2D = false; } bool HasBegun2D() { return isIn2D; } + void OnFrameDone(); void ClearClipRect() { clipleft = cliptop = 0; clipwidth = clipheight = -1; } void SetClipRect(int x, int y, int w, int h); @@ -240,12 +243,22 @@ public: bool mIsFirstPass = true; }; +struct DShape2DBufferInfo : NoVirtualRefCountedBase +{ + TArray buffers; + bool needsVertexUpload = true; + int bufIndex = -1; + int lastCommand = -1; + bool uploadedOnce = false; +}; + class DShape2D : public DObject { DECLARE_CLASS(DShape2D,DObject) public: DShape2D() + : bufferInfo(new DShape2DBufferInfo) { transform.Identity(); } @@ -261,12 +274,8 @@ public: DMatrix3x3 transform; - TArray buffers; - bool needsVertexUpload = true; - int bufIndex = -1; - int lastCommand = -1; + RefCountedPtr bufferInfo; - bool uploadedOnce = false; DrawParms* lastParms; void OnDestroy() override; diff --git a/source/common/console/c_commandbuffer.cpp b/source/common/console/c_commandbuffer.cpp index 0ca96ade3..bf459350f 100644 --- a/source/common/console/c_commandbuffer.cpp +++ b/source/common/console/c_commandbuffer.cpp @@ -291,7 +291,7 @@ void FCommandBuffer::AddString(FString clip) if (clip.IsNotEmpty()) { // Only paste the first line. - long brk = clip.IndexOfAny("\r\n\b"); + auto brk = clip.IndexOfAny("\r\n\b"); std::u32string build; if (brk >= 0) { diff --git a/source/common/console/c_cvars.cpp b/source/common/console/c_cvars.cpp index 1c6df1e24..7e5bd94ba 100644 --- a/source/common/console/c_cvars.cpp +++ b/source/common/console/c_cvars.cpp @@ -839,11 +839,11 @@ int FColorCVar::ToInt2 (UCVarValue value, ECVarType type) if (string.IsNotEmpty()) { - ret = V_GetColorFromString (NULL, string); + ret = V_GetColorFromString (string); } else { - ret = V_GetColorFromString (NULL, value.String); + ret = V_GetColorFromString (value.String); } } else diff --git a/source/common/console/c_dispatch.cpp b/source/common/console/c_dispatch.cpp index bcb52ba7e..ce9f2cef7 100644 --- a/source/common/console/c_dispatch.cpp +++ b/source/common/console/c_dispatch.cpp @@ -533,7 +533,7 @@ FString BuildString (int argc, FString *argv) else if (strchr(argv[arg], '"')) { // If it contains one or more quotes, we need to escape them. buf << '"'; - long substr_start = 0, quotepos; + ptrdiff_t substr_start = 0, quotepos; while ((quotepos = argv[arg].IndexOf('"', substr_start)) >= 0) { if (substr_start < quotepos) diff --git a/source/common/engine/stringtable.cpp b/source/common/engine/stringtable.cpp index a666a4d9c..b36e6e409 100644 --- a/source/common/engine/stringtable.cpp +++ b/source/common/engine/stringtable.cpp @@ -435,7 +435,7 @@ void FStringTable::InsertString(int lumpnum, int langid, FName label, const FStr { const char *strlangid = (const char *)&langid; TableElement te = { fileSystem.GetFileContainer(lumpnum), { string, string, string, string } }; - long index; + ptrdiff_t index; while ((index = te.strings[0].IndexOf("@[")) >= 0) { auto endindex = te.strings[0].IndexOf(']', index); diff --git a/source/common/filesystem/filesystem.cpp b/source/common/filesystem/filesystem.cpp index 8b14b1312..5a709726f 100644 --- a/source/common/filesystem/filesystem.cpp +++ b/source/common/filesystem/filesystem.cpp @@ -1546,7 +1546,7 @@ bool FileSystem::CreatePathlessCopy(const char *name, int id, int /*flags*/) if (lump < 0) return false; // Does not exist. auto oldlump = FileInfo[lump]; - int slash = oldlump.longName.LastIndexOf('/'); + ptrdiff_t slash = oldlump.longName.LastIndexOf('/'); if (slash == -1) { diff --git a/source/common/filesystem/resourcefile.cpp b/source/common/filesystem/resourcefile.cpp index 5fc484b23..cc2a27345 100644 --- a/source/common/filesystem/resourcefile.cpp +++ b/source/common/filesystem/resourcefile.cpp @@ -348,8 +348,8 @@ void FResourceFile::PostProcessArchive(void *lumps, size_t lumpsize, LumpFilterI uint32_t max = NumLumps; max -= FilterLumpsByGameType(filter, lumps, lumpsize, max); - long len; - int lastpos = -1; + ptrdiff_t len; + ptrdiff_t lastpos = -1; FString file; FString LumpFilter = filter->dotFilter; while ((len = LumpFilter.IndexOf('.', lastpos+1)) > 0) diff --git a/source/common/fonts/v_font.cpp b/source/common/fonts/v_font.cpp index 750bb5d95..1305fc413 100644 --- a/source/common/fonts/v_font.cpp +++ b/source/common/fonts/v_font.cpp @@ -415,19 +415,19 @@ void V_InitFontColors () else if (sc.Compare ("Flat:")) { sc.MustGetString(); - logcolor = V_GetColor (nullptr, sc); + logcolor = V_GetColor (sc); } else { // Get first color - c = V_GetColor (nullptr, sc); + c = V_GetColor (sc); tparm.Start[0] = RPART(c); tparm.Start[1] = GPART(c); tparm.Start[2] = BPART(c); // Get second color sc.MustGetString(); - c = V_GetColor (nullptr, sc); + c = V_GetColor (sc); tparm.End[0] = RPART(c); tparm.End[1] = GPART(c); tparm.End[2] = BPART(c); diff --git a/source/common/fonts/v_text.cpp b/source/common/fonts/v_text.cpp index 59d843496..bfd6eac92 100644 --- a/source/common/fonts/v_text.cpp +++ b/source/common/fonts/v_text.cpp @@ -88,7 +88,7 @@ TArray V_BreakLines (FFont *font, int maxwidth, const uint8_t *str { if (*string == '[') { - const uint8_t *start = string; + const uint8_t* start = string; while (*string != ']' && *string != '\0') { string++; @@ -97,11 +97,6 @@ TArray V_BreakLines (FFont *font, int maxwidth, const uint8_t *str { string++; } - lastcolor = FString((const char *)start, string - start); - } - else - { - lastcolor = *string++; } } continue; @@ -130,6 +125,33 @@ TArray V_BreakLines (FFont *font, int maxwidth, const uint8_t *str } auto index = Lines.Reserve(1); + for (const uint8_t* pos = start; pos < space; pos++) + { + if (*pos == TEXTCOLOR_ESCAPE) + { + pos++; + if (*pos) + { + if (*pos == '[') + { + const uint8_t* cstart = pos; + while (*pos != ']' && *pos != '\0') + { + pos++; + } + if (*pos != '\0') + { + pos++; + } + lastcolor = FString((const char*)cstart, pos - start); + } + else + { + lastcolor = *pos++; + } + } + } + } breakit (&Lines[index], font, start, space, linecolor); if (c == '\n' && !preservecolor) { diff --git a/source/common/menu/menudef.cpp b/source/common/menu/menudef.cpp index da73517b0..b6ebefc15 100644 --- a/source/common/menu/menudef.cpp +++ b/source/common/menu/menudef.cpp @@ -459,7 +459,7 @@ static void DoParseListMenuBody(FScanner &sc, DListMenuDescriptor *desc, bool &s } else if (args[i] == TypeColor) { - params.Push(V_GetColor(nullptr, sc)); + params.Push(V_GetColor(sc)); } else if (args[i] == TypeFont) { @@ -1028,7 +1028,7 @@ static void ParseOptionMenuBody(FScanner &sc, DOptionMenuDescriptor *desc, int i } else if (args[i] == TypeColor) { - params.Push(V_GetColor(nullptr, sc)); + params.Push(V_GetColor(sc)); } else if (args[i]->isIntCompatible()) { @@ -1274,7 +1274,7 @@ static void ParseImageScrollerBody(FScanner& sc, DImageScrollerDescriptor* desc) } else if (args[i] == TypeColor) { - params.Push(V_GetColor(nullptr, sc)); + params.Push(V_GetColor(sc)); } else if (args[i]->isIntCompatible()) { diff --git a/source/common/models/model.cpp b/source/common/models/model.cpp index 90dedc272..eea099045 100644 --- a/source/common/models/model.cpp +++ b/source/common/models/model.cpp @@ -90,8 +90,8 @@ static int FindGFXFile(FString & fn) if (lump != -1) return lump; int best = -1; - int dot = fn.LastIndexOf('.'); - int slash = fn.LastIndexOf('/'); + auto dot = fn.LastIndexOf('.'); + auto slash = fn.LastIndexOf('/'); if (dot > slash) fn.Truncate(dot); static const char * extensions[] = { ".png", ".jpg", ".tga", ".pcx", nullptr }; diff --git a/source/common/models/models_obj.cpp b/source/common/models/models_obj.cpp index 1af4fab7e..05d10b5cf 100644 --- a/source/common/models/models_obj.cpp +++ b/source/common/models/models_obj.cpp @@ -44,8 +44,8 @@ bool FOBJModel::Load(const char* fn, int lumpnum, const char* buffer, int length { // Ensure usemtl statements remain intact TArray mtlUsages; - TArray mtlUsageIdxs; - long bpos = 0, nlpos = 0, slashpos = 0; + TArray mtlUsageIdxs; + ptrdiff_t bpos = 0, nlpos = 0, slashpos = 0; while (1) { bpos = objBuf.IndexOf("\nusemtl", bpos); @@ -58,7 +58,7 @@ bool FOBJModel::Load(const char* fn, int lumpnum, const char* buffer, int length } if (nlpos == -1) { - nlpos = (long)objBuf.Len(); + nlpos = objBuf.Len(); } FString lineStr(objBuf.GetChars() + bpos, nlpos - bpos); mtlUsages.Push(lineStr); @@ -76,7 +76,7 @@ bool FOBJModel::Load(const char* fn, int lumpnum, const char* buffer, int length nlpos = objBuf.IndexOf('\n', bpos); if (nlpos == -1) { - nlpos = (long)objBuf.Len(); + nlpos = objBuf.Len(); } memcpy(wObjBuf + bpos, mtlUsages[i].GetChars(), nlpos - bpos); } diff --git a/source/common/rendering/hwrenderer/data/hw_shaderpatcher.cpp b/source/common/rendering/hwrenderer/data/hw_shaderpatcher.cpp index fb3b8a535..97420e0c2 100644 --- a/source/common/rendering/hwrenderer/data/hw_shaderpatcher.cpp +++ b/source/common/rendering/hwrenderer/data/hw_shaderpatcher.cpp @@ -52,15 +52,15 @@ static bool IsGlslWhitespace(char c) } } -static FString NextGlslToken(const char *chars, long len, long &pos) +static FString NextGlslToken(const char *chars, ptrdiff_t len, ptrdiff_t &pos) { // Eat whitespace - long tokenStart = pos; + ptrdiff_t tokenStart = pos; while (tokenStart != len && IsGlslWhitespace(chars[tokenStart])) tokenStart++; // Find token end - long tokenEnd = tokenStart; + ptrdiff_t tokenEnd = tokenStart; while (tokenEnd != len && !IsGlslWhitespace(chars[tokenEnd]) && chars[tokenEnd] != ';') tokenEnd++; @@ -82,13 +82,13 @@ FString RemoveLegacyUserUniforms(FString code) // The following code searches for legacy uniform declarations in the shader itself and replaces them with whitespace. - long len = (long)code.Len(); + ptrdiff_t len = code.Len(); char *chars = code.LockBuffer(); - long startIndex = 0; + ptrdiff_t startIndex = 0; while (true) { - long matchIndex = code.IndexOf("uniform", startIndex); + ptrdiff_t matchIndex = code.IndexOf("uniform", startIndex); if (matchIndex == -1) break; @@ -98,7 +98,7 @@ FString RemoveLegacyUserUniforms(FString code) bool isKeywordEnd = matchIndex + 7 == len || IsGlslWhitespace(chars[matchIndex + 7]); if (isKeywordStart && isKeywordEnd) { - long pos = matchIndex + 7; + ptrdiff_t pos = matchIndex + 7; FString type = NextGlslToken(chars, len, pos); FString identifier = NextGlslToken(chars, len, pos); @@ -107,10 +107,10 @@ FString RemoveLegacyUserUniforms(FString code) if (isLegacyUniformName) { - long statementEndIndex = code.IndexOf(';', matchIndex + 7); + ptrdiff_t statementEndIndex = code.IndexOf(';', matchIndex + 7); if (statementEndIndex == -1) statementEndIndex = len; - for (long i = matchIndex; i <= statementEndIndex; i++) + for (ptrdiff_t i = matchIndex; i <= statementEndIndex; i++) { if (!IsGlslWhitespace(chars[i])) chars[i] = ' '; @@ -127,7 +127,7 @@ FString RemoveLegacyUserUniforms(FString code) // Modern GLSL only allows use of 'texture'. while (true) { - long matchIndex = code.IndexOf("texture2d", startIndex); + ptrdiff_t matchIndex = code.IndexOf("texture2d", startIndex); if (matchIndex == -1) break; @@ -148,14 +148,14 @@ FString RemoveLegacyUserUniforms(FString code) FString RemoveSamplerBindings(FString code, TArray> &samplerstobind) { - long len = (long)code.Len(); + ptrdiff_t len = code.Len(); char *chars = code.LockBuffer(); - long startIndex = 0; - long startpos, endpos; + ptrdiff_t startIndex = 0; + ptrdiff_t startpos, endpos; while (true) { - long matchIndex = code.IndexOf("layout(binding", startIndex); + ptrdiff_t matchIndex = code.IndexOf("layout(binding", startIndex); if (matchIndex == -1) break; @@ -165,7 +165,7 @@ FString RemoveSamplerBindings(FString code, TArray> &sam bool isKeywordEnd = matchIndex + 14 == len || IsGlslWhitespace(chars[matchIndex + 14]) || chars[matchIndex + 14] == '='; if (isKeywordStart && isKeywordEnd) { - long pos = matchIndex + 14; + ptrdiff_t pos = matchIndex + 14; startpos = matchIndex; while (IsGlslWhitespace(chars[pos])) pos++; if (chars[pos] == '=') @@ -175,7 +175,7 @@ FString RemoveSamplerBindings(FString code, TArray> &sam auto val = strtol(&chars[pos], &p, 0); if (p != &chars[pos]) { - pos = long(p - chars); + pos = (p - chars); while (IsGlslWhitespace(chars[pos])) pos++; if (chars[pos] == ')') { @@ -216,17 +216,17 @@ FString RemoveSamplerBindings(FString code, TArray> &sam FString RemoveLayoutLocationDecl(FString code, const char *inoutkeyword) { - long len = (long)code.Len(); + ptrdiff_t len = code.Len(); char *chars = code.LockBuffer(); - long startIndex = 0; + ptrdiff_t startIndex = 0; while (true) { - long matchIndex = code.IndexOf("layout(location", startIndex); + ptrdiff_t matchIndex = code.IndexOf("layout(location", startIndex); if (matchIndex == -1) break; - long endIndex = matchIndex; + ptrdiff_t endIndex = matchIndex; // Find end of layout declaration while (chars[endIndex] != ')' && chars[endIndex] != 0) @@ -255,7 +255,7 @@ FString RemoveLayoutLocationDecl(FString code, const char *inoutkeyword) if (keywordFound && IsGlslWhitespace(chars[endIndex + i])) { // yes - replace declaration with spaces - for (long i = matchIndex; i < endIndex; i++) + for (auto i = matchIndex; i < endIndex; i++) chars[i] = ' '; } diff --git a/source/common/rendering/hwrenderer/data/hw_shadowmap.cpp b/source/common/rendering/hwrenderer/data/hw_shadowmap.cpp index 9b0de864f..c5e5fb09b 100644 --- a/source/common/rendering/hwrenderer/data/hw_shadowmap.cpp +++ b/source/common/rendering/hwrenderer/data/hw_shadowmap.cpp @@ -98,7 +98,8 @@ bool IShadowMap::PerformUpdate() LightsProcessed = 0; LightsShadowmapped = 0; - if (gl_lights && gl_light_shadowmap && (screen->hwcaps & RFL_SHADER_STORAGE_BUFFER) && CollectLights != nullptr) + // CollectLights will be null if the calling code decides that shadowmaps are not needed. + if (CollectLights != nullptr) { UpdateCycles.Clock(); UploadAABBTree(); diff --git a/source/common/rendering/hwrenderer/hw_draw2d.cpp b/source/common/rendering/hwrenderer/hw_draw2d.cpp index cf3399432..af10a7bf2 100644 --- a/source/common/rendering/hwrenderer/hw_draw2d.cpp +++ b/source/common/rendering/hwrenderer/hw_draw2d.cpp @@ -178,22 +178,22 @@ void Draw2D(F2DDrawer *drawer, FRenderState &state) state.EnableTexture(false); } - if (cmd.shape2D != nullptr) + if (cmd.shape2DBufInfo != nullptr) { - state.SetVertexBuffer(&cmd.shape2D->buffers[cmd.shape2DBufIndex]); + state.SetVertexBuffer(&cmd.shape2DBufInfo->buffers[cmd.shape2DBufIndex]); state.DrawIndexed(DT_Triangles, 0, cmd.shape2DIndexCount); state.SetVertexBuffer(&vb); - if (cmd.shape2DCommandCounter == cmd.shape2D->lastCommand) + if (cmd.shape2DCommandCounter == cmd.shape2DBufInfo->lastCommand) { - cmd.shape2D->lastCommand = -1; - if (cmd.shape2D->bufIndex > 0) + cmd.shape2DBufInfo->lastCommand = -1; + if (cmd.shape2DBufInfo->bufIndex > 0) { - cmd.shape2D->needsVertexUpload = true; - cmd.shape2D->buffers.Clear(); - cmd.shape2D->bufIndex = -1; + cmd.shape2DBufInfo->needsVertexUpload = true; + cmd.shape2DBufInfo->buffers.Clear(); + cmd.shape2DBufInfo->bufIndex = -1; } } - cmd.shape2D->uploadedOnce = false; + cmd.shape2DBufInfo->uploadedOnce = false; } else { diff --git a/source/common/rendering/v_video.cpp b/source/common/rendering/v_video.cpp index d0f136668..815b73a6b 100644 --- a/source/common/rendering/v_video.cpp +++ b/source/common/rendering/v_video.cpp @@ -154,7 +154,6 @@ int DisplayWidth, DisplayHeight; // There's also only one, not four. DFrameBuffer *screen; -CVAR(Bool, gl_lights, true, CVAR_ARCHIVE) CVAR (Int, vid_defwidth, 640, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (Int, vid_defheight, 480, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (Bool, ticker, false, 0) diff --git a/source/common/rendering/v_video.h b/source/common/rendering/v_video.h index 255cfa70c..c9124e05f 100644 --- a/source/common/rendering/v_video.h +++ b/source/common/rendering/v_video.h @@ -279,7 +279,6 @@ extern DFrameBuffer *screen; #define SCREENPITCH (screen->GetPitch ()) EXTERN_CVAR (Float, vid_gamma) -EXTERN_CVAR(Bool, gl_lights) // Allocates buffer screens, call before R_Init. diff --git a/source/common/scripting/backend/codegen.cpp b/source/common/scripting/backend/codegen.cpp index 17e148335..5be4b48be 100644 --- a/source/common/scripting/backend/codegen.cpp +++ b/source/common/scripting/backend/codegen.cpp @@ -1328,7 +1328,7 @@ FxExpression *FxColorCast::Resolve(FCompileContext &ctx) } else { - FxExpression *x = new FxConstant(V_GetColor(nullptr, constval.GetString(), &ScriptPosition), ScriptPosition); + FxExpression *x = new FxConstant(V_GetColor(constval.GetString(), &ScriptPosition), ScriptPosition); delete this; return x; } diff --git a/source/common/scripting/interface/stringformat.cpp b/source/common/scripting/interface/stringformat.cpp index 87bfbb415..4bfe34ff6 100644 --- a/source/common/scripting/interface/stringformat.cpp +++ b/source/common/scripting/interface/stringformat.cpp @@ -419,7 +419,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, Filter, StringFilter) static int StringIndexOf(FString *self, const FString &substr, int startIndex) { - return self->IndexOf(substr, startIndex); + return (int)self->IndexOf(substr, startIndex); } DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, IndexOf, StringIndexOf) @@ -427,12 +427,12 @@ DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, IndexOf, StringIndexOf) PARAM_SELF_STRUCT_PROLOGUE(FString); PARAM_STRING(substr); PARAM_INT(startIndex); - ACTION_RETURN_INT(self->IndexOf(substr, startIndex)); + ACTION_RETURN_INT(StringIndexOf(self, substr, startIndex)); } static int StringLastIndexOf(FString *self, const FString &substr, int endIndex) { - return self->LastIndexOfBroken(substr, endIndex); + return (int)self->LastIndexOfBroken(substr, endIndex); } DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, LastIndexOf, StringLastIndexOf) @@ -440,12 +440,12 @@ DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, LastIndexOf, StringLastIndexOf) PARAM_SELF_STRUCT_PROLOGUE(FString); PARAM_STRING(substr); PARAM_INT(endIndex); - ACTION_RETURN_INT(self->LastIndexOfBroken(substr, endIndex)); + ACTION_RETURN_INT(StringLastIndexOf(self, substr, endIndex)); } static int StringRightIndexOf(FString *self, const FString &substr, int endIndex) { - return self->LastIndexOf(substr, endIndex); + return (int)self->LastIndexOf(substr, endIndex); } DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, RightIndexOf, StringRightIndexOf) @@ -453,7 +453,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, RightIndexOf, StringRightIndexOf) PARAM_SELF_STRUCT_PROLOGUE(FString); PARAM_STRING(substr); PARAM_INT(endIndex); - ACTION_RETURN_INT(self->LastIndexOf(substr, endIndex)); + ACTION_RETURN_INT(StringRightIndexOf(self, substr, endIndex)); } static void StringToUpper(FString *self) diff --git a/source/common/scripting/jit/jit_move.cpp b/source/common/scripting/jit/jit_move.cpp index 53644568c..63f6158e3 100644 --- a/source/common/scripting/jit/jit_move.cpp +++ b/source/common/scripting/jit/jit_move.cpp @@ -49,7 +49,7 @@ static int CastS2I(FString *b) { return (int)b->ToLong(); } static double CastS2F(FString *b) { return b->ToDouble(); } static int CastS2N(FString *b) { return b->Len() == 0 ? NAME_None : FName(*b).GetIndex(); } static void CastN2S(FString *a, int b) { FName name = FName(ENamedName(b)); *a = name.IsValidName() ? name.GetChars() : ""; } -static int CastS2Co(FString *b) { return V_GetColor(nullptr, *b); } +static int CastS2Co(FString *b) { return V_GetColor(*b); } static void CastCo2S(FString *a, int b) { PalEntry c(b); a->Format("%02x %02x %02x", c.r, c.g, c.b); } static int CastS2So(FString *b) { return FSoundID(*b); } static void CastSo2S(FString* a, int b) { *a = soundEngine->GetSoundName(b); } diff --git a/source/common/scripting/vm/vmexec.h b/source/common/scripting/vm/vmexec.h index dc32d86c0..defbcdf6d 100644 --- a/source/common/scripting/vm/vmexec.h +++ b/source/common/scripting/vm/vmexec.h @@ -1826,7 +1826,7 @@ static void DoCast(const VMRegisters ®, const VMFrame *f, int a, int b, int c case CAST_S2Co: ASSERTD(a); ASSERTS(b); - reg.d[a] = V_GetColor(NULL, reg.s[b]); + reg.d[a] = V_GetColor(reg.s[b]); break; case CAST_Co2S: diff --git a/source/common/textures/multipatchtexturebuilder.cpp b/source/common/textures/multipatchtexturebuilder.cpp index 2557d848c..000af17e2 100644 --- a/source/common/textures/multipatchtexturebuilder.cpp +++ b/source/common/textures/multipatchtexturebuilder.cpp @@ -542,7 +542,7 @@ void FMultipatchTextureBuilder::ParsePatch(FScanner &sc, BuildInfo &info, TexPar if (!sc.CheckNumber()) { sc.MustGetString(); - part.Blend = V_GetColor(NULL, sc); + part.Blend = V_GetColor(sc); } else { diff --git a/source/common/utility/palette.cpp b/source/common/utility/palette.cpp index f2a2987b3..28a3cf35c 100644 --- a/source/common/utility/palette.cpp +++ b/source/common/utility/palette.cpp @@ -523,7 +523,7 @@ PalEntry averageColor(const uint32_t* data, int size, int maxout) // //========================================================================== -int V_GetColorFromString(const uint32_t* palette, const char* cstr, FScriptPosition* sc) +int V_GetColorFromString(const char* cstr, FScriptPosition* sc) { int c[3], i, p; char val[3]; @@ -609,10 +609,7 @@ int V_GetColorFromString(const uint32_t* palette, const char* cstr, FScriptPosit } } } - if (palette) - return BestColor(palette, c[0], c[1], c[2]); - else - return MAKERGB(c[0], c[1], c[2]); + return MAKERGB(c[0], c[1], c[2]); } //========================================================================== @@ -715,26 +712,26 @@ FString V_GetColorStringByName(const char* name, FScriptPosition* sc) // //========================================================================== -int V_GetColor(const uint32_t* palette, const char* str, FScriptPosition* sc) +int V_GetColor(const char* str, FScriptPosition* sc) { FString string = V_GetColorStringByName(str, sc); int res; if (!string.IsEmpty()) { - res = V_GetColorFromString(palette, string, sc); + res = V_GetColorFromString(string, sc); } else { - res = V_GetColorFromString(palette, str, sc); + res = V_GetColorFromString(str, sc); } return res; } -int V_GetColor(const uint32_t* palette, FScanner& sc) +int V_GetColor(FScanner& sc) { FScriptPosition scc = sc; - return V_GetColor(palette, sc.String, &scc); + return V_GetColor(sc.String, &scc); } //========================================================================== diff --git a/source/common/utility/palutil.h b/source/common/utility/palutil.h index 07f796f8e..a2bdeb446 100644 --- a/source/common/utility/palutil.h +++ b/source/common/utility/palutil.h @@ -22,14 +22,14 @@ void HSVtoRGB (float *r, float *g, float *b, float h, float s, float v); // Returns the closest color to the one desired. String // should be of the form "rr gg bb". -int V_GetColorFromString(const uint32_t* palette, const char* colorstring, FScriptPosition* sc = nullptr); +int V_GetColorFromString(const char* colorstring, FScriptPosition* sc = nullptr); // Scans through the X11R6RGB lump for a matching color // and returns a color string suitable for V_GetColorFromString. FString V_GetColorStringByName(const char* name, FScriptPosition* sc = nullptr); // Tries to get color by name, then by string -int V_GetColor(const uint32_t* palette, const char* str, FScriptPosition* sc = nullptr); -int V_GetColor(const uint32_t* palette, FScanner& sc); +int V_GetColor(const char* str, FScriptPosition* sc = nullptr); +int V_GetColor(FScanner& sc); PalEntry averageColor(const uint32_t* data, int size, int maxout); enum diff --git a/source/common/utility/refcounted.h b/source/common/utility/refcounted.h index b0c87d934..fd3e82aad 100644 --- a/source/common/utility/refcounted.h +++ b/source/common/utility/refcounted.h @@ -1,20 +1,29 @@ #pragma once // Simple lightweight reference counting pointer alternative for std::shared_ptr which stores the reference counter in the handled object itself. - - // Base class for handled objects + +// Base classes for handled objects +class NoVirtualRefCountedBase +{ +public: + void IncRef() { refCount++; } + void DecRef() { if (--refCount <= 0) delete this; } +private: + int refCount = 0; +}; + class RefCountedBase { public: - void IncRef() { refCount++; } - void DecRef() { if (--refCount <= 0) delete this; } + void IncRef() { refCount++; } + void DecRef() { if (--refCount <= 0) delete this; } private: - int refCount = 0; + int refCount = 0; protected: - virtual ~RefCountedBase() = default; + virtual ~RefCountedBase() = default; }; - - // The actual pointer object + +// The actual pointer object template class RefCountedPtr { @@ -31,10 +40,20 @@ public: { if (ptr) ptr->IncRef(); } - + + RefCountedPtr(const RefCountedPtr& r) : ptr(r.ptr) + { + if (ptr) ptr->IncRef(); + } + + RefCountedPtr(RefCountedPtr&& r) : ptr(r.ptr) + { + r.ptr = nullptr; + } + RefCountedPtr & operator=(const RefCountedPtr& r) { - if (ptr != r.ptr) + if (this != &r) { if (ptr) ptr->DecRef(); ptr = r.ptr; @@ -54,11 +73,14 @@ public: return *this; } - RefCountedPtr & operator=(const RefCountedPtr&& r) + RefCountedPtr & operator=(RefCountedPtr&& r) { - if (ptr) ptr->DecRef(); - ptr = r.ptr; - r.ptr = nullptr; + if (this != &r) + { + if (ptr) ptr->DecRef(); + ptr = r.ptr; + r.ptr = nullptr; + } return *this; } diff --git a/source/common/utility/s_playlist.cpp b/source/common/utility/s_playlist.cpp index 49e6f2d81..d284a3e90 100644 --- a/source/common/utility/s_playlist.cpp +++ b/source/common/utility/s_playlist.cpp @@ -95,7 +95,7 @@ bool FPlayList::ChangeList (const char *path) } // Check for relative paths. - long slashpos = song.IndexOf('/'); + auto slashpos = song.IndexOf('/'); if (slashpos == 0) { diff --git a/source/common/utility/zstring.cpp b/source/common/utility/zstring.cpp index 2cd308596..8d4d4d119 100644 --- a/source/common/utility/zstring.cpp +++ b/source/common/utility/zstring.cpp @@ -422,7 +422,7 @@ void FString::Remove(size_t index, size_t remlen) { if (index + remlen >= Len()) { - Truncate((long)index); + Truncate(index); } else { @@ -500,12 +500,12 @@ void FString::DeleteLastCharacter() } -long FString::IndexOf (const FString &substr, long startIndex) const +ptrdiff_t FString::IndexOf (const FString &substr, ptrdiff_t startIndex) const { return IndexOf (substr.Chars, startIndex); } -long FString::IndexOf (const char *substr, long startIndex) const +ptrdiff_t FString::IndexOf (const char *substr, ptrdiff_t startIndex) const { if (startIndex > 0 && Len() <= (size_t)startIndex) { @@ -516,10 +516,10 @@ long FString::IndexOf (const char *substr, long startIndex) const { return -1; } - return long(str - Chars); + return str - Chars; } -long FString::IndexOf (char subchar, long startIndex) const +ptrdiff_t FString::IndexOf (char subchar, ptrdiff_t startIndex) const { if (startIndex > 0 && Len() <= (size_t)startIndex) { @@ -530,15 +530,15 @@ long FString::IndexOf (char subchar, long startIndex) const { return -1; } - return long(str - Chars); + return str - Chars; } -long FString::IndexOfAny (const FString &charset, long startIndex) const +ptrdiff_t FString::IndexOfAny (const FString &charset, ptrdiff_t startIndex) const { return IndexOfAny (charset.Chars, startIndex); } -long FString::IndexOfAny (const char *charset, long startIndex) const +ptrdiff_t FString::IndexOfAny (const char *charset, ptrdiff_t startIndex) const { if (startIndex > 0 && Len() <= (size_t)startIndex) { @@ -549,19 +549,19 @@ long FString::IndexOfAny (const char *charset, long startIndex) const { return -1; } - return long(brk - Chars); + return brk - Chars; } -long FString::LastIndexOf (char subchar) const +ptrdiff_t FString::LastIndexOf (char subchar) const { - return LastIndexOf (subchar, long(Len())); + return LastIndexOf (subchar, Len()); } -long FString::LastIndexOf (char subchar, long endIndex) const +ptrdiff_t FString::LastIndexOf (char subchar, ptrdiff_t endIndex) const { if ((size_t)endIndex > Len()) { - endIndex = long(Len()); + endIndex = Len(); } while (--endIndex >= 0) { @@ -573,16 +573,16 @@ long FString::LastIndexOf (char subchar, long endIndex) const return -1; } -long FString::LastIndexOfBroken (const FString &_substr, long endIndex) const +ptrdiff_t FString::LastIndexOfBroken (const FString &_substr, ptrdiff_t endIndex) const { const char *substr = _substr.GetChars(); size_t substrlen = _substr.Len(); if ((size_t)endIndex > Len()) { - endIndex = long(Len()); + endIndex = Len(); } substrlen--; - while (--endIndex >= long(substrlen)) + while (--endIndex >= ptrdiff_t(substrlen)) { if (strncmp (substr, Chars + endIndex - substrlen, substrlen + 1) == 0) { @@ -592,26 +592,26 @@ long FString::LastIndexOfBroken (const FString &_substr, long endIndex) const return -1; } -long FString::LastIndexOfAny (const FString &charset) const +ptrdiff_t FString::LastIndexOfAny (const FString &charset) const { - return LastIndexOfAny (charset.Chars, long(Len())); + return LastIndexOfAny (charset.Chars, Len()); } -long FString::LastIndexOfAny (const char *charset) const +ptrdiff_t FString::LastIndexOfAny (const char *charset) const { return LastIndexOfAny (charset, long(Len())); } -long FString::LastIndexOfAny (const FString &charset, long endIndex) const +ptrdiff_t FString::LastIndexOfAny (const FString &charset, ptrdiff_t endIndex) const { return LastIndexOfAny (charset.Chars, endIndex); } -long FString::LastIndexOfAny (const char *charset, long endIndex) const +ptrdiff_t FString::LastIndexOfAny (const char *charset, ptrdiff_t endIndex) const { if ((size_t)endIndex > Len()) { - endIndex = long(Len()); + endIndex = Len(); } while (--endIndex >= 0) { @@ -623,31 +623,31 @@ long FString::LastIndexOfAny (const char *charset, long endIndex) const return -1; } -long FString::LastIndexOf (const FString &substr) const +ptrdiff_t FString::LastIndexOf (const FString &substr) const { - return LastIndexOf(substr.Chars, long(Len() - substr.Len()), substr.Len()); + return LastIndexOf(substr.Chars, Len() - substr.Len(), substr.Len()); } -long FString::LastIndexOf (const FString &substr, long endIndex) const +ptrdiff_t FString::LastIndexOf (const FString &substr, ptrdiff_t endIndex) const { return LastIndexOf(substr.Chars, endIndex, substr.Len()); } -long FString::LastIndexOf (const char *substr) const +ptrdiff_t FString::LastIndexOf (const char *substr) const { - return LastIndexOf(substr, long(Len() - strlen(substr)), strlen(substr)); + return LastIndexOf(substr, Len() - strlen(substr), strlen(substr)); } -long FString::LastIndexOf (const char *substr, long endIndex) const +ptrdiff_t FString::LastIndexOf (const char *substr, ptrdiff_t endIndex) const { return LastIndexOf(substr, endIndex, strlen(substr)); } -long FString::LastIndexOf (const char *substr, long endIndex, size_t substrlen) const +ptrdiff_t FString::LastIndexOf (const char *substr, ptrdiff_t endIndex, size_t substrlen) const { if ((size_t)endIndex + substrlen > Len()) { - endIndex = long(Len() - substrlen); + endIndex = Len() - substrlen; } while (endIndex >= 0) { @@ -1256,15 +1256,15 @@ void FString::Split(TArray& tokens, const char *delimiter, EmptyTokenTy { assert(nullptr != delimiter); - const long selfLen = static_cast(Len()); - const long delimLen = static_cast(strlen(delimiter)); - long lastPos = 0; + const auto selfLen = static_cast(Len()); + const auto delimLen = static_cast(strlen(delimiter)); + ptrdiff_t lastPos = 0; if (selfLen == 0) return; // Empty strings do not contain tokens, even with TOK_KEEPEMPTY. while (lastPos <= selfLen) { - long pos = IndexOf(delimiter, lastPos); + auto pos = IndexOf(delimiter, lastPos); if (-1 == pos) { diff --git a/source/common/utility/zstring.h b/source/common/utility/zstring.h index a30458c3c..4640d5c28 100644 --- a/source/common/utility/zstring.h +++ b/source/common/utility/zstring.h @@ -215,28 +215,28 @@ public: void AppendCharacter(int codepoint); void DeleteLastCharacter(); - long IndexOf (const FString &substr, long startIndex=0) const; - long IndexOf (const char *substr, long startIndex=0) const; - long IndexOf (char subchar, long startIndex=0) const; + ptrdiff_t IndexOf (const FString &substr, ptrdiff_t startIndex=0) const; + ptrdiff_t IndexOf (const char *substr, ptrdiff_t startIndex=0) const; + ptrdiff_t IndexOf (char subchar, ptrdiff_t startIndex=0) const; - long IndexOfAny (const FString &charset, long startIndex=0) const; - long IndexOfAny (const char *charset, long startIndex=0) const; + ptrdiff_t IndexOfAny (const FString &charset, ptrdiff_t startIndex=0) const; + ptrdiff_t IndexOfAny (const char *charset, ptrdiff_t startIndex=0) const; // This is only kept for backwards compatibility with old ZScript versions that used this function and depend on its bug. - long LastIndexOf (char subchar) const; - long LastIndexOfBroken (const FString &substr, long endIndex) const; - long LastIndexOf (char subchar, long endIndex) const; + ptrdiff_t LastIndexOf (char subchar) const; + ptrdiff_t LastIndexOfBroken (const FString &substr, ptrdiff_t endIndex) const; + ptrdiff_t LastIndexOf (char subchar, ptrdiff_t endIndex) const; - long LastIndexOfAny (const FString &charset) const; - long LastIndexOfAny (const char *charset) const; - long LastIndexOfAny (const FString &charset, long endIndex) const; - long LastIndexOfAny (const char *charset, long endIndex) const; + ptrdiff_t LastIndexOfAny (const FString &charset) const; + ptrdiff_t LastIndexOfAny (const char *charset) const; + ptrdiff_t LastIndexOfAny (const FString &charset, ptrdiff_t endIndex) const; + ptrdiff_t LastIndexOfAny (const char *charset, ptrdiff_t endIndex) const; - long LastIndexOf (const FString &substr) const; - long LastIndexOf (const FString &substr, long endIndex) const; - long LastIndexOf (const char *substr) const; - long LastIndexOf (const char *substr, long endIndex) const; - long LastIndexOf (const char *substr, long endIndex, size_t substrlen) const; + ptrdiff_t LastIndexOf (const FString &substr) const; + ptrdiff_t LastIndexOf (const FString &substr, ptrdiff_t endIndex) const; + ptrdiff_t LastIndexOf (const char *substr) const; + ptrdiff_t LastIndexOf (const char *substr, ptrdiff_t endIndex) const; + ptrdiff_t LastIndexOf (const char *substr, ptrdiff_t endIndex, size_t substrlen) const; void ToUpper (); void ToLower (); diff --git a/source/core/g_mapinfo.cpp b/source/core/g_mapinfo.cpp index e20eae815..91ece0a53 100644 --- a/source/core/g_mapinfo.cpp +++ b/source/core/g_mapinfo.cpp @@ -408,7 +408,7 @@ DEFINE_MAP_OPTION(fade, true) { parse.ParseAssign(); parse.sc.MustGetString(); - info->fadeto = V_GetColor(nullptr, parse.sc); + info->fadeto = V_GetColor(parse.sc); } DEFINE_MAP_OPTION(partime, true) diff --git a/source/core/gamecontrol.cpp b/source/core/gamecontrol.cpp index 10d3b55e1..0d40a92b1 100644 --- a/source/core/gamecontrol.cpp +++ b/source/core/gamecontrol.cpp @@ -698,7 +698,7 @@ static TArray SetupGame() { auto grplower = grp.FileName.MakeLower(); FixPathSeperator(grplower); - int pos = grplower.LastIndexOf(gamegrplower); + auto pos = grplower.LastIndexOf(gamegrplower); if (pos >= 0 && pos == grplower.Len() - gamegrplower.Len()) { groupno = g; diff --git a/source/core/initfs.cpp b/source/core/initfs.cpp index 790e5ba77..9b75ddd28 100644 --- a/source/core/initfs.cpp +++ b/source/core/initfs.cpp @@ -117,10 +117,10 @@ static TArray ParseGameInfo(TArray& pwads, const char* fn, con else if (!nextKey.CompareNoCase("STARTUPCOLORS")) { sc.MustGetString(); - GameStartupInfo.FgColor = V_GetColor(NULL, sc); + GameStartupInfo.FgColor = V_GetColor(sc); sc.MustGetStringName(","); sc.MustGetString(); - GameStartupInfo.BkColor = V_GetColor(NULL, sc); + GameStartupInfo.BkColor = V_GetColor(sc); } else if (!nextKey.CompareNoCase("CON")) {