diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..883631e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "cmake.debugConfig": { + "args": ["D:/PROJECTS/EtrediaEmpires/sdk/map/provinces.bmp", "D:/PROJECTS/EtrediaEmpires/sdk/map/provinces.map"] + } +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 5388d28..e1aebf6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) project (EtrediaEmpires) +add_subdirectory(sdk/map) add_subdirectory(sdk/materials) add_subdirectory(utils) add_subdirectory(p7lib) diff --git a/assets/map/provinces.map b/assets/map/provinces.map new file mode 100644 index 0000000..e69de29 diff --git a/assets/materials/helloworld.mat b/assets/materials/helloworld.mat new file mode 100644 index 0000000..b258151 Binary files /dev/null and b/assets/materials/helloworld.mat differ diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index ec6b868..09cbd2a 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -25,6 +25,7 @@ file(GLOB_RECURSE SOURCES CONFIGURE_DEPENDS find_package(Boost REQUIRED COMPONENTS lockfree) find_package(xxHash CONFIG REQUIRED) find_package(glfw3 CONFIG REQUIRED) +find_package(glm CONFIG REQUIRED) # Link library @@ -38,6 +39,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE Boost::lockfree) target_link_libraries(${PROJECT_NAME} PRIVATE xxHash::xxhash) target_link_libraries(${PROJECT_NAME} PRIVATE p7) target_link_libraries(${PROJECT_NAME} PRIVATE glfw) +target_link_libraries(${PROJECT_NAME} PRIVATE glm::glm) target_include_directories(${PROJECT_NAME} PUBLIC include/) diff --git a/sdk/map/CMakeLists.txt b/sdk/map/CMakeLists.txt new file mode 100644 index 0000000..eac732a --- /dev/null +++ b/sdk/map/CMakeLists.txt @@ -0,0 +1,45 @@ +cmake_minimum_required (VERSION 3.8) + +if (POLICY CMP0141) + cmake_policy(SET CMP0141 NEW) + set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$,$>,$<$:EditAndContinue>,$<$:ProgramDatabase>>") +endif() + +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +project (convert_map) + +# find_package(glm CONFIG REQUIRED) + +add_executable(${PROJECT_NAME} convert_map.cpp) + +# target_link_libraries(${PROJECT_NAME} PRIVATE glm::glm) +# target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/engine/include/) + +if (CMAKE_VERSION VERSION_GREATER 3.12) + set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 20) +endif() + +file(GLOB MAP_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.bmp") + +set(COMPILED_DIR "${CMAKE_SOURCE_DIR}/assets/map") + +foreach(MAP ${MAP_FILES}) + get_filename_component(MAP_NAME ${MAP} NAME_WE) + set(OUT_FILE "${COMPILED_DIR}/${MAP_NAME}.map") + + add_custom_command( + OUTPUT ${OUT_FILE} + COMMAND ${PROJECT_NAME} ${MAP} ${OUT_FILE} + DEPENDS ${MAP} + COMMENT "Converting map ${MAP_NAME}" + VERBATIM + ) + + list(APPEND COMPILED_BINARIES ${OUT_FILE}) +endforeach() + +add_custom_target(compile_maps ALL + DEPENDS ${COMPILED_BINARIES} +) diff --git a/sdk/map/_provinces.bmp b/sdk/map/_provinces.bmp new file mode 100644 index 0000000..05012ce Binary files /dev/null and b/sdk/map/_provinces.bmp differ diff --git a/sdk/map/convert_map.cpp b/sdk/map/convert_map.cpp new file mode 100644 index 0000000..c6bddf3 --- /dev/null +++ b/sdk/map/convert_map.cpp @@ -0,0 +1,230 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define bytes(value) reinterpret_cast(value) + +#pragma pack(push, 1) +struct BMPFileHeader { + uint16_t bfType; + uint32_t bfSize; + uint16_t bfReserved1; + uint16_t bfReserved2; + uint32_t bfOffBits; +}; + +struct BMPInfoHeader { + uint32_t biSize; + int32_t biWidth; + int32_t biHeight; + uint16_t biPlanes; + uint16_t biBitCount; + uint32_t biCompression; + uint32_t biSizeImage; + int32_t biXPelsPerMeter; + int32_t biYPelsPerMeter; + uint32_t biClrUsed; + uint32_t biClrImportant; +}; + +struct BGR { uint8_t b,g,r; }; +#pragma pack(pop) + +struct vertex { float x,y; }; + +struct BGRHash { + size_t operator()(const BGR& c) const noexcept { + return (c.r<<16)|(c.g<<8)|c.b; + } +}; + +bool operator==(const BGR&a,const BGR&b){ + return a.r==b.r && a.g==b.g && a.b==b.b; +} + +BGR EMPTY_COLOR{255,255,255}; + +uint8_t* imageData; +uint8_t* tempImageData; +size_t width,height,rowSize; + +std::unordered_map>,BGRHash> +pixelsPerProvincesPerState; + +inline BGR getPixelSafe(size_t r,size_t c){ + if(r>=height||c>=width) return EMPTY_COLOR; + return *reinterpret_cast( + imageData + r*rowSize + c*3 + ); +} + +inline BGR getPixelSafeIndex(size_t i){ + return getPixelSafe(i/width,i%width); +} + +/* ================= FLOOD FILL ================= */ + +void FloodFill(){ + size_t size=width*height; + for(size_t i=0;i(tempImageData + (i/width)*rowSize + (i%width)*3)==EMPTY_COLOR) + continue; + + BGR color=*reinterpret_cast(tempImageData + (i/width)*rowSize + (i%width)*3); + std::vector prov; + std::queue q; + q.push(i); + + while(!q.empty()){ + size_t n=q.front(); q.pop(); + BGR& px=*reinterpret_cast(tempImageData + (n/width)*rowSize + (n%width)*3); + if(px!=color) continue; + px=EMPTY_COLOR; + prov.push_back(n); + + if(n>=width) q.push(n-width); + if(n+width&prov,BGR id){ + for(size_t i:prov){ + size_t r=i/width,c=i%width; + if(getPixelSafe(r-1,c)!=id|| + getPixelSafe(r+1,c)!=id|| + getPixelSafe(r,c-1)!=id|| + getPixelSafe(r,c+1)!=id) + return i; + } + return std::numeric_limits::max(); +} + +void FindContour(){ + for(auto&[state,provs]:pixelsPerProvincesPerState){ + for(auto&prov:provs){ + if(prov.empty()) continue; + BGR id=getPixelSafeIndex(prov[0]); + size_t start=FindStart(prov,id); + if(start==std::numeric_limits::max()) continue; + + std::vector contour; + contour.push_back(start); + + size_t cur=start; + size_t prev = (start % width > 0) ? start - 1 : start + 1; + + + const size_t MAX=prov.size()*8; + for(size_t i=0;i img(rowSize*height); + std::vector tmp(rowSize*height); + + fin.seekg(fh.bfOffBits); + fin.read((char*)img.data(),img.size()); + fin.seekg(fh.bfOffBits); + fin.read((char*)tmp.data(),tmp.size()); + + imageData=img.data(); + tempImageData=tmp.data(); + + FloodFill(); + FindContour(); + Aproximate(0); + Triangulate(); + GenVertices(fout); +} diff --git a/sdk/map/provinces.bmp b/sdk/map/provinces.bmp new file mode 100644 index 0000000..9289c27 Binary files /dev/null and b/sdk/map/provinces.bmp differ diff --git a/sdk/map/provinces.map b/sdk/map/provinces.map new file mode 100644 index 0000000..a55a684 Binary files /dev/null and b/sdk/map/provinces.map differ diff --git a/sdk/materials/CMakeLists.txt b/sdk/materials/CMakeLists.txt index a835c5b..da8f5b2 100644 --- a/sdk/materials/CMakeLists.txt +++ b/sdk/materials/CMakeLists.txt @@ -41,6 +41,6 @@ foreach(MAT ${MATERIAL_FILES}) list(APPEND COMPILED_BINARIES ${OUT_FILE}) endforeach() -add_custom_target(compile_assets ALL +add_custom_target(compile_material_assets ALL DEPENDS ${COMPILED_BINARIES} ) diff --git a/sdk/materials/compile_materials.cpp b/sdk/materials/compile_materials.cpp index cea2936..262decf 100644 --- a/sdk/materials/compile_materials.cpp +++ b/sdk/materials/compile_materials.cpp @@ -9,7 +9,7 @@ using json = nlohmann::json; NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE( - AssetMaterial, + AssetVulkanMaterial, vertexShaderAssetID, fragmentShaderAssetID, renderType, @@ -51,7 +51,7 @@ int main(int argc, char **argv) data[key] = assetId; } - AssetMaterial material = data.get(); + AssetVulkanMaterial material = data.get(); fout.write(reinterpret_cast(&material), sizeof(material)); fin.close(); @@ -60,6 +60,7 @@ int main(int argc, char **argv) catch (const std::exception &e) { std::cerr << e.what() << std::endl; + return 1; }