/* Copyright (c) 2023 Alex Diener This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. Alex Diener alex@ludobloom.com */ #ifndef __TilesetEditData_H__ #define __TilesetEditData_H__ #include "dynamictypes/DataHashTable.h" #include "dynamictypes/DataValueSchema.h" #include "gamemath/Vector2i.h" #include "gamemath/Vector2u.h" #include "serialization/DeserializationContext.h" #include "serialization/SerializationContext.h" #include "tileset/ImageCollection.h" #include typedef uint32_t TileID; typedef uint32_t TilesetMetadataSchemaID; typedef uint32_t TilesetEnumerationID; typedef uint32_t TilesetID; #define TILE_ID_NONE ((TileID) 0) #define TILE_ID_MAX ((TileID) -3) #define ENUMERATION_ID_NONE ((TilesetEnumerationID) -1) #define METADATA_SCHEMA_ID_NONE ((TilesetMetadataSchemaID) -1) #define TILESET_EDIT_DATA_FORMAT_TYPE "tileset_edit" #define TILESET_EDIT_DATA_FORMAT_VERSION 1 #define TILESET_TILE_DIMENSION_MAX 1024 #define TILESET_ENUMERATION_COUNT_MAX 512 #define TILESET_ENUMERATION_VALUE_COUNT_MAX 512 #define TILESET_METADATA_SCHEMA_COUNT_MAX 128 #define TILESET_TILE_COUNT_MAX 16384 typedef enum TilesetSchemaIntegerType { SCHEMA_INTEGER_RAW, SCHEMA_INTEGER_ENUMERATION, SCHEMA_INTEGER_COORDINATE, SCHEMA_INTEGER_SLIDER, SCHEMA_INTEGER_OFFSET } TilesetSchemaIntegerType; typedef enum TilesetSchemaFieldType { METADATA_FIELD_TYPE_BOOLEAN, // checkbox METADATA_FIELD_TYPE_INTEGER, // integer edit field and stepper METADATA_FIELD_TYPE_FLOAT, // float edit field METADATA_FIELD_TYPE_FIXED, // hex edit field METADATA_FIELD_TYPE_STRING, // edit text METADATA_FIELD_TYPE_TEXT, // multiline edit text METADATA_FIELD_TYPE_ENUMERATION, // int32 and enumeration ID METADATA_FIELD_TYPE_COORDINATE, // pair of int16 (absolute) METADATA_FIELD_TYPE_OFFSET, // pair of int16 (relative) METADATA_FIELD_TYPE_SLIDER, METADATA_FIELD_TYPE_ARRAY } TilesetSchemaFieldType; typedef struct TileEditData { TileID identifier; char * name; ImageID imageID; Vector2i offset; TilesetMetadataSchemaID instanceSchemaID; DataHashTable * metadata; } TileEditData; typedef struct TilesetMetadataSchema { TilesetMetadataSchemaID identifier; char * name; unsigned int dirtyValue; DataValueSchema * schema; } TilesetMetadataSchema; typedef struct TilesetEnumerationValue { char * name; int32_t value; } TilesetEnumerationValue; typedef struct TilesetEnumeration { TilesetEnumerationID identifier; char * name; unsigned int valueCount; TilesetEnumerationValue * values; } TilesetEnumeration; typedef struct TilesetEditData { TilesetID identifier; char * name; Vector2u tileSize; Vector2i origin; unsigned int tileCount; TileEditData * tiles; unsigned int metadataSchemaCount; TilesetMetadataSchema * metadataSchemas; unsigned int enumerationCount; TilesetEnumeration * enumerations; TilesetMetadataSchemaID tileSchemaID; TilesetMetadataSchemaID tileMapSchemaID; TilesetMetadataSchemaID tileMapLayerSchemaID; TilesetMetadataSchemaID tileZoneSchemaID; } TilesetEditData; TilesetEditData * TilesetEditData_create(TilesetID identifier, const char * name, Vector2u tileSize, Vector2i origin, unsigned int tileCount, TileEditData * tiles); TilesetEditData * TilesetEditData_copy(TilesetEditData * tileset); void TilesetEditData_dispose(TilesetEditData * tileset); void TilesetEditData_serializeMinimal(TilesetEditData * tileset, compat_type(SerializationContext *) serializationContext); void TilesetEditData_serialize(TilesetEditData * tileset, compat_type(SerializationContext *) serializationContext); TilesetEditData * TilesetEditData_deserializeMinimal(compat_type(DeserializationContext *) deserializationContext, uint16_t formatVersion); TilesetEditData * TilesetEditData_deserialize(compat_type(DeserializationContext *) deserializationContext); TileID TilesetEditData_getUnusedTileID(TilesetEditData * tileset, TileID afterTileID); // Takes ownership of tile's contents void TilesetEditData_addTile(TilesetEditData * tileset, TileEditData tile); void TilesetEditData_insertTile(TilesetEditData * tileset, unsigned int tileIndex, TileEditData tile); TileEditData * TilesetEditData_getTile(TilesetEditData * tileset, TileID tileID); unsigned int TilesetEditData_getTileIndex(TilesetEditData * tileset, TileID tileID); void TilesetEditData_removeTileAtIndex(TilesetEditData * tileset, unsigned int tileIndex); void TilesetEditData_reorderTile(TilesetEditData * tileset, unsigned int fromTileIndex, unsigned int toTileIndex); TileEditData TilesetEditData_newTile(TilesetEditData * tileset, const char * defaultName, TileID afterTileID); TilesetEnumerationID TilesetEditData_getUnusedEnumerationID(TilesetEditData * tileset); void TilesetEditData_addEnumeration(TilesetEditData * tileset, TilesetEnumeration enumeration); void TilesetEditData_insertEnumeration(TilesetEditData * tileset, unsigned int enumerationIndex, TilesetEnumeration enumeration); TilesetEnumeration * TilesetEditData_getEnumeration(TilesetEditData * tileset, TilesetEnumerationID enumerationID); void TilesetEditData_removeEnumerationAtIndex(TilesetEditData * tileset, unsigned int enumerationIndex); void TilesetEditData_reorderEnumeration(TilesetEditData * tileset, unsigned int fromEnumerationIndex, unsigned int toEnumerationIndex); TilesetEnumeration TilesetEditData_newEnumeration(TilesetEditData * tileset, const char * defaultName); TilesetMetadataSchemaID TilesetEditData_getUnusedMetadataSchemaID(TilesetEditData * tileset); // Takes ownership of schema's contents void TilesetEditData_addMetadataSchema(TilesetEditData * tileset, TilesetMetadataSchema schema); void TilesetEditData_insertMetadataSchema(TilesetEditData * tileset, unsigned int schemaIndex, TilesetMetadataSchema schema); DataValueSchema * TilesetEditData_getMetadataSchema(TilesetEditData * tileset, TilesetMetadataSchemaID schemaID); TilesetMetadataSchema * TilesetEditData_getMetadataSchemaInfo(TilesetEditData * tileset, TilesetMetadataSchemaID schemaID); TilesetMetadataSchema * TilesetEditData_getMetadataSchemaInfoForName(TilesetEditData * tileset, const char * name); void TilesetEditData_removeMetadataSchemaAtIndex(TilesetEditData * tileset, unsigned int schemaIndex); void TilesetEditData_reorderMetadataSchema(TilesetEditData * tileset, unsigned int fromSchemaIndex, unsigned int toSchemaIndex); TilesetMetadataSchema TilesetEditData_newMetadataSchema(TilesetEditData * tileset, const char * defaultName); unsigned int getMetadataSizeForSchemaFieldType(TilesetSchemaFieldType type); TilesetSchemaFieldType getMetadataFieldType(DataValueSchemaField * field); TilesetSchemaIntegerType getSchemaIntegerType(const void * metadata); void setSchemaIntegerType(void * metadata, TilesetSchemaIntegerType type); TilesetEnumerationID getSchemaIntegerEnumerationID(const void * metadata); void setSchemaIntegerEnumerationID(void * metadata, TilesetEnumerationID enumerationID); int16_t getSchemaIntegerRangeMin(const void * metadata); int16_t getSchemaIntegerRangeMax(const void * metadata); void setSchemaIntegerRangeMin(void * metadata, int16_t rangeMin); void setSchemaIntegerRangeMax(void * metadata, int16_t rangeMax); bool getSchemaStringIsMultiline(const void * metadata); void setSchemaStringIsMultiline(void * metadata, bool isMultiline); int16_t getMetadataValueCoordinateX(uint32_t value); int16_t getMetadataValueCoordinateY(uint32_t value); void setMetadataValueCoordinateX(uint32_t * value, int16_t x); void setMetadataValueCoordinateY(uint32_t * value, int16_t y); #endif