mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-21 00:25:44 +00:00
feat: add gltf and glb as model dumping formats
This commit is contained in:
parent
f2438bea12
commit
8a0c93d3d8
File diff suppressed because it is too large
Load Diff
@ -2,37 +2,11 @@
|
|||||||
|
|
||||||
#include "Dumping/AbstractAssetDumper.h"
|
#include "Dumping/AbstractAssetDumper.h"
|
||||||
#include "Game/IW3/IW3.h"
|
#include "Game/IW3/IW3.h"
|
||||||
#include "Utils/DistinctMapper.h"
|
|
||||||
#include "XModel/AbstractXModelWriter.h"
|
|
||||||
#include "XModel/Obj/ObjWriter.h"
|
|
||||||
|
|
||||||
namespace IW3
|
namespace IW3
|
||||||
{
|
{
|
||||||
class AssetDumperXModel final : public AbstractAssetDumper<XModel>
|
class AssetDumperXModel final : public AbstractAssetDumper<XModel>
|
||||||
{
|
{
|
||||||
static GfxImage* GetMaterialColorMap(const Material* material);
|
|
||||||
static GfxImage* GetMaterialNormalMap(const Material* material);
|
|
||||||
static GfxImage* GetMaterialSpecularMap(const Material* material);
|
|
||||||
|
|
||||||
static void AddObjMaterials(ObjWriter& writer, DistinctMapper<Material*>& materialMapper, const XModel* model);
|
|
||||||
static void AddObjObjects(ObjWriter& writer, const DistinctMapper<Material*>& materialMapper, const XModel* model, unsigned lod);
|
|
||||||
static void AddObjVertices(ObjWriter& writer, const XModel* model, unsigned lod);
|
|
||||||
static void AddObjFaces(ObjWriter& writer, const XModel* model, unsigned lod);
|
|
||||||
static void DumpObjLod(AssetDumpingContext& context, XAssetInfo<XModel>* asset, unsigned lod);
|
|
||||||
static void DumpObjMat(const AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
static void DumpObj(AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
|
|
||||||
static void AddXModelBones(const AssetDumpingContext& context, AbstractXModelWriter& writer, const XModel* model);
|
|
||||||
static void AddXModelMaterials(AbstractXModelWriter& writer, DistinctMapper<Material*>& materialMapper, const XModel* model);
|
|
||||||
static void AddXModelObjects(AbstractXModelWriter& writer, const XModel* model, unsigned lod);
|
|
||||||
static void AddXModelVertices(AbstractXModelWriter& writer, const XModel* model, unsigned lod);
|
|
||||||
static void AllocateXModelBoneWeights(const XModel* model, unsigned lod, XModelVertexBoneWeightCollection& weightCollection);
|
|
||||||
static void
|
|
||||||
AddXModelVertexBoneWeights(AbstractXModelWriter& writer, const XModel* model, unsigned lod, XModelVertexBoneWeightCollection& weightCollection);
|
|
||||||
static void AddXModelFaces(AbstractXModelWriter& writer, const DistinctMapper<Material*>& materialMapper, const XModel* model, unsigned lod);
|
|
||||||
static void DumpXModelExportLod(const AssetDumpingContext& context, XAssetInfo<XModel>* asset, unsigned lod);
|
|
||||||
static void DumpXModelExport(const AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool ShouldDump(XAssetInfo<XModel>* asset) override;
|
bool ShouldDump(XAssetInfo<XModel>* asset) override;
|
||||||
void DumpAsset(AssetDumpingContext& context, XAssetInfo<XModel>* asset) override;
|
void DumpAsset(AssetDumpingContext& context, XAssetInfo<XModel>* asset) override;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -2,37 +2,11 @@
|
|||||||
|
|
||||||
#include "Dumping/AbstractAssetDumper.h"
|
#include "Dumping/AbstractAssetDumper.h"
|
||||||
#include "Game/IW4/IW4.h"
|
#include "Game/IW4/IW4.h"
|
||||||
#include "Utils/DistinctMapper.h"
|
|
||||||
#include "XModel/AbstractXModelWriter.h"
|
|
||||||
#include "XModel/Obj/ObjWriter.h"
|
|
||||||
|
|
||||||
namespace IW4
|
namespace IW4
|
||||||
{
|
{
|
||||||
class AssetDumperXModel final : public AbstractAssetDumper<XModel>
|
class AssetDumperXModel final : public AbstractAssetDumper<XModel>
|
||||||
{
|
{
|
||||||
static GfxImage* GetMaterialColorMap(const Material* material);
|
|
||||||
static GfxImage* GetMaterialNormalMap(const Material* material);
|
|
||||||
static GfxImage* GetMaterialSpecularMap(const Material* material);
|
|
||||||
|
|
||||||
static void AddObjMaterials(ObjWriter& writer, DistinctMapper<Material*>& materialMapper, const XModel* model);
|
|
||||||
static void AddObjObjects(ObjWriter& writer, const DistinctMapper<Material*>& materialMapper, const XModelSurfs* modelSurfs, int baseSurfaceIndex);
|
|
||||||
static void AddObjVertices(ObjWriter& writer, const XModelSurfs* modelSurfs);
|
|
||||||
static void AddObjFaces(ObjWriter& writer, const XModelSurfs* modelSurfs);
|
|
||||||
static void DumpObjLod(const AssetDumpingContext& context, XAssetInfo<XModel>* asset, const unsigned lod);
|
|
||||||
static void DumpObjMat(const AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
static void DumpObj(AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
|
|
||||||
static void AddXModelBones(const AssetDumpingContext& context, AbstractXModelWriter& writer, const XModel* model);
|
|
||||||
static void AddXModelMaterials(AbstractXModelWriter& writer, DistinctMapper<Material*>& materialMapper, const XModel* model);
|
|
||||||
static void AddXModelObjects(AbstractXModelWriter& writer, const XModelSurfs* modelSurfs);
|
|
||||||
static void AddXModelVertices(AbstractXModelWriter& writer, const XModelSurfs* modelSurfs);
|
|
||||||
static void AllocateXModelBoneWeights(const XModelSurfs* modelSurfs, XModelVertexBoneWeightCollection& weightCollection);
|
|
||||||
static void AddXModelVertexBoneWeights(AbstractXModelWriter& writer, const XModelSurfs* modelSurfs, XModelVertexBoneWeightCollection& weightCollection);
|
|
||||||
static void
|
|
||||||
AddXModelFaces(AbstractXModelWriter& writer, const DistinctMapper<Material*>& materialMapper, const XModelSurfs* modelSurfs, int baseSurfaceIndex);
|
|
||||||
static void DumpXModelExportLod(const AssetDumpingContext& context, XAssetInfo<XModel>* asset, unsigned lod);
|
|
||||||
static void DumpXModelExport(AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool ShouldDump(XAssetInfo<XModel>* asset) override;
|
bool ShouldDump(XAssetInfo<XModel>* asset) override;
|
||||||
void DumpAsset(AssetDumpingContext& context, XAssetInfo<XModel>* asset) override;
|
void DumpAsset(AssetDumpingContext& context, XAssetInfo<XModel>* asset) override;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -2,37 +2,11 @@
|
|||||||
|
|
||||||
#include "Dumping/AbstractAssetDumper.h"
|
#include "Dumping/AbstractAssetDumper.h"
|
||||||
#include "Game/IW5/IW5.h"
|
#include "Game/IW5/IW5.h"
|
||||||
#include "Utils/DistinctMapper.h"
|
|
||||||
#include "XModel/AbstractXModelWriter.h"
|
|
||||||
#include "XModel/Obj/ObjWriter.h"
|
|
||||||
|
|
||||||
namespace IW5
|
namespace IW5
|
||||||
{
|
{
|
||||||
class AssetDumperXModel final : public AbstractAssetDumper<XModel>
|
class AssetDumperXModel final : public AbstractAssetDumper<XModel>
|
||||||
{
|
{
|
||||||
static GfxImage* GetMaterialColorMap(const Material* material);
|
|
||||||
static GfxImage* GetMaterialNormalMap(const Material* material);
|
|
||||||
static GfxImage* GetMaterialSpecularMap(const Material* material);
|
|
||||||
|
|
||||||
static void AddObjMaterials(ObjWriter& writer, DistinctMapper<Material*>& materialMapper, const XModel* model);
|
|
||||||
static void AddObjObjects(ObjWriter& writer, const DistinctMapper<Material*>& materialMapper, const XModelSurfs* modelSurfs, int baseSurfaceIndex);
|
|
||||||
static void AddObjVertices(ObjWriter& writer, const XModelSurfs* modelSurfs);
|
|
||||||
static void AddObjFaces(ObjWriter& writer, const XModelSurfs* modelSurfs);
|
|
||||||
static void DumpObjLod(const AssetDumpingContext& context, XAssetInfo<XModel>* asset, const unsigned lod);
|
|
||||||
static void DumpObjMat(const AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
static void DumpObj(AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
|
|
||||||
static void AddXModelBones(const AssetDumpingContext& context, AbstractXModelWriter& writer, const XModel* model);
|
|
||||||
static void AddXModelMaterials(AbstractXModelWriter& writer, DistinctMapper<Material*>& materialMapper, const XModel* model);
|
|
||||||
static void AddXModelObjects(AbstractXModelWriter& writer, const XModelSurfs* modelSurfs);
|
|
||||||
static void AddXModelVertices(AbstractXModelWriter& writer, const XModelSurfs* modelSurfs);
|
|
||||||
static void AllocateXModelBoneWeights(const XModelSurfs* modelSurfs, XModelVertexBoneWeightCollection& weightCollection);
|
|
||||||
static void AddXModelVertexBoneWeights(AbstractXModelWriter& writer, const XModelSurfs* modelSurfs, XModelVertexBoneWeightCollection& weightCollection);
|
|
||||||
static void
|
|
||||||
AddXModelFaces(AbstractXModelWriter& writer, const DistinctMapper<Material*>& materialMapper, const XModelSurfs* modelSurfs, int baseSurfaceIndex);
|
|
||||||
static void DumpXModelExportLod(const AssetDumpingContext& context, XAssetInfo<XModel>* asset, unsigned lod);
|
|
||||||
static void DumpXModelExport(AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool ShouldDump(XAssetInfo<XModel>* asset) override;
|
bool ShouldDump(XAssetInfo<XModel>* asset) override;
|
||||||
void DumpAsset(AssetDumpingContext& context, XAssetInfo<XModel>* asset) override;
|
void DumpAsset(AssetDumpingContext& context, XAssetInfo<XModel>* asset) override;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -2,37 +2,11 @@
|
|||||||
|
|
||||||
#include "Dumping/AbstractAssetDumper.h"
|
#include "Dumping/AbstractAssetDumper.h"
|
||||||
#include "Game/T5/T5.h"
|
#include "Game/T5/T5.h"
|
||||||
#include "Utils/DistinctMapper.h"
|
|
||||||
#include "XModel/AbstractXModelWriter.h"
|
|
||||||
#include "XModel/Obj/ObjWriter.h"
|
|
||||||
|
|
||||||
namespace T5
|
namespace T5
|
||||||
{
|
{
|
||||||
class AssetDumperXModel final : public AbstractAssetDumper<XModel>
|
class AssetDumperXModel final : public AbstractAssetDumper<XModel>
|
||||||
{
|
{
|
||||||
static GfxImage* GetMaterialColorMap(const Material* material);
|
|
||||||
static GfxImage* GetMaterialNormalMap(const Material* material);
|
|
||||||
static GfxImage* GetMaterialSpecularMap(const Material* material);
|
|
||||||
|
|
||||||
static void AddObjMaterials(ObjWriter& writer, DistinctMapper<Material*>& materialMapper, const XModel* model);
|
|
||||||
static void AddObjObjects(ObjWriter& writer, const DistinctMapper<Material*>& materialMapper, const XModel* model, unsigned lod);
|
|
||||||
static void AddObjVertices(ObjWriter& writer, const XModel* model, unsigned lod);
|
|
||||||
static void AddObjFaces(ObjWriter& writer, const XModel* model, unsigned lod);
|
|
||||||
static void DumpObjLod(AssetDumpingContext& context, XAssetInfo<XModel>* asset, unsigned lod);
|
|
||||||
static void DumpObjMat(const AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
static void DumpObj(AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
|
|
||||||
static void AddXModelBones(const AssetDumpingContext& context, AbstractXModelWriter& writer, const XModel* model);
|
|
||||||
static void AddXModelMaterials(AbstractXModelWriter& writer, DistinctMapper<Material*>& materialMapper, const XModel* model);
|
|
||||||
static void AddXModelObjects(AbstractXModelWriter& writer, const XModel* model, unsigned lod);
|
|
||||||
static void AddXModelVertices(AbstractXModelWriter& writer, const XModel* model, unsigned lod);
|
|
||||||
static void AllocateXModelBoneWeights(const XModel* model, unsigned lod, XModelVertexBoneWeightCollection& weightCollection);
|
|
||||||
static void
|
|
||||||
AddXModelVertexBoneWeights(AbstractXModelWriter& writer, const XModel* model, unsigned lod, XModelVertexBoneWeightCollection& weightCollection);
|
|
||||||
static void AddXModelFaces(AbstractXModelWriter& writer, const DistinctMapper<Material*>& materialMapper, const XModel* model, unsigned lod);
|
|
||||||
static void DumpXModelExportLod(const AssetDumpingContext& context, XAssetInfo<XModel>* asset, unsigned lod);
|
|
||||||
static void DumpXModelExport(const AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool ShouldDump(XAssetInfo<XModel>* asset) override;
|
bool ShouldDump(XAssetInfo<XModel>* asset) override;
|
||||||
void DumpAsset(AssetDumpingContext& context, XAssetInfo<XModel>* asset) override;
|
void DumpAsset(AssetDumpingContext& context, XAssetInfo<XModel>* asset) override;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -2,37 +2,11 @@
|
|||||||
|
|
||||||
#include "Dumping/AbstractAssetDumper.h"
|
#include "Dumping/AbstractAssetDumper.h"
|
||||||
#include "Game/T6/T6.h"
|
#include "Game/T6/T6.h"
|
||||||
#include "Utils/DistinctMapper.h"
|
|
||||||
#include "XModel/AbstractXModelWriter.h"
|
|
||||||
#include "XModel/Obj/ObjWriter.h"
|
|
||||||
|
|
||||||
namespace T6
|
namespace T6
|
||||||
{
|
{
|
||||||
class AssetDumperXModel final : public AbstractAssetDumper<XModel>
|
class AssetDumperXModel final : public AbstractAssetDumper<XModel>
|
||||||
{
|
{
|
||||||
static GfxImage* GetMaterialColorMap(const Material* material);
|
|
||||||
static GfxImage* GetMaterialNormalMap(const Material* material);
|
|
||||||
static GfxImage* GetMaterialSpecularMap(const Material* material);
|
|
||||||
|
|
||||||
static void AddObjMaterials(ObjWriter& writer, DistinctMapper<Material*>& materialMapper, const XModel* model);
|
|
||||||
static void AddObjObjects(ObjWriter& writer, const DistinctMapper<Material*>& materialMapper, const XModel* model, unsigned lod);
|
|
||||||
static void AddObjVertices(ObjWriter& writer, const XModel* model, unsigned lod);
|
|
||||||
static void AddObjFaces(ObjWriter& writer, const XModel* model, unsigned lod);
|
|
||||||
static void DumpObjLod(AssetDumpingContext& context, XAssetInfo<XModel>* asset, unsigned lod);
|
|
||||||
static void DumpObjMat(const AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
static void DumpObj(AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
|
|
||||||
static void AddXModelBones(const AssetDumpingContext& context, AbstractXModelWriter& writer, const XModel* model);
|
|
||||||
static void AddXModelMaterials(AbstractXModelWriter& writer, DistinctMapper<Material*>& materialMapper, const XModel* model);
|
|
||||||
static void AddXModelObjects(AbstractXModelWriter& writer, const XModel* model, unsigned lod);
|
|
||||||
static void AddXModelVertices(AbstractXModelWriter& writer, const XModel* model, unsigned lod);
|
|
||||||
static void AllocateXModelBoneWeights(const XModel* model, unsigned lod, XModelVertexBoneWeightCollection& weightCollection);
|
|
||||||
static void
|
|
||||||
AddXModelVertexBoneWeights(AbstractXModelWriter& writer, const XModel* model, unsigned lod, XModelVertexBoneWeightCollection& weightCollection);
|
|
||||||
static void AddXModelFaces(AbstractXModelWriter& writer, const DistinctMapper<Material*>& materialMapper, const XModel* model, unsigned lod);
|
|
||||||
static void DumpXModelExportLod(const AssetDumpingContext& context, XAssetInfo<XModel>* asset, unsigned lod);
|
|
||||||
static void DumpXModelExport(const AssetDumpingContext& context, XAssetInfo<XModel>* asset);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool ShouldDump(XAssetInfo<XModel>* asset) override;
|
bool ShouldDump(XAssetInfo<XModel>* asset) override;
|
||||||
void DumpAsset(AssetDumpingContext& context, XAssetInfo<XModel>* asset) override;
|
void DumpAsset(AssetDumpingContext& context, XAssetInfo<XModel>* asset) override;
|
||||||
|
@ -20,14 +20,16 @@ public:
|
|||||||
enum class ModelOutputFormat_e
|
enum class ModelOutputFormat_e
|
||||||
{
|
{
|
||||||
XMODEL_EXPORT,
|
XMODEL_EXPORT,
|
||||||
OBJ
|
OBJ,
|
||||||
|
GLTF,
|
||||||
|
GLB
|
||||||
};
|
};
|
||||||
|
|
||||||
bool Verbose = false;
|
bool Verbose = false;
|
||||||
std::vector<bool> AssetTypesToHandleBitfield;
|
std::vector<bool> AssetTypesToHandleBitfield;
|
||||||
|
|
||||||
ImageOutputFormat_e ImageOutputFormat = ImageOutputFormat_e::DDS;
|
ImageOutputFormat_e ImageOutputFormat = ImageOutputFormat_e::DDS;
|
||||||
ModelOutputFormat_e ModelOutputFormat = ModelOutputFormat_e::XMODEL_EXPORT;
|
ModelOutputFormat_e ModelOutputFormat = ModelOutputFormat_e::GLB;
|
||||||
bool MenuLegacyMode = false;
|
bool MenuLegacyMode = false;
|
||||||
|
|
||||||
} Configuration;
|
} Configuration;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "ObjWriting.h"
|
#include "ObjWriting.h"
|
||||||
#include "Utils/Arguments/UsageInformation.h"
|
#include "Utils/Arguments/UsageInformation.h"
|
||||||
#include "Utils/FileUtils.h"
|
#include "Utils/FileUtils.h"
|
||||||
|
#include "Utils/StringUtils.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <regex>
|
#include <regex>
|
||||||
@ -79,7 +80,7 @@ const CommandLineOption* const OPTION_IMAGE_FORMAT =
|
|||||||
const CommandLineOption* const OPTION_MODEL_FORMAT =
|
const CommandLineOption* const OPTION_MODEL_FORMAT =
|
||||||
CommandLineOption::Builder::Create()
|
CommandLineOption::Builder::Create()
|
||||||
.WithLongName("model-format")
|
.WithLongName("model-format")
|
||||||
.WithDescription("Specifies the format of dumped model files. Valid values are: XMODEL_EXPORT, OBJ")
|
.WithDescription("Specifies the format of dumped model files. Valid values are: XMODEL_EXPORT, OBJ, GLTF, GLB")
|
||||||
.WithParameter("modelFormatValue")
|
.WithParameter("modelFormatValue")
|
||||||
.Build();
|
.Build();
|
||||||
|
|
||||||
@ -179,8 +180,7 @@ void UnlinkerArgs::SetVerbose(const bool isVerbose)
|
|||||||
bool UnlinkerArgs::SetImageDumpingMode()
|
bool UnlinkerArgs::SetImageDumpingMode()
|
||||||
{
|
{
|
||||||
auto specifiedValue = m_argument_parser.GetValueForOption(OPTION_IMAGE_FORMAT);
|
auto specifiedValue = m_argument_parser.GetValueForOption(OPTION_IMAGE_FORMAT);
|
||||||
for (auto& c : specifiedValue)
|
utils::MakeStringLowerCase(specifiedValue);
|
||||||
c = static_cast<char>(tolower(c));
|
|
||||||
|
|
||||||
if (specifiedValue == "dds")
|
if (specifiedValue == "dds")
|
||||||
{
|
{
|
||||||
@ -202,8 +202,7 @@ bool UnlinkerArgs::SetImageDumpingMode()
|
|||||||
bool UnlinkerArgs::SetModelDumpingMode()
|
bool UnlinkerArgs::SetModelDumpingMode()
|
||||||
{
|
{
|
||||||
auto specifiedValue = m_argument_parser.GetValueForOption(OPTION_MODEL_FORMAT);
|
auto specifiedValue = m_argument_parser.GetValueForOption(OPTION_MODEL_FORMAT);
|
||||||
for (auto& c : specifiedValue)
|
utils::MakeStringLowerCase(specifiedValue);
|
||||||
c = static_cast<char>(tolower(c));
|
|
||||||
|
|
||||||
if (specifiedValue == "xmodel_export")
|
if (specifiedValue == "xmodel_export")
|
||||||
{
|
{
|
||||||
@ -217,6 +216,18 @@ bool UnlinkerArgs::SetModelDumpingMode()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (specifiedValue == "gltf")
|
||||||
|
{
|
||||||
|
ObjWriting::Configuration.ModelOutputFormat = ObjWriting::Configuration_t::ModelOutputFormat_e::GLTF;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (specifiedValue == "glb")
|
||||||
|
{
|
||||||
|
ObjWriting::Configuration.ModelOutputFormat = ObjWriting::Configuration_t::ModelOutputFormat_e::GLB;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
const std::string originalValue = m_argument_parser.GetValueForOption(OPTION_MODEL_FORMAT);
|
const std::string originalValue = m_argument_parser.GetValueForOption(OPTION_MODEL_FORMAT);
|
||||||
printf("Illegal value: \"%s\" is not a valid model output format. Use -? to see usage information.\n", originalValue.c_str());
|
printf("Illegal value: \"%s\" is not a valid model output format. Use -? to see usage information.\n", originalValue.c_str());
|
||||||
return false;
|
return false;
|
||||||
@ -238,8 +249,7 @@ void UnlinkerArgs::ParseCommaSeparatedAssetTypeString(const std::string& input)
|
|||||||
size_t endPos;
|
size_t endPos;
|
||||||
|
|
||||||
std::string lowerInput(input);
|
std::string lowerInput(input);
|
||||||
for (auto& c : lowerInput)
|
utils::MakeStringLowerCase(lowerInput);
|
||||||
c = static_cast<char>(tolower(c));
|
|
||||||
|
|
||||||
while (currentPos < lowerInput.size() && (endPos = lowerInput.find_first_of(',', currentPos)) != std::string::npos)
|
while (currentPos < lowerInput.size() && (endPos = lowerInput.find_first_of(',', currentPos)) != std::string::npos)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user