diff --git a/CMakeLists.txt b/CMakeLists.txt index ce98a45e9..427882182 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,10 @@ if(MSVC) # Shaddup MSVC add_definitions(-DUNICODE=1 -D_UNICODE=1 -D__SSE__=1 -D_CRT_SECURE_NO_WARNINGS=1 -DD_SCL_SECURE_NO_WARNINGS=1 /wd4267 /wd4244 /wd4305) else() + if (CMAKE_COMPILER_IS_GNUCXX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive") + message(WARNING "GCC needs -fpermissive for nested type redeclarations; expect lotsa warnings!!") + endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wno-multichar -fno-exceptions") endif() diff --git a/DataSpec/DNACommon/CMDL.hpp b/DataSpec/DNACommon/CMDL.hpp index 49c7433fd..61f009269 100644 --- a/DataSpec/DNACommon/CMDL.hpp +++ b/DataSpec/DNACommon/CMDL.hpp @@ -53,7 +53,7 @@ struct SurfaceHeader_1_2 : BigDNA Align<32> align; static constexpr bool UseMatrixSkinning() {return false;} - constexpr atInt16 skinMatrixBankIdx() const {return -1;} + static constexpr atInt16 skinMatrixBankIdx() {return -1;} }; struct SurfaceHeader_3 : BigDNA @@ -1322,7 +1322,7 @@ bool WriteHMDLCMDL(const HECL::ProjectPath& outPath, const HECL::ProjectPath& in head.aabbMin = mesh.aabbMin.val; head.aabbMax = mesh.aabbMax.val; head.matSetCount = mesh.materialSets.size(); - head.secCount = head.matSetCount + 5 + mesh.surfaces.size(); + head.secCount = head.matSetCount + 4 + mesh.surfaces.size(); head.secSizes.reserve(head.secCount); /* Lengths of padding to insert while writing */ @@ -1484,6 +1484,9 @@ bool WriteHMDLCMDL(const HECL::ProjectPath& outPath, const HECL::ProjectPath& in ++padIt; } + /* Ensure final surface's alignment writes zeros */ + writer.seek(-1, Athena::Current); + writer.writeUByte(0); writer.close(); return true; } diff --git a/DataSpec/DNAMP1/CMDL.hpp b/DataSpec/DNAMP1/CMDL.hpp index ae4d3b8c2..63e1af7e9 100644 --- a/DataSpec/DNAMP1/CMDL.hpp +++ b/DataSpec/DNAMP1/CMDL.hpp @@ -46,10 +46,7 @@ struct CMDL (conn, rs, pakRouter, entry, dataSpec, loadRp); conn.saveBlend(); -#if 1 - return true; -#endif - +#if 0 /* Cook and re-extract test */ HECL::ProjectPath tempOut = outPath.getWithExtension(_S(".recook"), true); HECL::BlenderConnection::DataStream ds = conn.beginData(); @@ -64,6 +61,16 @@ struct CMDL DNACMDL::ReadCMDLToBlender, MaterialSet, std::pair, DNACMDL::SurfaceHeader_1_2, 2> (conn, reader, pakRouter, entry, dataSpec, loadRp); return conn.saveBlend(); +#elif 1 + /* HMDL cook test */ + HECL::ProjectPath tempOut = outPath.getWithExtension(_S(".recook"), true); + HECL::BlenderConnection::DataStream ds = conn.beginData(); + DNACMDL::Mesh mesh = ds.compileMesh(HECL::TopologyTriStrips, 16); + ds.close(); + DNACMDL::WriteHMDLCMDL(tempOut, outPath, mesh); +#endif + + return true; } static void Name(const SpecBase& dataSpec, diff --git a/DataSpec/DNAMP1/CMDLMaterials.cpp b/DataSpec/DNAMP1/CMDLMaterials.cpp index d556b92b6..a091cf1e8 100644 --- a/DataSpec/DNAMP1/CMDLMaterials.cpp +++ b/DataSpec/DNAMP1/CMDLMaterials.cpp @@ -1224,8 +1224,8 @@ HMDLMaterialSet::Material::Material(HECL::Frontend::Frontend& FE, continue; std::vector gameArgs; - gameArgs.reserve(inst.getChildCount() - 1); - for (int i=1 ; i