diff --git a/src/common/StringMap.h b/src/common/StringMap.h index b53b46487..97dbe3c8b 100644 --- a/src/common/StringMap.h +++ b/src/common/StringMap.h @@ -182,6 +182,21 @@ private: }; // StringMap +#define DECLARE_STRINGMAP(type) \ +bool getConstant(const char *in, type &out); \ +bool getConstant(type in, const char *&out); \ +std::vector getConstants(type); \ + +#define DEFINE_STRINGMAP_BEGIN(type, count, name) \ +static StringMap::Entry name##Entries[] = + +#define DEFINE_STRINGMAP_END(type, count, name) \ +; \ +static StringMap name##s(name##Entries, sizeof(name##Entries)); \ +bool getConstant(const char *in, type &out) { return name##s.find(in, out); } \ +bool getConstant(type in, const char *&out) { return name##s.find(in, out); } \ +std::vector getConstants(type) { return name##s.getNames(); } + } // love #endif // LOVE_STRING_MAP_H diff --git a/src/modules/graphics/vertex.cpp b/src/modules/graphics/vertex.cpp index c0c13bede..cfd7acdbb 100644 --- a/src/modules/graphics/vertex.cpp +++ b/src/modules/graphics/vertex.cpp @@ -219,8 +219,7 @@ bool isDataTypeInteger(DataType datatype) IndexDataType getIndexDataTypeFromMax(size_t maxvalue) { - IndexDataType types[] = {INDEX_UINT16, INDEX_UINT32}; - return types[maxvalue > LOVE_UINT16_MAX ? 1 : 0]; + return maxvalue > LOVE_UINT16_MAX ? INDEX_UINT32 : INDEX_UINT16; } int getIndexCount(TriangleIndexMode mode, int vertexCount) @@ -352,51 +351,46 @@ void VertexAttributes::setCommonFormat(CommonFormat format, uint8 bufferindex) } } -static StringMap::Entry attribNameEntries[] = +DEFINE_STRINGMAP_BEGIN(BuiltinVertexAttribute, ATTRIB_MAX_ENUM, attribName) { { "VertexPosition", ATTRIB_POS }, { "VertexTexCoord", ATTRIB_TEXCOORD }, { "VertexColor", ATTRIB_COLOR }, -}; +} +DEFINE_STRINGMAP_END(BuiltinVertexAttribute, ATTRIB_MAX_ENUM, attribName) -static StringMap attribNames(attribNameEntries, sizeof(attribNameEntries)); - -static StringMap::Entry indexTypeEntries[] = +DEFINE_STRINGMAP_BEGIN(IndexDataType, INDEX_MAX_ENUM, indexType) { { "uint16", INDEX_UINT16 }, { "uint32", INDEX_UINT32 }, -}; +} +DEFINE_STRINGMAP_END(IndexDataType, INDEX_MAX_ENUM, indexType) -static StringMap indexTypes(indexTypeEntries, sizeof(indexTypeEntries)); - -static StringMap::Entry usageEntries[] = +DEFINE_STRINGMAP_BEGIN(BufferUsage, BUFFERUSAGE_MAX_ENUM, bufferUsage) { { "stream", BUFFERUSAGE_STREAM }, { "dynamic", BUFFERUSAGE_DYNAMIC }, { "static", BUFFERUSAGE_STATIC }, -}; +} +DEFINE_STRINGMAP_END(BufferUsage, BUFFERUSAGE_MAX_ENUM, bufferUsage) -static StringMap usages(usageEntries, sizeof(usageEntries)); - -static StringMap::Entry primitiveTypeEntries[] = +DEFINE_STRINGMAP_BEGIN(PrimitiveType, PRIMITIVE_MAX_ENUM, primitiveType) { { "fan", PRIMITIVE_TRIANGLE_FAN }, { "strip", PRIMITIVE_TRIANGLE_STRIP }, { "triangles", PRIMITIVE_TRIANGLES }, { "points", PRIMITIVE_POINTS }, -}; +} +DEFINE_STRINGMAP_END(PrimitiveType, PRIMITIVE_MAX_ENUM, primitiveType) -static StringMap primitiveTypes(primitiveTypeEntries, sizeof(primitiveTypeEntries)); - -static StringMap::Entry attributeStepEntries[] = +DEFINE_STRINGMAP_BEGIN(AttributeStep, STEP_MAX_ENUM, attributeStep) { { "pervertex", STEP_PER_VERTEX }, { "perinstance", STEP_PER_INSTANCE }, -}; +} +DEFINE_STRINGMAP_END(AttributeStep, STEP_MAX_ENUM, attributeStep) -static StringMap attributeSteps(attributeStepEntries, sizeof(attributeStepEntries)); - -static StringMap::Entry dataTypeEntries[] = +DEFINE_STRINGMAP_BEGIN(DataType, DATA_MAX_ENUM, dataType) { { "snorm8", DATA_SNORM8 }, { "unorm8", DATA_UNORM8 }, @@ -409,141 +403,91 @@ static StringMap::Entry dataTypeEntries[] = { "int32", DATA_INT32 }, { "uint32", DATA_UINT32 }, { "float", DATA_FLOAT }, -}; +} +DEFINE_STRINGMAP_END(DataType, DATA_MAX_ENUM, dataType) -static StringMap dataTypes(dataTypeEntries, sizeof(dataTypeEntries)); +DEFINE_STRINGMAP_BEGIN(DataFormat, DATAFORMAT_MAX_ENUM, dataFormat) +{ + { "float", DATAFORMAT_FLOAT }, + { "floatvec2", DATAFORMAT_FLOAT_VEC2 }, + { "floatvec3", DATAFORMAT_FLOAT_VEC3 }, + { "floatvec4", DATAFORMAT_FLOAT_VEC4 }, -static StringMap::Entry cullModeEntries[] = + { "floatmat2x2", DATAFORMAT_FLOAT_MAT2X2 }, + { "floatmat2x3", DATAFORMAT_FLOAT_MAT2X3 }, + { "floatmat2x4", DATAFORMAT_FLOAT_MAT2X4 }, + + { "floatmat3x2", DATAFORMAT_FLOAT_MAT3X2 }, + { "floatmat3x3", DATAFORMAT_FLOAT_MAT3X3 }, + { "floatmat3x4", DATAFORMAT_FLOAT_MAT3X4 }, + + { "floatmat4x2", DATAFORMAT_FLOAT_MAT4X2 }, + { "floatmat4x3", DATAFORMAT_FLOAT_MAT4X3 }, + { "floatmat4x4", DATAFORMAT_FLOAT_MAT4X4 }, + + { "int32", DATAFORMAT_INT32 }, + { "int32vec2", DATAFORMAT_INT32_VEC2 }, + { "int32vec3", DATAFORMAT_INT32_VEC3 }, + { "int32vec4", DATAFORMAT_INT32_VEC4 }, + + { "uint32", DATAFORMAT_UINT32 }, + { "uint32vec2", DATAFORMAT_UINT32_VEC2 }, + { "uint32vec3", DATAFORMAT_UINT32_VEC3 }, + { "uint32vec4", DATAFORMAT_UINT32_VEC4 }, + + { "snorm8vec4", DATAFORMAT_SNORM8_VEC4 }, + { "unorm8vec4", DATAFORMAT_UNORM8_VEC4 }, + { "int8vec4", DATAFORMAT_INT8_VEC4 }, + { "uint8vec4", DATAFORMAT_UINT8_VEC4 }, + + { "snorm16", DATAFORMAT_SNORM16 }, + { "snorm16vec2", DATAFORMAT_SNORM16_VEC2 }, + { "snorm16vec4", DATAFORMAT_SNORM16_VEC4 }, + + { "unorm16", DATAFORMAT_UNORM16 }, + { "unorm16vec2", DATAFORMAT_UNORM16_VEC2 }, + { "unorm16vec4", DATAFORMAT_UNORM16_VEC4 }, + + { "int16", DATAFORMAT_INT16 }, + { "int16vec2", DATAFORMAT_INT16_VEC2 }, + { "int16vec4", DATAFORMAT_INT16_VEC4 }, + + { "uint16", DATAFORMAT_UINT16 }, + { "uint16vec2", DATAFORMAT_UINT16_VEC2 }, + { "uint16vec4", DATAFORMAT_UINT16_VEC4 }, + + { "bool", DATAFORMAT_BOOL }, + { "boolvec2", DATAFORMAT_BOOL_VEC2 }, + { "boolvec3", DATAFORMAT_BOOL_VEC3 }, + { "boolvec4", DATAFORMAT_BOOL_VEC4 }, +} +DEFINE_STRINGMAP_END(DataFormat, DATAFORMAT_MAX_ENUM, dataFormat) + +DEFINE_STRINGMAP_BEGIN(DataBaseType, DATA_BASETYPE_MAX_ENUM, dataBaseType) +{ + { "float", DATA_BASETYPE_FLOAT }, + { "int", DATA_BASETYPE_INT }, + { "uint", DATA_BASETYPE_UINT }, + { "snorm", DATA_BASETYPE_SNORM }, + { "unorm", DATA_BASETYPE_UNORM }, + { "bool", DATA_BASETYPE_BOOL }, +} +DEFINE_STRINGMAP_END(DataBaseType, DATA_BASETYPE_MAX_ENUM, dataBaseType) + +DEFINE_STRINGMAP_BEGIN(CullMode, CULL_MAX_ENUM, cullMode) { { "none", CULL_NONE }, { "back", CULL_BACK }, { "front", CULL_FRONT }, -}; +} +DEFINE_STRINGMAP_END(CullMode, CULL_MAX_ENUM, cullMode) -static StringMap cullModes(cullModeEntries, sizeof(cullModeEntries)); - -static StringMap::Entry windingEntries[] = +DEFINE_STRINGMAP_BEGIN(Winding, WINDING_MAX_ENUM, winding) { { "cw", WINDING_CW }, { "ccw", WINDING_CCW }, -}; - -static StringMap windings(windingEntries, sizeof(windingEntries)); - -bool getConstant(const char *in, BuiltinVertexAttribute &out) -{ - return attribNames.find(in, out); -} - -bool getConstant(BuiltinVertexAttribute in, const char *&out) -{ - return attribNames.find(in, out); -} - -bool getConstant(const char *in, IndexDataType &out) -{ - return indexTypes.find(in, out); -} - -bool getConstant(IndexDataType in, const char *&out) -{ - return indexTypes.find(in, out); -} - -std::vector getConstants(IndexDataType) -{ - return indexTypes.getNames(); -} - -bool getConstant(const char *in, BufferUsage &out) -{ - return usages.find(in, out); -} - -bool getConstant(BufferUsage in, const char *&out) -{ - return usages.find(in, out); -} - -std::vector getConstants(BufferUsage) -{ - return usages.getNames(); -} - -bool getConstant(const char *in, PrimitiveType &out) -{ - return primitiveTypes.find(in, out); -} - -bool getConstant(PrimitiveType in, const char *&out) -{ - return primitiveTypes.find(in, out); -} - -std::vector getConstants(PrimitiveType) -{ - return primitiveTypes.getNames(); -} - -bool getConstant(const char *in, AttributeStep &out) -{ - return attributeSteps.find(in, out); -} - -bool getConstant(AttributeStep in, const char *&out) -{ - return attributeSteps.find(in, out); -} - -std::vector getConstants(AttributeStep) -{ - return attributeSteps.getNames(); -} - -bool getConstant(const char *in, DataType &out) -{ - return dataTypes.find(in, out); -} - -bool getConstant(DataType in, const char *&out) -{ - return dataTypes.find(in, out); -} - -std::vector getConstants(DataType) -{ - return dataTypes.getNames(); -} - -bool getConstant(const char *in, CullMode &out) -{ - return cullModes.find(in, out); -} - -bool getConstant(CullMode in, const char *&out) -{ - return cullModes.find(in, out); -} - -std::vector getConstants(CullMode) -{ - return cullModes.getNames(); -} - -bool getConstant(const char *in, Winding &out) -{ - return windings.find(in, out); -} - -bool getConstant(Winding in, const char *&out) -{ - return windings.find(in, out); -} - -std::vector getConstants(Winding) -{ - return windings.getNames(); } +DEFINE_STRINGMAP_END(Winding, WINDING_MAX_ENUM, winding) } // graphics } // love diff --git a/src/modules/graphics/vertex.h b/src/modules/graphics/vertex.h index bc5e72301..ded03f536 100644 --- a/src/modules/graphics/vertex.h +++ b/src/modules/graphics/vertex.h @@ -23,6 +23,7 @@ // LOVE #include "common/int.h" #include "common/Color.h" +#include "common/StringMap.h" // C #include @@ -131,6 +132,7 @@ enum DataType DATA_MAX_ENUM }; +// Value types used when interfacing with the GPU (vertex and shader data). // The order of this enum affects the dataFormatInfo array. enum DataFormat { @@ -413,36 +415,16 @@ int getIndexCount(TriangleIndexMode mode, int vertexCount); void fillIndices(TriangleIndexMode mode, uint16 vertexStart, uint16 vertexCount, uint16 *indices); void fillIndices(TriangleIndexMode mode, uint32 vertexStart, uint32 vertexCount, uint32 *indices); -bool getConstant(const char *in, BuiltinVertexAttribute &out); -bool getConstant(BuiltinVertexAttribute in, const char *&out); - -bool getConstant(const char *in, IndexDataType &out); -bool getConstant(IndexDataType in, const char *&out); -std::vector getConstants(IndexDataType); - -bool getConstant(const char *in, BufferUsage &out); -bool getConstant(BufferUsage in, const char *&out); -std::vector getConstants(BufferUsage); - -bool getConstant(const char *in, PrimitiveType &out); -bool getConstant(PrimitiveType in, const char *&out); -std::vector getConstants(PrimitiveType); - -bool getConstant(const char *in, AttributeStep &out); -bool getConstant(AttributeStep in, const char *&out); -std::vector getConstants(AttributeStep); - -bool getConstant(const char *in, DataType &out); -bool getConstant(DataType in, const char *&out); -std::vector getConstants(DataType); - -bool getConstant(const char *in, CullMode &out); -bool getConstant(CullMode in, const char *&out); -std::vector getConstants(CullMode); - -bool getConstant(const char *in, Winding &out); -bool getConstant(Winding in, const char *&out); -std::vector getConstants(Winding); +DECLARE_STRINGMAP(BuiltinVertexAttribute); +DECLARE_STRINGMAP(IndexDataType); +DECLARE_STRINGMAP(BufferUsage); +DECLARE_STRINGMAP(PrimitiveType); +DECLARE_STRINGMAP(AttributeStep); +DECLARE_STRINGMAP(DataType); +DECLARE_STRINGMAP(DataFormat); +DECLARE_STRINGMAP(DataBaseType); +DECLARE_STRINGMAP(CullMode); +DECLARE_STRINGMAP(Winding); } // graphics } // love