Compare commits

..

No commits in common. "main" and "v0.20.2" have entirely different histories.

204 changed files with 4631 additions and 4781 deletions

View File

@ -177,7 +177,7 @@ The following section specify which assets are supported to be dumped to disk (u
| ComWorld | ❌ | ❌ | | | ComWorld | ❌ | ❌ | |
| GameWorldSp | ❌ | ❌ | | | GameWorldSp | ❌ | ❌ | |
| GameWorldMp | ❌ | ❌ | | | GameWorldMp | ❌ | ❌ | |
| MapEnts | | ❌ | | | MapEnts | | ❌ | |
| GfxWorld | ❌ | ❌ | | | GfxWorld | ❌ | ❌ | |
| GfxLightDef | ❌ | ❌ | | | GfxLightDef | ❌ | ❌ | |
| Font_s | ❌ | ❌ | | | Font_s | ❌ | ❌ | |

View File

@ -1,7 +1,7 @@
@echo off @echo off
set PREMAKE_URL="https://github.com/premake/premake-core/releases/download/v5.0.0-beta6/premake-5.0.0-beta6-windows.zip" set PREMAKE_URL="https://github.com/premake/premake-core/releases/download/v5.0.0-beta4/premake-5.0.0-beta4-windows.zip"
set PREMAKE_HASH="c34a6e0b15f119f6284886298fdd8df543af87ad16f3ce5f4d0a847be2a88343" set PREMAKE_HASH="12d741d3b70445b025c03e26148e2d129801041fa5ddde61b4ac888a76017395"
@REM The following variables can be set: @REM The following variables can be set:
@REM PREMAKE_NO_GLOBAL - Ignore premake5 executable from path @REM PREMAKE_NO_GLOBAL - Ignore premake5 executable from path

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
PREMAKE_URL='https://github.com/premake/premake-core/releases/download/v5.0.0-beta6/premake-5.0.0-beta6-linux.tar.gz' PREMAKE_URL='https://github.com/premake/premake-core/releases/download/v5.0.0-beta4/premake-5.0.0-beta4-linux.tar.gz'
PREMAKE_HASH='fade2839ace1a2953556693e6f3d8f9b8b2897894b5a1f2ad477cdf8e9af042a' PREMAKE_HASH='4356ab7cdec6085183d68fb240089376eacdc2fb751ffbd8063d797ae43abeb3'
# The following variables can be set: # The following variables can be set:
# PREMAKE_NO_GLOBAL - Ignore premake5 executable from path # PREMAKE_NO_GLOBAL - Ignore premake5 executable from path
@ -46,18 +46,13 @@ function install_premake {
chmod +x build/premake5 chmod +x build/premake5
} }
function expect_inside_git_repository {
inside_git_repo="$(git rev-parse --is-inside-work-tree 2>/dev/null)"
if [ ! -d ".git" ] && [ ! "$inside_git_repo" ]; then
echo "You must clone the OpenAssetTools repository using 'git clone'. Please read README.md." >&2
exit 1
fi
}
# Go to repository root # Go to repository root
cd "$(dirname "$0")" || exit 2 cd "$(dirname "$0")" || exit 2
expect_inside_git_repository if [[ ! -d ".git" ]]; then
echo "You must clone the OpenAssetTools repository using 'git clone'. Please read README.md." >&2
exit 1
fi
PREMAKE_BIN='' PREMAKE_BIN=''
if [[ -z "$PREMAKE_NO_GLOBAL" ]] && [[ -x "$(command -v premake5)" ]]; then if [[ -z "$PREMAKE_NO_GLOBAL" ]] && [[ -x "$(command -v premake5)" ]]; then
@ -77,4 +72,4 @@ else
fi fi
git submodule update --init --recursive git submodule update --init --recursive
$PREMAKE_BIN $@ gmake $PREMAKE_BIN $@ gmake2

View File

@ -1,4 +1,4 @@
require("premake", ">=5.0.0-beta5") require("premake", ">=5.0.0-beta4")
include "tools/scripts/folders.lua" include "tools/scripts/folders.lua"
include "tools/scripts/including.lua" include "tools/scripts/including.lua"
@ -16,7 +16,7 @@ workspace "OpenAssetTools"
objdir "%{wks.location}/obj" objdir "%{wks.location}/obj"
symbols "On" symbols "On"
systemversion "latest" systemversion "latest"
cppdialect "C++23" cppdialect "C++20"
largeaddressaware "on" largeaddressaware "on"
flags { flags {
@ -54,10 +54,6 @@ workspace "OpenAssetTools"
symbols "On" symbols "On"
filter {} filter {}
filter {"system:windows", "configurations:Debug" }
buildoptions { "/bigobj" }
filter {}
filter "configurations:Release" filter "configurations:Release"
defines "NDEBUG" defines "NDEBUG"
optimize "Full" optimize "Full"

View File

@ -1,23 +0,0 @@
#!/bin/bash
# Go to repository root
cd "$(dirname "$0")/.." || exit 2
TARGET='all'
ARCHITECTURE='x86'
CONFIG='debug'
for var in "$@"
do
if [ "$var" == "debug" ] || [ "$var" == "release" ]; then
CONFIG="$var"
elif [ "$var" == "x86" ] || [ "$var" == "x64" ]; then
ARCHITECTURE="$var"
else
TARGET="$var"
fi
done
echo "Building config=${CONFIG} architecture=${ARCHITECTURE} target=${TARGET}"
make -C build -j$(nproc) config=${CONFIG}_${ARCHITECTURE} "${TARGET}"

View File

@ -5,5 +5,3 @@ cd "$(dirname "$0")/.." || exit 2
make -C build -j$(nproc) config=debug_x86 clean make -C build -j$(nproc) config=debug_x86 clean
make -C build -j$(nproc) config=release_x86 clean make -C build -j$(nproc) config=release_x86 clean
make -C build -j$(nproc) config=debug_x64 clean
make -C build -j$(nproc) config=release_x64 clean

View File

@ -3814,8 +3814,7 @@ namespace T6
uint16_t dynEntId; uint16_t dynEntId;
}; };
// Usually __m128, but that is not portable union gcc_align(8) __m128
union gcc_align(8) custom_m128
{ {
float m128_f32[4]; float m128_f32[4];
uint64_t m128_u64[2]; uint64_t m128_u64[2];
@ -3828,12 +3827,19 @@ namespace T6
unsigned int m128_u32[4]; unsigned int m128_u32[4];
}; };
struct vector3
{
__m128 x;
__m128 y;
__m128 z;
};
struct vector4 struct vector4
{ {
custom_m128 x; __m128 x;
custom_m128 y; __m128 y;
custom_m128 z; __m128 z;
custom_m128 w; __m128 w;
}; };
struct type_align(16) SSkinInstance struct type_align(16) SSkinInstance

View File

@ -1,6 +1,5 @@
#pragma once #pragma once
#include <cstdint> #include <cstdint>
#include <limits>
struct ZoneHeader struct ZoneHeader
{ {
@ -8,11 +7,21 @@ struct ZoneHeader
uint32_t m_version; uint32_t m_version;
}; };
#ifdef ARCH_x64
typedef uint32_t scr_string_t;
typedef uint64_t xchunk_size_t;
typedef uint64_t xblock_size_t;
typedef uint64_t zone_pointer_t;
constexpr uint16_t SCR_STRING_MAX = UINT32_MAX;
#elif ARCH_x86
typedef uint16_t scr_string_t; typedef uint16_t scr_string_t;
typedef uint32_t xchunk_size_t; typedef uint32_t xchunk_size_t;
typedef uint32_t xblock_size_t; typedef uint32_t xblock_size_t;
typedef uint32_t zone_pointer_t;
constexpr uint16_t SCR_STRING_MAX = std::numeric_limits<scr_string_t>::max(); constexpr uint16_t SCR_STRING_MAX = UINT16_MAX;
#endif
typedef int block_t; typedef int block_t;
typedef int asset_type_t; typedef int asset_type_t;

View File

@ -3,7 +3,6 @@
#include "SearchPath/IWD.h" #include "SearchPath/IWD.h"
#include "SearchPath/SearchPathFilesystem.h" #include "SearchPath/SearchPathFilesystem.h"
#include "SearchPath/SearchPaths.h" #include "SearchPath/SearchPaths.h"
#include "Utils/StringUtils.h"
#include <cassert> #include <cassert>
#include <cstdint> #include <cstdint>
@ -216,10 +215,7 @@ namespace
{ {
if (!curTemplate.CanRender(PROJECT_MASK) && curTemplate.CanRender(GAME_MASK)) if (!curTemplate.CanRender(PROJECT_MASK) && curTemplate.CanRender(GAME_MASK))
{ {
std::string gameName(GameId_Names[static_cast<unsigned>(game)]); auto renderedTemplate = curTemplate.Render(m_bin_dir, m_base_dir, projectName, GameId_Names[static_cast<unsigned>(game)]);
utils::MakeStringLowerCase(gameName);
auto renderedTemplate = curTemplate.Render(m_bin_dir, m_base_dir, projectName, gameName);
if (AddSearchPath(addedSearchPaths, searchPaths, renderedTemplate)) if (AddSearchPath(addedSearchPaths, searchPaths, renderedTemplate))
hasSearchPath = true; hasSearchPath = true;
} }

View File

@ -16,7 +16,7 @@ namespace ipak_consts
static constexpr size_t IPAK_CHUNK_SIZE = 0x8000; static constexpr size_t IPAK_CHUNK_SIZE = 0x8000;
static constexpr size_t IPAK_CHUNK_COUNT_PER_READ = 0x8; static constexpr size_t IPAK_CHUNK_COUNT_PER_READ = 0x8;
static constexpr size_t IPAK_COMMAND_DEFAULT_SIZE = 0x7F00; static constexpr uint32_t IPAK_COMMAND_DEFAULT_SIZE = 0x7F00;
static constexpr uint32_t IPAK_COMMAND_UNCOMPRESSED = 0; static constexpr uint32_t IPAK_COMMAND_UNCOMPRESSED = 0;
static constexpr uint32_t IPAK_COMMAND_COMPRESSED = 1; static constexpr uint32_t IPAK_COMMAND_COMPRESSED = 1;
static constexpr uint32_t IPAK_COMMAND_SKIP = 0xCF; static constexpr uint32_t IPAK_COMMAND_SKIP = 0xCF;

View File

@ -68,7 +68,7 @@ namespace
T result; T result;
} data{}; } data{};
const auto byteCount = utils::Align(bitCount, 8uz) / 8uz; const auto byteCount = utils::Align(bitCount, 8u) / 8u;
assert(byteCount <= sizeof(T)); assert(byteCount <= sizeof(T));
const auto shiftCount = (8u - bitCount % 8) % 8; const auto shiftCount = (8u - bitCount % 8) % 8;
@ -83,7 +83,7 @@ namespace
while (remainingBits > 0) while (remainingBits > 0)
{ {
const auto curBits = static_cast<uint8_t>(std::min(remainingBits, 8uz)); const auto curBits = static_cast<uint8_t>(std::min(remainingBits, 8u));
if (m_remaining_bits_last_byte > 0) if (m_remaining_bits_last_byte > 0)
{ {

View File

@ -59,7 +59,7 @@ size_t CommonStructuredDataType::GetSizeInBits(const CommonStructuredDataDef& de
return 0u; return 0u;
} }
const auto& indexedArray = def.m_indexed_arrays[m_info.type_index]; const auto& indexedArray = def.m_indexed_arrays[m_info.type_index];
return utils::Align(indexedArray.m_element_size_in_bits * indexedArray.m_element_count, 8uz); return utils::Align(indexedArray.m_element_size_in_bits * indexedArray.m_element_count, 8u);
} }
case CommonStructuredDataTypeCategory::ENUM_ARRAY: case CommonStructuredDataTypeCategory::ENUM_ARRAY:
{ {
@ -69,7 +69,7 @@ size_t CommonStructuredDataType::GetSizeInBits(const CommonStructuredDataDef& de
return 0u; return 0u;
} }
const auto& enumedArray = def.m_enumed_arrays[m_info.type_index]; const auto& enumedArray = def.m_enumed_arrays[m_info.type_index];
return utils::Align(enumedArray.m_element_size_in_bits * enumedArray.m_element_count, 8uz); return utils::Align(enumedArray.m_element_size_in_bits * enumedArray.m_element_count, 8u);
} }
case CommonStructuredDataTypeCategory::UNKNOWN: case CommonStructuredDataTypeCategory::UNKNOWN:

View File

@ -216,7 +216,7 @@ namespace
const auto remainingSize = dataSize - dataOffset; const auto remainingSize = dataSize - dataOffset;
const auto remainingChunkBufferWindowSize = std::max((ipak_consts::IPAK_CHUNK_COUNT_PER_READ * ipak_consts::IPAK_CHUNK_SIZE) const auto remainingChunkBufferWindowSize = std::max((ipak_consts::IPAK_CHUNK_COUNT_PER_READ * ipak_consts::IPAK_CHUNK_SIZE)
- static_cast<size_t>(m_current_offset - m_chunk_buffer_window_start), - static_cast<size_t>(m_current_offset - m_chunk_buffer_window_start),
0uz); 0u);
if (remainingChunkBufferWindowSize == 0) if (remainingChunkBufferWindowSize == 0)
{ {

View File

@ -96,6 +96,7 @@ namespace
// collection.AddAssetCreator(std::make_unique<AssetLoaderSound>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderSound>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderSoundCurve>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderSoundCurve>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderLoadedSound>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderLoadedSound>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderClipMap>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderClipMapPvs>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderClipMapPvs>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderComWorld>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderComWorld>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderGameWorldSp>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderGameWorldSp>(memory));

View File

@ -135,7 +135,8 @@ namespace
// collection.AddAssetCreator(std::make_unique<AssetLoaderSound>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderSound>(memory));
collection.AddAssetCreator(CreateSoundCurveLoader(memory, searchPath)); collection.AddAssetCreator(CreateSoundCurveLoader(memory, searchPath));
// collection.AddAssetCreator(std::make_unique<AssetLoaderLoadedSound>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderLoadedSound>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderClipMap>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderClipMapSp>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderClipMapMp>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderComWorld>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderComWorld>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderGameWorldSp>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderGameWorldSp>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderGameWorldMp>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderGameWorldMp>(memory));

View File

@ -53,15 +53,15 @@ namespace
case CommonStructuredDataTypeCategory::SHORT: case CommonStructuredDataTypeCategory::SHORT:
return {DATA_SHORT, {0}}; return {DATA_SHORT, {0}};
case CommonStructuredDataTypeCategory::STRING: case CommonStructuredDataTypeCategory::STRING:
return {DATA_STRING, {static_cast<unsigned>(inputType.m_info.string_length)}}; return {DATA_STRING, {inputType.m_info.string_length}};
case CommonStructuredDataTypeCategory::ENUM: case CommonStructuredDataTypeCategory::ENUM:
return {DATA_ENUM, {static_cast<unsigned>(inputType.m_info.type_index)}}; return {DATA_ENUM, {inputType.m_info.type_index}};
case CommonStructuredDataTypeCategory::STRUCT: case CommonStructuredDataTypeCategory::STRUCT:
return {DATA_STRUCT, {static_cast<unsigned>(inputType.m_info.type_index)}}; return {DATA_STRUCT, {inputType.m_info.type_index}};
case CommonStructuredDataTypeCategory::INDEXED_ARRAY: case CommonStructuredDataTypeCategory::INDEXED_ARRAY:
return {DATA_INDEXED_ARRAY, {static_cast<unsigned>(inputType.m_info.type_index)}}; return {DATA_INDEXED_ARRAY, {inputType.m_info.type_index}};
case CommonStructuredDataTypeCategory::ENUM_ARRAY: case CommonStructuredDataTypeCategory::ENUM_ARRAY:
return {DATA_ENUM_ARRAY, {static_cast<unsigned>(inputType.m_info.type_index)}}; return {DATA_ENUM_ARRAY, {inputType.m_info.type_index}};
case CommonStructuredDataTypeCategory::UNKNOWN: case CommonStructuredDataTypeCategory::UNKNOWN:
default: default:
assert(false); assert(false);
@ -129,14 +129,14 @@ namespace
{ {
outputIndexedArray.arraySize = static_cast<int>(inputIndexedArray.m_element_count); outputIndexedArray.arraySize = static_cast<int>(inputIndexedArray.m_element_count);
outputIndexedArray.elementType = ConvertType(inputIndexedArray.m_array_type); outputIndexedArray.elementType = ConvertType(inputIndexedArray.m_array_type);
outputIndexedArray.elementSize = utils::Align(inputIndexedArray.m_element_size_in_bits, 8uz) / 8uz; outputIndexedArray.elementSize = utils::Align(inputIndexedArray.m_element_size_in_bits, 8u) / 8u;
} }
void ConvertEnumedArray(const CommonStructuredDataEnumedArray& inputEnumedArray, StructuredDataEnumedArray& outputEnumedArray) void ConvertEnumedArray(const CommonStructuredDataEnumedArray& inputEnumedArray, StructuredDataEnumedArray& outputEnumedArray)
{ {
outputEnumedArray.enumIndex = static_cast<int>(inputEnumedArray.m_enum_index); outputEnumedArray.enumIndex = static_cast<int>(inputEnumedArray.m_enum_index);
outputEnumedArray.elementType = ConvertType(inputEnumedArray.m_array_type); outputEnumedArray.elementType = ConvertType(inputEnumedArray.m_array_type);
outputEnumedArray.elementSize = utils::Align(inputEnumedArray.m_element_size_in_bits, 8uz) / 8uz; outputEnumedArray.elementSize = utils::Align(inputEnumedArray.m_element_size_in_bits, 8u) / 8u;
} }
void ConvertDef(const CommonStructuredDataDef& inputDef, StructuredDataDef& outputDef) void ConvertDef(const CommonStructuredDataDef& inputDef, StructuredDataDef& outputDef)

View File

@ -109,6 +109,7 @@ namespace
// collection.AddAssetCreator(std::make_unique<AssetLoaderImage>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderImage>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderSoundBank>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderSoundBank>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderSoundPatch>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderSoundPatch>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderClipMap>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderClipMapPvs>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderClipMapPvs>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderComWorld>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderComWorld>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderGameWorldSp>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderGameWorldSp>(memory));

View File

@ -404,6 +404,7 @@ namespace T6
collection.AddAssetCreator(CreateImageLoader(memory, searchPath)); collection.AddAssetCreator(CreateImageLoader(memory, searchPath));
collection.AddAssetCreator(CreateSoundBankLoader(memory, searchPath)); collection.AddAssetCreator(CreateSoundBankLoader(memory, searchPath));
// collection.AddAssetCreator(std::make_unique<AssetLoaderSoundPatch>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderSoundPatch>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderClipMap>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderClipMapPvs>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderClipMapPvs>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderComWorld>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderComWorld>(memory));
// collection.AddAssetCreator(std::make_unique<AssetLoaderGameWorldSp>(memory)); // collection.AddAssetCreator(std::make_unique<AssetLoaderGameWorldSp>(memory));

View File

@ -131,7 +131,7 @@ public:
sizeof(SoundAssetBankEntry), sizeof(SoundAssetBankEntry),
sizeof(SoundAssetBankChecksum), sizeof(SoundAssetBankChecksum),
0x40, 0x40,
static_cast<unsigned>(m_entries.size()), m_entries.size(),
0, 0,
0, 0,
m_total_size, m_total_size,
@ -157,9 +157,9 @@ public:
SoundAssetBankEntry entry{ SoundAssetBankEntry entry{
sound.m_sound_id, sound.m_sound_id,
static_cast<unsigned>(soundSize), soundSize,
static_cast<unsigned>(m_current_offset), static_cast<size_t>(m_current_offset),
static_cast<unsigned>(frameCount), frameCount,
frameRateIndex, frameRateIndex,
static_cast<unsigned char>(header.formatChunk.nChannels), static_cast<unsigned char>(header.formatChunk.nChannels),
sound.m_looping, sound.m_looping,
@ -188,8 +188,8 @@ public:
const auto frameRateIndex = INDEX_FOR_FRAMERATE[metaData.m_sample_rate]; const auto frameRateIndex = INDEX_FOR_FRAMERATE[metaData.m_sample_rate];
SoundAssetBankEntry entry{ SoundAssetBankEntry entry{
sound.m_sound_id, sound.m_sound_id,
static_cast<unsigned>(soundSize), soundSize,
static_cast<unsigned>(m_current_offset), static_cast<size_t>(m_current_offset),
static_cast<unsigned>(metaData.m_total_samples), static_cast<unsigned>(metaData.m_total_samples),
frameRateIndex, frameRateIndex,
metaData.m_number_of_channels, metaData.m_number_of_channels,

View File

@ -240,7 +240,7 @@ namespace sdd::struct_scope_sequences
if (state->m_current_struct_is_root && state->m_current_struct->m_properties.empty()) if (state->m_current_struct_is_root && state->m_current_struct->m_properties.empty())
state->m_current_struct_padding_offset -= 64u; state->m_current_struct_padding_offset -= 64u;
state->m_current_struct->m_size_in_byte = utils::Align(state->m_current_struct_padding_offset, 8uz) / 8; state->m_current_struct->m_size_in_byte = utils::Align(state->m_current_struct_padding_offset, 8u) / 8;
state->m_current_struct_padding_offset = 0u; state->m_current_struct_padding_offset = 0u;
state->m_current_struct_is_root = false; state->m_current_struct_is_root = false;
state->m_current_struct = nullptr; state->m_current_struct = nullptr;

View File

@ -74,7 +74,7 @@ class StructuredDataDefSizeCalculatorInternal
m_type_stack.emplace_back(CommonStructuredDataTypeCategory::STRUCT, index); m_type_stack.emplace_back(CommonStructuredDataTypeCategory::STRUCT, index);
auto currentOffset = 0uz; auto currentOffset = 0u;
for (auto& property : _struct.m_properties) for (auto& property : _struct.m_properties)
{ {
CalculateForType(property.m_type); CalculateForType(property.m_type);
@ -85,7 +85,7 @@ class StructuredDataDefSizeCalculatorInternal
currentOffset += property.m_type.GetSizeInBits(m_def); currentOffset += property.m_type.GetSizeInBits(m_def);
} }
currentOffset = utils::Align(currentOffset, 8uz); currentOffset = utils::Align(currentOffset, 8u);
_struct.m_size_in_byte += currentOffset / 8; _struct.m_size_in_byte += currentOffset / 8;
m_struct_calculated[index] = true; m_struct_calculated[index] = true;

View File

@ -286,7 +286,7 @@ namespace
common.m_vertices.emplace_back(vertex); common.m_vertices.emplace_back(vertex);
XModelVertexBoneWeights vertexWeights{.weightOffset = static_cast<unsigned>(common.m_bone_weight_data.weights.size()), .weightCount = 0u}; XModelVertexBoneWeights vertexWeights{common.m_bone_weight_data.weights.size(), 0u};
for (auto i = 0u; i < std::extent_v<decltype(joints)>; i++) for (auto i = 0u; i < std::extent_v<decltype(joints)>; i++)
{ {
if (std::abs(weights[i]) < std::numeric_limits<float>::epsilon()) if (std::abs(weights[i]) < std::numeric_limits<float>::epsilon())
@ -315,12 +315,12 @@ namespace
throw GltfLoadException("Requires primitives attribute POSITION"); throw GltfLoadException("Requires primitives attribute POSITION");
AccessorsForVertex accessorsForVertex{ AccessorsForVertex accessorsForVertex{
.positionAccessor = *primitives.attributes.POSITION, *primitives.attributes.POSITION,
.normalAccessor = primitives.attributes.NORMAL, primitives.attributes.NORMAL,
.colorAccessor = primitives.attributes.COLOR_0, primitives.attributes.COLOR_0,
.uvAccessor = primitives.attributes.TEXCOORD_0, primitives.attributes.TEXCOORD_0,
.jointsAccessor = primitives.attributes.JOINTS_0, primitives.attributes.JOINTS_0,
.weightsAccessor = primitives.attributes.WEIGHTS_0, primitives.attributes.WEIGHTS_0,
}; };
const auto existingVertices = m_vertex_offset_for_accessors.find(accessorsForVertex); const auto existingVertices = m_vertex_offset_for_accessors.find(accessorsForVertex);
@ -328,7 +328,7 @@ namespace
existingVertices == m_vertex_offset_for_accessors.end() ? CreateVertices(common, accessorsForVertex) : existingVertices->second; existingVertices == m_vertex_offset_for_accessors.end() ? CreateVertices(common, accessorsForVertex) : existingVertices->second;
// clang-format off // clang-format off
const auto* indexAccessor = GetAccessorForIndex( auto* indexAccessor = GetAccessorForIndex(
"INDICES", "INDICES",
primitives.indices, primitives.indices,
{JsonAccessorType::SCALAR}, {JsonAccessorType::SCALAR},
@ -552,7 +552,7 @@ namespace
common.m_bones.resize(skinBoneOffset + skin.joints.size()); common.m_bones.resize(skinBoneOffset + skin.joints.size());
constexpr float defaultTranslation[3]{0.0f, 0.0f, 0.0f}; constexpr float defaultTranslation[3]{0.0f, 0.0f, 0.0f};
constexpr XModelQuaternion defaultRotation{.x = 0.0f, .y = 0.0f, .z = 0.0f, .w = 1.0f}; constexpr XModelQuaternion defaultRotation{0.0f, 0.0f, 0.0f, 1.0f};
constexpr float defaultScale[3]{1.0f, 1.0f, 1.0f}; constexpr float defaultScale[3]{1.0f, 1.0f, 1.0f};
return ConvertJoint(jRoot, skin, common, skinBoneOffset, rootNode, std::nullopt, defaultTranslation, defaultRotation, defaultScale); return ConvertJoint(jRoot, skin, common, skinBoneOffset, rootNode, std::nullopt, defaultTranslation, defaultRotation, defaultScale);

View File

@ -22,6 +22,7 @@
#include JSON_HEADER #include JSON_HEADER
#include "Asset/AssetRegistration.h" #include "Asset/AssetRegistration.h"
#include "ObjLoading.h"
#include "Utils/QuatInt16.h" #include "Utils/QuatInt16.h"
#include "Utils/StringUtils.h" #include "Utils/StringUtils.h"
#include "XModel/Gltf/GltfBinInput.h" #include "XModel/Gltf/GltfBinInput.h"
@ -43,6 +44,7 @@
#include <format> #include <format>
#include <iostream> #include <iostream>
#include <numeric> #include <numeric>
#include <set>
#include <vector> #include <vector>
using namespace GAME; using namespace GAME;
@ -144,17 +146,17 @@ namespace
assert(common.m_vertex_bone_weights.size() == common.m_vertices.size()); assert(common.m_vertex_bone_weights.size() == common.m_vertices.size());
XModelBone rootBone{ XModelBone rootBone{
.name = "root", "root",
.parentIndex = std::nullopt, std::nullopt,
.scale = {1.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f},
.globalOffset = {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f},
.localOffset = {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f},
.globalRotation = {.x = 0.0f, .y = 0.0f, .z = 0.0f, .w = 1.0f}, {0.0f, 0.0f, 0.0f, 1.0f},
.localRotation = {.x = 0.0f, .y = 0.0f, .z = 0.0f, .w = 1.0f}, {0.0f, 0.0f, 0.0f, 1.0f},
}; };
common.m_bones.emplace_back(rootBone); common.m_bones.emplace_back(rootBone);
XModelBoneWeight rootWeight{.boneIndex = 0, .weight = 1.0f}; XModelBoneWeight rootWeight{0, 1.0f};
common.m_bone_weight_data.weights.emplace_back(rootWeight); common.m_bone_weight_data.weights.emplace_back(rootWeight);
for (auto& vertexBoneWeights : common.m_vertex_bone_weights) for (auto& vertexBoneWeights : common.m_vertex_bone_weights)
@ -399,7 +401,7 @@ namespace
} }
static std::vector<std::optional<size_t>> static std::vector<std::optional<size_t>>
GetRigidBoneIndicesForTris(const std::vector<size_t>& vertexIndices, const XSurface& surface, const XModelCommon& common) GetRigidBoneIndicesForTris(const std::vector<size_t>& vertexIndices, XSurface& surface, const XModelCommon& common)
{ {
std::vector<std::optional<size_t>> rigidBoneIndexForTri; std::vector<std::optional<size_t>> rigidBoneIndexForTri;
rigidBoneIndexForTri.reserve(surface.triCount); rigidBoneIndexForTri.reserve(surface.triCount);
@ -420,7 +422,7 @@ namespace
return rigidBoneIndexForTri; return rigidBoneIndexForTri;
} }
static void ReorderRigidTrisByBoneIndex(const std::vector<size_t>& vertexIndices, const XSurface& surface, const XModelCommon& common) static void ReorderRigidTrisByBoneIndex(const std::vector<size_t>& vertexIndices, XSurface& surface, const XModelCommon& common)
{ {
const auto rigidBoneIndexForTri = GetRigidBoneIndicesForTris(vertexIndices, surface, common); const auto rigidBoneIndexForTri = GetRigidBoneIndicesForTris(vertexIndices, surface, common);
@ -454,17 +456,17 @@ namespace
surface.partBits[partBitsIndex] |= 1 << shiftValue; surface.partBits[partBitsIndex] |= 1 << shiftValue;
} }
void CreateVertListData(XSurface& surface, const std::vector<size_t>& xmodelToCommonVertexIndexLookup, const XModelCommon& common) const void CreateVertListData(XSurface& surface, const std::vector<size_t>& vertexIndices, const XModelCommon& common) const
{ {
ReorderRigidTrisByBoneIndex(xmodelToCommonVertexIndexLookup, surface, common); ReorderRigidTrisByBoneIndex(vertexIndices, surface, common);
const auto rigidBoneIndexForTri = GetRigidBoneIndicesForTris(xmodelToCommonVertexIndexLookup, surface, common); const auto rigidBoneIndexForTri = GetRigidBoneIndicesForTris(vertexIndices, surface, common);
std::vector<XRigidVertList> vertLists; std::vector<XRigidVertList> vertLists;
auto currentVertexTail = 0u; auto currentVertexTail = 0u;
auto currentTriTail = 0u; auto currentTriTail = 0u;
const auto vertexCount = xmodelToCommonVertexIndexLookup.size(); const auto vertexCount = vertexIndices.size();
const auto triCount = static_cast<size_t>(surface.triCount); const auto triCount = static_cast<size_t>(surface.triCount);
const auto boneCount = common.m_bones.size(); const auto boneCount = common.m_bones.size();
for (auto boneIndex = 0u; boneIndex < boneCount; boneIndex++) for (auto boneIndex = 0u; boneIndex < boneCount; boneIndex++)
@ -473,7 +475,7 @@ namespace
boneVertList.boneOffset = static_cast<uint16_t>(boneIndex * sizeof(DObjSkelMat)); boneVertList.boneOffset = static_cast<uint16_t>(boneIndex * sizeof(DObjSkelMat));
auto currentVertexHead = currentVertexTail; auto currentVertexHead = currentVertexTail;
while (currentVertexHead < vertexCount && GetRigidBoneForVertex(xmodelToCommonVertexIndexLookup[currentVertexHead], common) == boneIndex) while (currentVertexHead < vertexCount && GetRigidBoneForVertex(currentVertexHead, common) == boneIndex)
currentVertexHead++; currentVertexHead++;
auto currentTriHead = currentTriTail; auto currentTriHead = currentTriTail;
@ -510,7 +512,7 @@ namespace
// TODO // TODO
} }
static void ReorderVerticesByWeightCount(std::vector<size_t>& vertexIndices, const XSurface& surface, const XModelCommon& common) static void ReorderVerticesByWeightCount(std::vector<size_t>& vertexIndices, XSurface& surface, const XModelCommon& common)
{ {
if (common.m_bone_weight_data.weights.empty()) if (common.m_bone_weight_data.weights.empty())
return; return;
@ -539,21 +541,13 @@ namespace
return false; return false;
}); });
std::vector<XSurfaceTri> preSortTris(surface.triCount);
std::memcpy(preSortTris.data(), surface.triIndices, sizeof(XSurfaceTri) * surface.triCount);
std::vector<size_t> reverseLookup(reorderLookup.size());
for (auto i = 0u; i < reverseLookup.size(); i++)
reverseLookup[reorderLookup[i]] = i;
for (auto triIndex = 0u; triIndex < surface.triCount; triIndex++) for (auto triIndex = 0u; triIndex < surface.triCount; triIndex++)
{ {
const auto& preSortTriIndices = preSortTris[triIndex];
auto& triIndices = surface.triIndices[triIndex]; auto& triIndices = surface.triIndices[triIndex];
triIndices.i[0] = static_cast<uint16_t>(reverseLookup[preSortTriIndices.i[0]]); triIndices.i[0] = static_cast<uint16_t>(reorderLookup[triIndices.i[0]]);
triIndices.i[1] = static_cast<uint16_t>(reverseLookup[preSortTriIndices.i[1]]); triIndices.i[1] = static_cast<uint16_t>(reorderLookup[triIndices.i[1]]);
triIndices.i[2] = static_cast<uint16_t>(reverseLookup[preSortTriIndices.i[2]]); triIndices.i[2] = static_cast<uint16_t>(reorderLookup[triIndices.i[2]]);
} }
for (auto& entry : reorderLookup) for (auto& entry : reorderLookup)
@ -578,7 +572,6 @@ namespace
surface.triCount = static_cast<uint16_t>(commonObject.m_faces.size()); surface.triCount = static_cast<uint16_t>(commonObject.m_faces.size());
surface.triIndices = m_memory.Alloc<XSurfaceTri>(surface.triCount); surface.triIndices = m_memory.Alloc<XSurfaceTri>(surface.triCount);
xmodelToCommonVertexIndexLookup.reserve(static_cast<size_t>(surface.triCount) * std::extent_v<decltype(XModelFace::vertexIndex)>);
for (auto faceIndex = 0u; faceIndex < surface.triCount; faceIndex++) for (auto faceIndex = 0u; faceIndex < surface.triCount; faceIndex++)
{ {
const auto& face = commonObject.m_faces[faceIndex]; const auto& face = commonObject.m_faces[faceIndex];
@ -601,6 +594,8 @@ namespace
} }
} }
ReorderVerticesByWeightCount(xmodelToCommonVertexIndexLookup, surface, common);
constexpr auto maxVertices = std::numeric_limits<decltype(XSurface::vertCount)>::max(); constexpr auto maxVertices = std::numeric_limits<decltype(XSurface::vertCount)>::max();
if (vertexOffset + xmodelToCommonVertexIndexLookup.size() > maxVertices) if (vertexOffset + xmodelToCommonVertexIndexLookup.size() > maxVertices)
{ {
@ -608,8 +603,6 @@ namespace
return false; return false;
} }
ReorderVerticesByWeightCount(xmodelToCommonVertexIndexLookup, surface, common);
surface.baseVertIndex = static_cast<uint16_t>(vertexOffset); surface.baseVertIndex = static_cast<uint16_t>(vertexOffset);
surface.vertCount = static_cast<uint16_t>(xmodelToCommonVertexIndexLookup.size()); surface.vertCount = static_cast<uint16_t>(xmodelToCommonVertexIndexLookup.size());
surface.verts0 = m_memory.Alloc<GfxPackedVertex>(surface.vertCount); surface.verts0 = m_memory.Alloc<GfxPackedVertex>(surface.vertCount);

View File

@ -284,7 +284,7 @@ namespace
const auto& vertList = surface.vertList[vertListIndex]; const auto& vertList = surface.vertList[vertListIndex];
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
weightCollection.weights[weightOffset++] = XModelBoneWeight{static_cast<unsigned>(vertList.boneOffset / sizeof(DObjSkelMat)), 1.0f}; weightCollection.weights[weightOffset++] = XModelBoneWeight{vertList.boneOffset / sizeof(DObjSkelMat), 1.0f};
for (auto vertListVertexOffset = 0u; vertListVertexOffset < vertList.vertCount; vertListVertexOffset++) for (auto vertListVertexOffset = 0u; vertListVertexOffset < vertList.vertCount; vertListVertexOffset++)
{ {
@ -301,7 +301,7 @@ namespace
for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[0]; vertIndex++) for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[0]; vertIndex++)
{ {
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
const unsigned boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat);
weightCollection.weights[weightOffset++] = XModelBoneWeight{boneIndex0, 1.0f}; weightCollection.weights[weightOffset++] = XModelBoneWeight{boneIndex0, 1.0f};
vertsBlendOffset += 1; vertsBlendOffset += 1;
@ -313,8 +313,8 @@ namespace
for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[1]; vertIndex++) for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[1]; vertIndex++)
{ {
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
const unsigned boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat);
const unsigned boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat);
const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]);
const auto boneWeight0 = 1.0f - boneWeight1; const auto boneWeight0 = 1.0f - boneWeight1;
@ -330,10 +330,10 @@ namespace
for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[2]; vertIndex++) for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[2]; vertIndex++)
{ {
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
const unsigned boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat);
const unsigned boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat);
const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]);
const unsigned boneIndex2 = surface.vertInfo.vertsBlend[vertsBlendOffset + 3] / sizeof(DObjSkelMat); const auto boneIndex2 = surface.vertInfo.vertsBlend[vertsBlendOffset + 3] / sizeof(DObjSkelMat);
const auto boneWeight2 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 4]); const auto boneWeight2 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 4]);
const auto boneWeight0 = 1.0f - boneWeight1 - boneWeight2; const auto boneWeight0 = 1.0f - boneWeight1 - boneWeight2;
@ -350,12 +350,12 @@ namespace
for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[3]; vertIndex++) for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[3]; vertIndex++)
{ {
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
const unsigned boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat);
const unsigned boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat);
const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]);
const unsigned boneIndex2 = surface.vertInfo.vertsBlend[vertsBlendOffset + 3] / sizeof(DObjSkelMat); const auto boneIndex2 = surface.vertInfo.vertsBlend[vertsBlendOffset + 3] / sizeof(DObjSkelMat);
const auto boneWeight2 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 4]); const auto boneWeight2 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 4]);
const unsigned boneIndex3 = surface.vertInfo.vertsBlend[vertsBlendOffset + 5] / sizeof(DObjSkelMat); const auto boneIndex3 = surface.vertInfo.vertsBlend[vertsBlendOffset + 5] / sizeof(DObjSkelMat);
const auto boneWeight3 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 6]); const auto boneWeight3 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 6]);
const auto boneWeight0 = 1.0f - boneWeight1 - boneWeight2 - boneWeight3; const auto boneWeight0 = 1.0f - boneWeight1 - boneWeight2 - boneWeight3;

View File

@ -34,7 +34,7 @@ bool ObjWriter::DumpZone(AssetDumpingContext& context) const
// DUMP_ASSET_POOL(AssetDumpersnd_alias_list_t, m_sound, ASSET_TYPE_SOUND) // DUMP_ASSET_POOL(AssetDumpersnd_alias_list_t, m_sound, ASSET_TYPE_SOUND)
// DUMP_ASSET_POOL(AssetDumperSndCurve, m_sound_curve, ASSET_TYPE_SOUND_CURVE) // DUMP_ASSET_POOL(AssetDumperSndCurve, m_sound_curve, ASSET_TYPE_SOUND_CURVE)
DUMP_ASSET_POOL(AssetDumperLoadedSound, m_loaded_sound, ASSET_TYPE_LOADED_SOUND) DUMP_ASSET_POOL(AssetDumperLoadedSound, m_loaded_sound, ASSET_TYPE_LOADED_SOUND)
// DUMP_ASSET_POOL(AssetDumperClipMap, m_clip_map, ASSET_TYPE_CLIPMAP_PVS) // DUMP_ASSET_POOL(AssetDumperclipMap_t, m_clip_map, ASSET_TYPE_CLIPMAP)
// DUMP_ASSET_POOL(AssetDumperComWorld, m_com_world, ASSET_TYPE_COMWORLD) // DUMP_ASSET_POOL(AssetDumperComWorld, m_com_world, ASSET_TYPE_COMWORLD)
// DUMP_ASSET_POOL(AssetDumperGameWorldSp, m_game_world_sp, ASSET_TYPE_GAMEWORLD_SP) // DUMP_ASSET_POOL(AssetDumperGameWorldSp, m_game_world_sp, ASSET_TYPE_GAMEWORLD_SP)
// DUMP_ASSET_POOL(AssetDumperGameWorldMp, m_game_world_mp, ASSET_TYPE_GAMEWORLD_MP) // DUMP_ASSET_POOL(AssetDumperGameWorldMp, m_game_world_mp, ASSET_TYPE_GAMEWORLD_MP)

View File

@ -37,22 +37,22 @@ CommonStructuredDataType AssetDumperStructuredDataDefSet::ConvertType(const Comm
case DATA_ENUM: case DATA_ENUM:
assert(!def->m_enums.empty()); assert(!def->m_enums.empty());
out.m_category = CommonStructuredDataTypeCategory::ENUM; out.m_category = CommonStructuredDataTypeCategory::ENUM;
out.m_info.type_index = std::max(std::min(static_cast<size_t>(in.u.enumIndex), def->m_enums.size() - 1uz), 0uz); out.m_info.type_index = std::max(std::min(static_cast<size_t>(in.u.enumIndex), def->m_enums.size() - 1u), 0u);
break; break;
case DATA_STRUCT: case DATA_STRUCT:
assert(!def->m_structs.empty()); assert(!def->m_structs.empty());
out.m_category = CommonStructuredDataTypeCategory::STRUCT; out.m_category = CommonStructuredDataTypeCategory::STRUCT;
out.m_info.type_index = std::max(std::min(static_cast<size_t>(in.u.structIndex), def->m_structs.size() - 1uz), 0uz); out.m_info.type_index = std::max(std::min(static_cast<size_t>(in.u.structIndex), def->m_structs.size() - 1u), 0u);
break; break;
case DATA_INDEXED_ARRAY: case DATA_INDEXED_ARRAY:
assert(!def->m_indexed_arrays.empty()); assert(!def->m_indexed_arrays.empty());
out.m_category = CommonStructuredDataTypeCategory::INDEXED_ARRAY; out.m_category = CommonStructuredDataTypeCategory::INDEXED_ARRAY;
out.m_info.type_index = std::max(std::min(static_cast<size_t>(in.u.indexedArrayIndex), def->m_indexed_arrays.size() - 1uz), 0uz); out.m_info.type_index = std::max(std::min(static_cast<size_t>(in.u.indexedArrayIndex), def->m_indexed_arrays.size() - 1u), 0u);
break; break;
case DATA_ENUM_ARRAY: case DATA_ENUM_ARRAY:
assert(!def->m_enumed_arrays.empty()); assert(!def->m_enumed_arrays.empty());
out.m_category = CommonStructuredDataTypeCategory::ENUM_ARRAY; out.m_category = CommonStructuredDataTypeCategory::ENUM_ARRAY;
out.m_info.type_index = std::max(std::min(static_cast<size_t>(in.u.enumedArrayIndex), def->m_enumed_arrays.size() - 1uz), 0uz); out.m_info.type_index = std::max(std::min(static_cast<size_t>(in.u.enumedArrayIndex), def->m_enumed_arrays.size() - 1u), 0u);
break; break;
case DATA_COUNT: case DATA_COUNT:
default: default:
@ -138,7 +138,7 @@ void AssetDumperStructuredDataDefSet::ConvertEnumedArray(const CommonStructuredD
assert(!def->m_enums.empty()); assert(!def->m_enums.empty());
out->m_element_size_in_bits = in->elementType.type == DATA_BOOL ? 1 : in->elementSize * 8; out->m_element_size_in_bits = in->elementType.type == DATA_BOOL ? 1 : in->elementSize * 8;
out->m_array_type = ConvertType(def, in->elementType); out->m_array_type = ConvertType(def, in->elementType);
out->m_enum_index = std::max(std::min(static_cast<size_t>(in->enumIndex), def->m_enums.size() - 1uz), 0uz); out->m_enum_index = std::max(std::min(static_cast<size_t>(in->enumIndex), def->m_enums.size() - 1u), 0u);
if (def->m_enums.empty()) if (def->m_enums.empty())
{ {

View File

@ -267,7 +267,7 @@ namespace
const auto& vertList = surface.vertList[vertListIndex]; const auto& vertList = surface.vertList[vertListIndex];
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
weightCollection.weights[weightOffset++] = XModelBoneWeight{static_cast<unsigned>(vertList.boneOffset / sizeof(DObjSkelMat)), 1.0f}; weightCollection.weights[weightOffset++] = XModelBoneWeight{vertList.boneOffset / sizeof(DObjSkelMat), 1.0f};
for (auto vertListVertexOffset = 0u; vertListVertexOffset < vertList.vertCount; vertListVertexOffset++) for (auto vertListVertexOffset = 0u; vertListVertexOffset < vertList.vertCount; vertListVertexOffset++)
{ {
@ -284,7 +284,7 @@ namespace
for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[0]; vertIndex++) for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[0]; vertIndex++)
{ {
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
const unsigned boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat);
weightCollection.weights[weightOffset++] = XModelBoneWeight{boneIndex0, 1.0f}; weightCollection.weights[weightOffset++] = XModelBoneWeight{boneIndex0, 1.0f};
vertsBlendOffset += 1; vertsBlendOffset += 1;
@ -296,8 +296,8 @@ namespace
for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[1]; vertIndex++) for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[1]; vertIndex++)
{ {
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
const unsigned boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat);
const unsigned boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat);
const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]);
const auto boneWeight0 = 1.0f - boneWeight1; const auto boneWeight0 = 1.0f - boneWeight1;
@ -313,10 +313,10 @@ namespace
for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[2]; vertIndex++) for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[2]; vertIndex++)
{ {
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
const unsigned boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat);
const unsigned boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat);
const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]);
const unsigned boneIndex2 = surface.vertInfo.vertsBlend[vertsBlendOffset + 3] / sizeof(DObjSkelMat); const auto boneIndex2 = surface.vertInfo.vertsBlend[vertsBlendOffset + 3] / sizeof(DObjSkelMat);
const auto boneWeight2 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 4]); const auto boneWeight2 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 4]);
const auto boneWeight0 = 1.0f - boneWeight1 - boneWeight2; const auto boneWeight0 = 1.0f - boneWeight1 - boneWeight2;
@ -333,12 +333,12 @@ namespace
for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[3]; vertIndex++) for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[3]; vertIndex++)
{ {
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
const unsigned boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat);
const unsigned boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat);
const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]);
const unsigned boneIndex2 = surface.vertInfo.vertsBlend[vertsBlendOffset + 3] / sizeof(DObjSkelMat); const auto boneIndex2 = surface.vertInfo.vertsBlend[vertsBlendOffset + 3] / sizeof(DObjSkelMat);
const auto boneWeight2 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 4]); const auto boneWeight2 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 4]);
const unsigned boneIndex3 = surface.vertInfo.vertsBlend[vertsBlendOffset + 5] / sizeof(DObjSkelMat); const auto boneIndex3 = surface.vertInfo.vertsBlend[vertsBlendOffset + 5] / sizeof(DObjSkelMat);
const auto boneWeight3 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 6]); const auto boneWeight3 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 6]);
const auto boneWeight0 = 1.0f - boneWeight1 - boneWeight2 - boneWeight3; const auto boneWeight0 = 1.0f - boneWeight1 - boneWeight2 - boneWeight3;

View File

@ -50,7 +50,7 @@ bool ObjWriter::DumpZone(AssetDumpingContext& context) const
// DUMP_ASSET_POOL(AssetDumpersnd_alias_list_t, m_sound, ASSET_TYPE_SOUND) // DUMP_ASSET_POOL(AssetDumpersnd_alias_list_t, m_sound, ASSET_TYPE_SOUND)
DUMP_ASSET_POOL(AssetDumperSndCurve, m_sound_curve, ASSET_TYPE_SOUND_CURVE) DUMP_ASSET_POOL(AssetDumperSndCurve, m_sound_curve, ASSET_TYPE_SOUND_CURVE)
DUMP_ASSET_POOL(AssetDumperLoadedSound, m_loaded_sound, ASSET_TYPE_LOADED_SOUND) DUMP_ASSET_POOL(AssetDumperLoadedSound, m_loaded_sound, ASSET_TYPE_LOADED_SOUND)
// DUMP_ASSET_POOL(AssetDumperClipMap, m_clip_map, ASSET_TYPE_CLIPMAP_MP) // DUMP_ASSET_POOL(AssetDumperclipMap_t, m_clip_map, ASSET_TYPE_CLIPMAP_MP)
// DUMP_ASSET_POOL(AssetDumperComWorld, m_com_world, ASSET_TYPE_COMWORLD) // DUMP_ASSET_POOL(AssetDumperComWorld, m_com_world, ASSET_TYPE_COMWORLD)
// DUMP_ASSET_POOL(AssetDumperGameWorldSp, m_game_world_sp, ASSET_TYPE_GAMEWORLD_SP) // DUMP_ASSET_POOL(AssetDumperGameWorldSp, m_game_world_sp, ASSET_TYPE_GAMEWORLD_SP)
// DUMP_ASSET_POOL(AssetDumperGameWorldMp, m_game_world_mp, ASSET_TYPE_GAMEWORLD_MP) // DUMP_ASSET_POOL(AssetDumperGameWorldMp, m_game_world_mp, ASSET_TYPE_GAMEWORLD_MP)

View File

@ -35,7 +35,7 @@ bool ObjWriter::DumpZone(AssetDumpingContext& context) const
DUMP_ASSET_POOL(AssetDumperGfxImage, m_image, ASSET_TYPE_IMAGE) DUMP_ASSET_POOL(AssetDumperGfxImage, m_image, ASSET_TYPE_IMAGE)
// DUMP_ASSET_POOL(AssetDumperSndBank, m_sound_bank, ASSET_TYPE_SOUND) // DUMP_ASSET_POOL(AssetDumperSndBank, m_sound_bank, ASSET_TYPE_SOUND)
// DUMP_ASSET_POOL(AssetDumperSndPatch, m_sound_patch, ASSET_TYPE_SOUND_PATCH) // DUMP_ASSET_POOL(AssetDumperSndPatch, m_sound_patch, ASSET_TYPE_SOUND_PATCH)
// DUMP_ASSET_POOL(AssetDumperClipMap, m_clip_map, ASSET_TYPE_CLIPMAP_PVS) // DUMP_ASSET_POOL(AssetDumperClipMap, m_clip_map, ASSET_TYPE_CLIPMAP)
// DUMP_ASSET_POOL(AssetDumperComWorld, m_com_world, ASSET_TYPE_COMWORLD) // DUMP_ASSET_POOL(AssetDumperComWorld, m_com_world, ASSET_TYPE_COMWORLD)
// DUMP_ASSET_POOL(AssetDumperGameWorldSp, m_game_world_sp, ASSET_TYPE_GAMEWORLD_SP) // DUMP_ASSET_POOL(AssetDumperGameWorldSp, m_game_world_sp, ASSET_TYPE_GAMEWORLD_SP)
// DUMP_ASSET_POOL(AssetDumperGameWorldMp, m_game_world_mp, ASSET_TYPE_GAMEWORLD_MP) // DUMP_ASSET_POOL(AssetDumperGameWorldMp, m_game_world_mp, ASSET_TYPE_GAMEWORLD_MP)

View File

@ -1,23 +0,0 @@
#include "AssetDumperMapEnts.h"
#include <format>
using namespace T6;
bool AssetDumperMapEnts::ShouldDump(XAssetInfo<MapEnts>* asset)
{
return true;
}
void AssetDumperMapEnts::DumpAsset(AssetDumpingContext& context, XAssetInfo<MapEnts>* asset)
{
const auto* mapEnts = asset->Asset();
const auto mapEntsFile = context.OpenAssetFile(std::format("{}.ents", mapEnts->name));
if (!mapEntsFile)
return;
auto& stream = *mapEntsFile;
stream.write(mapEnts->entityString, mapEnts->numEntityChars - 1);
}

View File

@ -1,14 +0,0 @@
#pragma once
#include "Dumping/AbstractAssetDumper.h"
#include "Game/T6/T6.h"
namespace T6
{
class AssetDumperMapEnts final : public AbstractAssetDumper<MapEnts>
{
protected:
bool ShouldDump(XAssetInfo<MapEnts>* asset) override;
void DumpAsset(AssetDumpingContext& context, XAssetInfo<MapEnts>* asset) override;
};
} // namespace T6

View File

@ -110,7 +110,7 @@ namespace
"devraw/", "devraw/",
}; };
constexpr unsigned FRAME_RATE_FOR_INDEX[]{ constexpr size_t FRAME_RATE_FOR_INDEX[]{
8000, 8000,
12000, 12000,
16000, 16000,

View File

@ -4,7 +4,6 @@
#include "AssetDumpers/AssetDumperGfxImage.h" #include "AssetDumpers/AssetDumperGfxImage.h"
#include "AssetDumpers/AssetDumperLeaderboardDef.h" #include "AssetDumpers/AssetDumperLeaderboardDef.h"
#include "AssetDumpers/AssetDumperLocalizeEntry.h" #include "AssetDumpers/AssetDumperLocalizeEntry.h"
#include "AssetDumpers/AssetDumperMapEnts.h"
#include "AssetDumpers/AssetDumperMaterial.h" #include "AssetDumpers/AssetDumperMaterial.h"
#include "AssetDumpers/AssetDumperPhysConstraints.h" #include "AssetDumpers/AssetDumperPhysConstraints.h"
#include "AssetDumpers/AssetDumperPhysPreset.h" #include "AssetDumpers/AssetDumperPhysPreset.h"
@ -50,11 +49,11 @@ bool ObjWriter::DumpZone(AssetDumpingContext& context) const
DUMP_ASSET_POOL(AssetDumperGfxImage, m_image, ASSET_TYPE_IMAGE) DUMP_ASSET_POOL(AssetDumperGfxImage, m_image, ASSET_TYPE_IMAGE)
DUMP_ASSET_POOL(AssetDumperSndBank, m_sound_bank, ASSET_TYPE_SOUND) DUMP_ASSET_POOL(AssetDumperSndBank, m_sound_bank, ASSET_TYPE_SOUND)
// DUMP_ASSET_POOL(AssetDumperSndPatch, m_sound_patch, ASSET_TYPE_SOUND_PATCH) // DUMP_ASSET_POOL(AssetDumperSndPatch, m_sound_patch, ASSET_TYPE_SOUND_PATCH)
// DUMP_ASSET_POOL(AssetDumperClipMap, m_clip_map, ASSET_TYPE_CLIPMAP_PVS) // DUMP_ASSET_POOL(AssetDumperClipMap, m_clip_map, ASSET_TYPE_CLIPMAP)
// DUMP_ASSET_POOL(AssetDumperComWorld, m_com_world, ASSET_TYPE_COMWORLD) // DUMP_ASSET_POOL(AssetDumperComWorld, m_com_world, ASSET_TYPE_COMWORLD)
// DUMP_ASSET_POOL(AssetDumperGameWorldSp, m_game_world_sp, ASSET_TYPE_GAMEWORLD_SP) // DUMP_ASSET_POOL(AssetDumperGameWorldSp, m_game_world_sp, ASSET_TYPE_GAMEWORLD_SP)
// DUMP_ASSET_POOL(AssetDumperGameWorldMp, m_game_world_mp, ASSET_TYPE_GAMEWORLD_MP) // DUMP_ASSET_POOL(AssetDumperGameWorldMp, m_game_world_mp, ASSET_TYPE_GAMEWORLD_MP)
DUMP_ASSET_POOL(AssetDumperMapEnts, m_map_ents, ASSET_TYPE_MAP_ENTS) // DUMP_ASSET_POOL(AssetDumperMapEnts, m_map_ents, ASSET_TYPE_MAP_ENTS)
// DUMP_ASSET_POOL(AssetDumperGfxWorld, m_gfx_world, ASSET_TYPE_GFXWORLD) // DUMP_ASSET_POOL(AssetDumperGfxWorld, m_gfx_world, ASSET_TYPE_GFXWORLD)
// DUMP_ASSET_POOL(AssetDumperGfxLightDef, m_gfx_light_def, ASSET_TYPE_LIGHT_DEF) // DUMP_ASSET_POOL(AssetDumperGfxLightDef, m_gfx_light_def, ASSET_TYPE_LIGHT_DEF)
// DUMP_ASSET_POOL(AssetDumperFont, m_font, ASSET_TYPE_FONT) // DUMP_ASSET_POOL(AssetDumperFont, m_font, ASSET_TYPE_FONT)

View File

@ -27,7 +27,7 @@ void WavWriter::WritePcmHeader(const WavMetaData& metaData, const size_t dataLen
}; };
m_stream.write(reinterpret_cast<const char*>(&formatChunk), sizeof(formatChunk)); m_stream.write(reinterpret_cast<const char*>(&formatChunk), sizeof(formatChunk));
const WavChunkHeader dataChunkHeader{WAV_CHUNK_ID_DATA, static_cast<unsigned>(dataLen)}; const WavChunkHeader dataChunkHeader{WAV_CHUNK_ID_DATA, dataLen};
m_stream.write(reinterpret_cast<const char*>(&dataChunkHeader), sizeof(dataChunkHeader)); m_stream.write(reinterpret_cast<const char*>(&dataChunkHeader), sizeof(dataChunkHeader));
} }

View File

@ -139,7 +139,7 @@ void StructuredDataDefDumper::DumpType(const CommonStructuredDataDef& def,
void StructuredDataDefDumper::DumpProperty(const CommonStructuredDataDef& def, void StructuredDataDefDumper::DumpProperty(const CommonStructuredDataDef& def,
const CommonStructuredDataStructProperty& property, const CommonStructuredDataStructProperty& property,
size_t& currentOffsetInBit) const unsigned& currentOffsetInBit) const
{ {
std::string typeName; std::string typeName;
std::vector<std::string> arraySpecifiers; std::vector<std::string> arraySpecifiers;
@ -205,11 +205,11 @@ void StructuredDataDefDumper::DumpStruct(const CommonStructuredDataDef& def, con
IncIndent(); IncIndent();
auto currentOffsetInBit = auto currentOffsetInBit =
def.m_root_type.m_category == CommonStructuredDataTypeCategory::STRUCT && def.m_root_type.m_info.type_index == structIndex ? 64uz : 0uz; def.m_root_type.m_category == CommonStructuredDataTypeCategory::STRUCT && def.m_root_type.m_info.type_index == structIndex ? 64u : 0u;
for (const auto& property : _struct.m_properties) for (const auto& property : _struct.m_properties)
DumpProperty(def, property, currentOffsetInBit); DumpProperty(def, property, currentOffsetInBit);
currentOffsetInBit = utils::Align(currentOffsetInBit, 8uz); currentOffsetInBit = utils::Align(currentOffsetInBit, 8u);
if ((currentOffsetInBit / 8) < _struct.m_size_in_byte) if ((currentOffsetInBit / 8) < _struct.m_size_in_byte)
{ {
Indent(); Indent();

View File

@ -17,7 +17,7 @@ class StructuredDataDefDumper : AbstractTextDumper
void DumpEnum(const CommonStructuredDataEnum& _enum); void DumpEnum(const CommonStructuredDataEnum& _enum);
void DumpType(const CommonStructuredDataDef& def, CommonStructuredDataType type, std::string& typeName, std::vector<std::string>& arraySpecifiers) const; void DumpType(const CommonStructuredDataDef& def, CommonStructuredDataType type, std::string& typeName, std::vector<std::string>& arraySpecifiers) const;
void DumpProperty(const CommonStructuredDataDef& def, const CommonStructuredDataStructProperty& property, size_t& currentOffsetInBit) const; void DumpProperty(const CommonStructuredDataDef& def, const CommonStructuredDataStructProperty& property, unsigned& currentOffsetInBit) const;
void DumpStruct(const CommonStructuredDataDef& def, const CommonStructuredDataStruct& _struct, size_t structIndex); void DumpStruct(const CommonStructuredDataDef& def, const CommonStructuredDataStruct& _struct, size_t structIndex);
public: public:

View File

@ -393,8 +393,7 @@ namespace
const auto& vertList = surface.vertList[vertListIndex]; const auto& vertList = surface.vertList[vertListIndex];
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
weightCollection.weights[weightOffset++] = weightCollection.weights[weightOffset++] = XModelBoneWeight{.boneIndex = vertList.boneOffset / sizeof(DObjSkelMat), .weight = 1.0f};
XModelBoneWeight{.boneIndex = static_cast<unsigned>(vertList.boneOffset / sizeof(DObjSkelMat)), .weight = 1.0f};
for (auto vertListVertexOffset = 0u; vertListVertexOffset < vertList.vertCount; vertListVertexOffset++) for (auto vertListVertexOffset = 0u; vertListVertexOffset < vertList.vertCount; vertListVertexOffset++)
{ {
@ -411,7 +410,7 @@ namespace
for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[0]; vertIndex++) for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[0]; vertIndex++)
{ {
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
const unsigned boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat);
weightCollection.weights[weightOffset++] = XModelBoneWeight{.boneIndex = boneIndex0, .weight = 1.0f}; weightCollection.weights[weightOffset++] = XModelBoneWeight{.boneIndex = boneIndex0, .weight = 1.0f};
vertsBlendOffset += 1; vertsBlendOffset += 1;
@ -423,8 +422,8 @@ namespace
for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[1]; vertIndex++) for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[1]; vertIndex++)
{ {
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
const unsigned boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat);
const unsigned boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat);
const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]);
const auto boneWeight0 = 1.0f - boneWeight1; const auto boneWeight0 = 1.0f - boneWeight1;
@ -440,10 +439,10 @@ namespace
for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[2]; vertIndex++) for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[2]; vertIndex++)
{ {
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
const unsigned boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat);
const unsigned boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat);
const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]);
const unsigned boneIndex2 = surface.vertInfo.vertsBlend[vertsBlendOffset + 3] / sizeof(DObjSkelMat); const auto boneIndex2 = surface.vertInfo.vertsBlend[vertsBlendOffset + 3] / sizeof(DObjSkelMat);
const auto boneWeight2 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 4]); const auto boneWeight2 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 4]);
const auto boneWeight0 = 1.0f - boneWeight1 - boneWeight2; const auto boneWeight0 = 1.0f - boneWeight1 - boneWeight2;
@ -460,12 +459,12 @@ namespace
for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[3]; vertIndex++) for (auto vertIndex = 0; vertIndex < surface.vertInfo.vertCount[3]; vertIndex++)
{ {
const auto boneWeightOffset = weightOffset; const auto boneWeightOffset = weightOffset;
const unsigned boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat); const auto boneIndex0 = surface.vertInfo.vertsBlend[vertsBlendOffset + 0] / sizeof(DObjSkelMat);
const unsigned boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat); const auto boneIndex1 = surface.vertInfo.vertsBlend[vertsBlendOffset + 1] / sizeof(DObjSkelMat);
const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]); const auto boneWeight1 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 2]);
const unsigned boneIndex2 = surface.vertInfo.vertsBlend[vertsBlendOffset + 3] / sizeof(DObjSkelMat); const auto boneIndex2 = surface.vertInfo.vertsBlend[vertsBlendOffset + 3] / sizeof(DObjSkelMat);
const auto boneWeight2 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 4]); const auto boneWeight2 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 4]);
const unsigned boneIndex3 = surface.vertInfo.vertsBlend[vertsBlendOffset + 5] / sizeof(DObjSkelMat); const auto boneIndex3 = surface.vertInfo.vertsBlend[vertsBlendOffset + 5] / sizeof(DObjSkelMat);
const auto boneWeight3 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 6]); const auto boneWeight3 = BoneWeight16(surface.vertInfo.vertsBlend[vertsBlendOffset + 6]);
const auto boneWeight0 = 1.0f - boneWeight1 - boneWeight2 - boneWeight3; const auto boneWeight0 = 1.0f - boneWeight1 - boneWeight2 - boneWeight3;
@ -570,7 +569,7 @@ namespace
void DumpXModelExportLod(const XModelCommon& common, const AssetDumpingContext& context, const XAssetInfo<XModel>* asset, const unsigned lod) void DumpXModelExportLod(const XModelCommon& common, const AssetDumpingContext& context, const XAssetInfo<XModel>* asset, const unsigned lod)
{ {
const auto* model = asset->Asset(); const auto* model = asset->Asset();
const auto assetFile = context.OpenAssetFile(GetFileNameForLod(model->name, lod, ".xmodel_export")); const auto assetFile = context.OpenAssetFile(GetFileNameForLod(model->name, lod, ".XMODEL_EXPORT"));
if (!assetFile) if (!assetFile)
return; return;
@ -665,13 +664,13 @@ namespace
switch (ObjWriting::Configuration.ModelOutputFormat) switch (ObjWriting::Configuration.ModelOutputFormat)
{ {
case ObjWriting::Configuration_t::ModelOutputFormat_e::XMODEL_EXPORT: case ObjWriting::Configuration_t::ModelOutputFormat_e::XMODEL_EXPORT:
return ".xmodel_export"; return ".XMODEL_EXPORT";
case ObjWriting::Configuration_t::ModelOutputFormat_e::OBJ: case ObjWriting::Configuration_t::ModelOutputFormat_e::OBJ:
return ".obj"; return ".OBJ";
case ObjWriting::Configuration_t::ModelOutputFormat_e::GLTF: case ObjWriting::Configuration_t::ModelOutputFormat_e::GLTF:
return ".gltf"; return ".GLTF";
case ObjWriting::Configuration_t::ModelOutputFormat_e::GLB: case ObjWriting::Configuration_t::ModelOutputFormat_e::GLB:
return ".glb"; return ".GLB";
default: default:
assert(false); assert(false);
return ""; return "";

View File

@ -1,11 +1,11 @@
#include "AbstractDirectiveStreamProxy.h" #include "AbstractDirectiveStreamProxy.h"
TokenPos AbstractDirectiveStreamProxy::CreatePos(const ParserLine& line, const size_t position) TokenPos AbstractDirectiveStreamProxy::CreatePos(const ParserLine& line, const unsigned position)
{ {
return TokenPos(*line.m_filename, line.m_line_number, static_cast<int>(position + 1)); return TokenPos(*line.m_filename, line.m_line_number, static_cast<int>(position + 1));
} }
bool AbstractDirectiveStreamProxy::SkipWhitespace(const ParserLine& line, size_t& position) bool AbstractDirectiveStreamProxy::SkipWhitespace(const ParserLine& line, unsigned& position)
{ {
while (true) while (true)
{ {
@ -21,7 +21,7 @@ bool AbstractDirectiveStreamProxy::SkipWhitespace(const ParserLine& line, size_t
return true; return true;
} }
bool AbstractDirectiveStreamProxy::ExtractInteger(const ParserLine& line, size_t& position, int& value) bool AbstractDirectiveStreamProxy::ExtractInteger(const ParserLine& line, unsigned& position, int& value)
{ {
if (position >= line.m_line.size()) if (position >= line.m_line.size())
return false; return false;
@ -40,7 +40,7 @@ bool AbstractDirectiveStreamProxy::ExtractInteger(const ParserLine& line, size_t
return false; return false;
} }
bool AbstractDirectiveStreamProxy::ExtractIdentifier(const ParserLine& line, size_t& position) bool AbstractDirectiveStreamProxy::ExtractIdentifier(const ParserLine& line, unsigned& position)
{ {
auto firstChar = true; auto firstChar = true;
while (true) while (true)
@ -60,7 +60,7 @@ bool AbstractDirectiveStreamProxy::ExtractIdentifier(const ParserLine& line, siz
} }
} }
bool AbstractDirectiveStreamProxy::MatchCharacter(const ParserLine& line, size_t& position, char c) bool AbstractDirectiveStreamProxy::MatchCharacter(const ParserLine& line, unsigned& position, char c)
{ {
if (position < line.m_line.size() && line.m_line[position] == c) if (position < line.m_line.size() && line.m_line[position] == c)
{ {
@ -71,12 +71,12 @@ bool AbstractDirectiveStreamProxy::MatchCharacter(const ParserLine& line, size_t
return false; return false;
} }
bool AbstractDirectiveStreamProxy::MatchNextCharacter(const ParserLine& line, size_t& position, char c) bool AbstractDirectiveStreamProxy::MatchNextCharacter(const ParserLine& line, unsigned& position, char c)
{ {
return SkipWhitespace(line, position) && MatchCharacter(line, position, c); return SkipWhitespace(line, position) && MatchCharacter(line, position, c);
} }
bool AbstractDirectiveStreamProxy::MatchString(const ParserLine& line, size_t& position, const char* str, size_t len) bool AbstractDirectiveStreamProxy::MatchString(const ParserLine& line, unsigned& position, const char* str, unsigned len)
{ {
if (line.m_line.compare(position, len, str) == 0) if (line.m_line.compare(position, len, str) == 0)
{ {
@ -87,12 +87,12 @@ bool AbstractDirectiveStreamProxy::MatchString(const ParserLine& line, size_t& p
return false; return false;
} }
bool AbstractDirectiveStreamProxy::MatchNextString(const ParserLine& line, size_t& position, const char* str, size_t len) bool AbstractDirectiveStreamProxy::MatchNextString(const ParserLine& line, unsigned& position, const char* str, unsigned len)
{ {
return SkipWhitespace(line, position) && MatchString(line, position, str, len); return SkipWhitespace(line, position) && MatchString(line, position, str, len);
} }
bool AbstractDirectiveStreamProxy::FindDirective(const ParserLine& line, size_t& directiveStartPosition, size_t& directiveEndPos) bool AbstractDirectiveStreamProxy::FindDirective(const ParserLine& line, unsigned& directiveStartPosition, unsigned& directiveEndPos)
{ {
directiveStartPosition = 0; directiveStartPosition = 0;
for (; directiveStartPosition < line.m_line.size(); directiveStartPosition++) for (; directiveStartPosition < line.m_line.size(); directiveStartPosition++)

View File

@ -3,22 +3,20 @@
#include "Parsing/IParserLineStream.h" #include "Parsing/IParserLineStream.h"
#include "Parsing/TokenPos.h" #include "Parsing/TokenPos.h"
#include <cstddef>
class AbstractDirectiveStreamProxy : public IParserLineStream class AbstractDirectiveStreamProxy : public IParserLineStream
{ {
protected: protected:
AbstractDirectiveStreamProxy() = default; AbstractDirectiveStreamProxy() = default;
static TokenPos CreatePos(const ParserLine& line, size_t position); static TokenPos CreatePos(const ParserLine& line, unsigned position);
static bool SkipWhitespace(const ParserLine& line, size_t& position); static bool SkipWhitespace(const ParserLine& line, unsigned& position);
static bool ExtractInteger(const ParserLine& line, size_t& position, int& value); static bool ExtractInteger(const ParserLine& line, unsigned& position, int& value);
static bool ExtractIdentifier(const ParserLine& line, size_t& position); static bool ExtractIdentifier(const ParserLine& line, unsigned& position);
static bool MatchCharacter(const ParserLine& line, size_t& position, char c); static bool MatchCharacter(const ParserLine& line, unsigned& position, char c);
static bool MatchNextCharacter(const ParserLine& line, size_t& position, char c); static bool MatchNextCharacter(const ParserLine& line, unsigned& position, char c);
static bool MatchString(const ParserLine& line, size_t& position, const char* str, size_t len); static bool MatchString(const ParserLine& line, unsigned& position, const char* str, unsigned len);
static bool MatchNextString(const ParserLine& line, size_t& position, const char* str, size_t len); static bool MatchNextString(const ParserLine& line, unsigned& position, const char* str, unsigned len);
static bool FindDirective(const ParserLine& line, size_t& directiveStartPosition, size_t& directiveEndPos); static bool FindDirective(const ParserLine& line, unsigned& directiveStartPosition, unsigned& directiveEndPos);
}; };

View File

@ -14,12 +14,12 @@
namespace namespace
{ {
bool IsStringizeParameterForwardLookup(const std::string& value, size_t pos) bool IsStringizeParameterForwardLookup(const std::string& value, unsigned pos)
{ {
return pos + 1 && (isalpha(value[pos + 1]) || value[pos + 1] == '_'); return pos + 1 && (isalpha(value[pos + 1]) || value[pos + 1] == '_');
} }
bool IsTokenPastingOperatorForwardLookup(const std::string& value, size_t pos) bool IsTokenPastingOperatorForwardLookup(const std::string& value, unsigned pos)
{ {
return pos + 1 < value.size() && value[pos + 1] == '#'; return pos + 1 < value.size() && value[pos + 1] == '#';
} }
@ -32,7 +32,7 @@ DefinesStreamProxy::DefineParameterPosition::DefineParameterPosition()
{ {
} }
DefinesStreamProxy::DefineParameterPosition::DefineParameterPosition(const unsigned index, const size_t position, const bool stringize) DefinesStreamProxy::DefineParameterPosition::DefineParameterPosition(const unsigned index, const unsigned position, const bool stringize)
: m_parameter_index(index), : m_parameter_index(index),
m_parameter_position(position), m_parameter_position(position),
m_stringize(stringize) m_stringize(stringize)
@ -175,7 +175,7 @@ int DefinesStreamProxy::GetLineEndEscapePos(const ParserLine& line)
return -1; return -1;
} }
void DefinesStreamProxy::ContinueDefine(const ParserLine& line, const size_t currentPos) void DefinesStreamProxy::ContinueDefine(const ParserLine& line, const unsigned currentPos)
{ {
const auto lineEndEscapePos = GetLineEndEscapePos(line); const auto lineEndEscapePos = GetLineEndEscapePos(line);
if (lineEndEscapePos < 0) if (lineEndEscapePos < 0)
@ -204,7 +204,7 @@ void DefinesStreamProxy::ContinueDefine(const ParserLine& line, const size_t cur
} }
} }
void DefinesStreamProxy::ContinueParameters(const ParserLine& line, size_t& currentPos) void DefinesStreamProxy::ContinueParameters(const ParserLine& line, unsigned& currentPos)
{ {
const auto lineEndEscapePos = GetLineEndEscapePos(line); const auto lineEndEscapePos = GetLineEndEscapePos(line);
while (true) while (true)
@ -241,7 +241,7 @@ void DefinesStreamProxy::ContinueParameters(const ParserLine& line, size_t& curr
} }
} }
void DefinesStreamProxy::MatchDefineParameters(const ParserLine& line, size_t& currentPos) void DefinesStreamProxy::MatchDefineParameters(const ParserLine& line, unsigned& currentPos)
{ {
m_current_define_parameters = std::vector<std::string>(); m_current_define_parameters = std::vector<std::string>();
if (line.m_line[currentPos] != '(') if (line.m_line[currentPos] != '(')
@ -253,7 +253,7 @@ void DefinesStreamProxy::MatchDefineParameters(const ParserLine& line, size_t& c
ContinueParameters(line, currentPos); ContinueParameters(line, currentPos);
} }
bool DefinesStreamProxy::MatchDefineDirective(const ParserLine& line, const size_t directiveStartPosition, const size_t directiveEndPosition) bool DefinesStreamProxy::MatchDefineDirective(const ParserLine& line, const unsigned directiveStartPosition, const unsigned directiveEndPosition)
{ {
auto currentPos = directiveStartPosition; auto currentPos = directiveStartPosition;
@ -284,7 +284,7 @@ bool DefinesStreamProxy::MatchDefineDirective(const ParserLine& line, const size
return true; return true;
} }
bool DefinesStreamProxy::MatchUndefDirective(const ParserLine& line, const size_t directiveStartPosition, const size_t directiveEndPosition) bool DefinesStreamProxy::MatchUndefDirective(const ParserLine& line, const unsigned directiveStartPosition, const unsigned directiveEndPosition)
{ {
auto currentPos = directiveStartPosition; auto currentPos = directiveStartPosition;
@ -323,7 +323,7 @@ std::unique_ptr<ISimpleExpression> DefinesStreamProxy::ParseExpression(std::shar
return expressionInterpreter.Evaluate(); return expressionInterpreter.Evaluate();
} }
bool DefinesStreamProxy::MatchIfDirective(const ParserLine& line, const size_t directiveStartPosition, const size_t directiveEndPosition) bool DefinesStreamProxy::MatchIfDirective(const ParserLine& line, const unsigned directiveStartPosition, const unsigned directiveEndPosition)
{ {
auto currentPos = directiveStartPosition; auto currentPos = directiveStartPosition;
@ -356,7 +356,7 @@ bool DefinesStreamProxy::MatchIfDirective(const ParserLine& line, const size_t d
return true; return true;
} }
bool DefinesStreamProxy::MatchElIfDirective(const ParserLine& line, const size_t directiveStartPosition, const size_t directiveEndPosition) bool DefinesStreamProxy::MatchElIfDirective(const ParserLine& line, const unsigned directiveStartPosition, const unsigned directiveEndPosition)
{ {
auto currentPos = directiveStartPosition; auto currentPos = directiveStartPosition;
@ -398,7 +398,7 @@ bool DefinesStreamProxy::MatchElIfDirective(const ParserLine& line, const size_t
return true; return true;
} }
bool DefinesStreamProxy::MatchIfdefDirective(const ParserLine& line, const size_t directiveStartPosition, const size_t directiveEndPosition) bool DefinesStreamProxy::MatchIfdefDirective(const ParserLine& line, const unsigned directiveStartPosition, const unsigned directiveEndPosition)
{ {
auto currentPos = directiveStartPosition; auto currentPos = directiveStartPosition;
@ -439,7 +439,7 @@ bool DefinesStreamProxy::MatchIfdefDirective(const ParserLine& line, const size_
return true; return true;
} }
bool DefinesStreamProxy::MatchElseDirective(const ParserLine& line, const size_t directiveStartPosition, const size_t directiveEndPosition) bool DefinesStreamProxy::MatchElseDirective(const ParserLine& line, const unsigned directiveStartPosition, const unsigned directiveEndPosition)
{ {
auto currentPos = directiveStartPosition; auto currentPos = directiveStartPosition;
@ -460,7 +460,7 @@ bool DefinesStreamProxy::MatchElseDirective(const ParserLine& line, const size_t
return true; return true;
} }
bool DefinesStreamProxy::MatchEndifDirective(const ParserLine& line, const size_t directiveStartPosition, const size_t directiveEndPosition) bool DefinesStreamProxy::MatchEndifDirective(const ParserLine& line, const unsigned directiveStartPosition, const unsigned directiveEndPosition)
{ {
auto currentPos = directiveStartPosition; auto currentPos = directiveStartPosition;
@ -486,8 +486,8 @@ bool DefinesStreamProxy::MatchEndifDirective(const ParserLine& line, const size_
bool DefinesStreamProxy::MatchDirectives(ParserLine& line) bool DefinesStreamProxy::MatchDirectives(ParserLine& line)
{ {
size_t directiveStartPos; unsigned directiveStartPos;
size_t directiveEndPos; unsigned directiveEndPos;
if (!FindDirective(line, directiveStartPos, directiveEndPos)) if (!FindDirective(line, directiveStartPos, directiveEndPos))
return false; return false;
@ -537,9 +537,9 @@ void DefinesStreamProxy::ExtractParametersFromMacroUsage(
ContinueMacroParameters(line, linePos, state, input, inputPos); ContinueMacroParameters(line, linePos, state, input, inputPos);
} }
bool DefinesStreamProxy::MatchDefinedExpression(const ParserLine& line, size_t& pos, std::string& definitionName) bool DefinesStreamProxy::MatchDefinedExpression(const ParserLine& line, unsigned& pos, std::string& definitionName)
{ {
auto currentPos = pos; unsigned currentPos = pos;
if (!MatchNextCharacter(line, currentPos, '(')) if (!MatchNextCharacter(line, currentPos, '('))
return false; return false;
@ -559,7 +559,7 @@ bool DefinesStreamProxy::MatchDefinedExpression(const ParserLine& line, size_t&
void DefinesStreamProxy::ExpandDefinedExpressions(ParserLine& line) const void DefinesStreamProxy::ExpandDefinedExpressions(ParserLine& line) const
{ {
auto currentPos = 0uz; auto currentPos = 0u;
while (true) while (true)
{ {
@ -1094,7 +1094,7 @@ ParserLine DefinesStreamProxy::NextLine()
{ {
if (m_in_define) if (m_in_define)
{ {
auto currentPos = 0uz; unsigned currentPos = 0u;
if (m_parameter_state != ParameterState::NOT_IN_PARAMETERS) if (m_parameter_state != ParameterState::NOT_IN_PARAMETERS)
{ {

View File

@ -4,7 +4,6 @@
#include "Parsing/IParserLineStream.h" #include "Parsing/IParserLineStream.h"
#include "Parsing/Simple/Expression/ISimpleExpression.h" #include "Parsing/Simple/Expression/ISimpleExpression.h"
#include <cstddef>
#include <map> #include <map>
#include <set> #include <set>
#include <sstream> #include <sstream>
@ -30,11 +29,11 @@ public:
{ {
public: public:
unsigned m_parameter_index; unsigned m_parameter_index;
size_t m_parameter_position; unsigned m_parameter_position;
bool m_stringize; bool m_stringize;
DefineParameterPosition(); DefineParameterPosition();
DefineParameterPosition(unsigned index, size_t position, bool stringize); DefineParameterPosition(unsigned index, unsigned position, bool stringize);
}; };
class Define class Define
@ -97,22 +96,22 @@ private:
MacroParameterState m_multi_line_macro_parameters; MacroParameterState m_multi_line_macro_parameters;
static int GetLineEndEscapePos(const ParserLine& line); static int GetLineEndEscapePos(const ParserLine& line);
void MatchDefineParameters(const ParserLine& line, size_t& currentPos); void MatchDefineParameters(const ParserLine& line, unsigned& currentPos);
void ContinueDefine(const ParserLine& line, size_t currentPos); void ContinueDefine(const ParserLine& line, unsigned currentPos);
void ContinueParameters(const ParserLine& line, size_t& currentPos); void ContinueParameters(const ParserLine& line, unsigned& currentPos);
_NODISCARD bool MatchDefineDirective(const ParserLine& line, size_t directiveStartPosition, size_t directiveEndPosition); _NODISCARD bool MatchDefineDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition);
_NODISCARD bool MatchUndefDirective(const ParserLine& line, size_t directiveStartPosition, size_t directiveEndPosition); _NODISCARD bool MatchUndefDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition);
_NODISCARD bool MatchIfDirective(const ParserLine& line, size_t directiveStartPosition, size_t directiveEndPosition); _NODISCARD bool MatchIfDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition);
_NODISCARD bool MatchElIfDirective(const ParserLine& line, size_t directiveStartPosition, size_t directiveEndPosition); _NODISCARD bool MatchElIfDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition);
_NODISCARD bool MatchIfdefDirective(const ParserLine& line, size_t directiveStartPosition, size_t directiveEndPosition); _NODISCARD bool MatchIfdefDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition);
_NODISCARD bool MatchElseDirective(const ParserLine& line, size_t directiveStartPosition, size_t directiveEndPosition); _NODISCARD bool MatchElseDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition);
_NODISCARD bool MatchEndifDirective(const ParserLine& line, size_t directiveStartPosition, size_t directiveEndPosition); _NODISCARD bool MatchEndifDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition);
_NODISCARD bool MatchDirectives(ParserLine& line); _NODISCARD bool MatchDirectives(ParserLine& line);
void ExtractParametersFromMacroUsage(const ParserLine& line, unsigned& linePos, MacroParameterState& state, const std::string& input, unsigned& inputPos); void ExtractParametersFromMacroUsage(const ParserLine& line, unsigned& linePos, MacroParameterState& state, const std::string& input, unsigned& inputPos);
bool FindMacroForIdentifier(const std::string& input, unsigned wordStart, unsigned wordEnd, const Define*& value) const; bool FindMacroForIdentifier(const std::string& input, unsigned wordStart, unsigned wordEnd, const Define*& value) const;
static bool MatchDefinedExpression(const ParserLine& line, size_t& pos, std::string& definitionName); static bool MatchDefinedExpression(const ParserLine& line, unsigned& pos, std::string& definitionName);
void ExpandDefinedExpressions(ParserLine& line) const; void ExpandDefinedExpressions(ParserLine& line) const;
bool FindNextMacro(const std::string& input, unsigned& inputPos, unsigned& defineStart, const DefinesStreamProxy::Define*& define); bool FindNextMacro(const std::string& input, unsigned& inputPos, unsigned& defineStart, const DefinesStreamProxy::Define*& define);

View File

@ -13,9 +13,9 @@ IncludingStreamProxy::IncludingStreamProxy(IParserLineStream* stream)
} }
bool IncludingStreamProxy::ExtractIncludeFilename(const ParserLine& line, bool IncludingStreamProxy::ExtractIncludeFilename(const ParserLine& line,
const size_t includeDirectivePosition, const unsigned includeDirectivePosition,
size_t& filenameStartPosition, unsigned& filenameStartPosition,
size_t& filenameEndPosition) unsigned& filenameEndPosition)
{ {
auto currentPos = includeDirectivePosition; auto currentPos = includeDirectivePosition;
bool isDoubleQuotes; bool isDoubleQuotes;
@ -60,7 +60,7 @@ bool IncludingStreamProxy::ExtractIncludeFilename(const ParserLine& line,
return false; return false;
} }
bool IncludingStreamProxy::MatchIncludeDirective(const ParserLine& line, const size_t directiveStartPos, const size_t directiveEndPos) const bool IncludingStreamProxy::MatchIncludeDirective(const ParserLine& line, const unsigned directiveStartPos, const unsigned directiveEndPos) const
{ {
auto currentPos = directiveStartPos; auto currentPos = directiveStartPos;
@ -70,7 +70,7 @@ bool IncludingStreamProxy::MatchIncludeDirective(const ParserLine& line, const s
return false; return false;
} }
size_t filenameStart, filenameEnd; unsigned filenameStart, filenameEnd;
if (!ExtractIncludeFilename(line, currentPos, filenameStart, filenameEnd)) if (!ExtractIncludeFilename(line, currentPos, filenameStart, filenameEnd))
throw ParsingException(TokenPos(*line.m_filename, line.m_line_number, static_cast<int>(currentPos)), INCLUDE_QUOTES_ERROR); throw ParsingException(TokenPos(*line.m_filename, line.m_line_number, static_cast<int>(currentPos)), INCLUDE_QUOTES_ERROR);
@ -86,7 +86,7 @@ bool IncludingStreamProxy::MatchIncludeDirective(const ParserLine& line, const s
return true; return true;
} }
bool IncludingStreamProxy::MatchPragmaOnceDirective(const ParserLine& line, const size_t directiveStartPos, const size_t directiveEndPos) bool IncludingStreamProxy::MatchPragmaOnceDirective(const ParserLine& line, const unsigned directiveStartPos, const unsigned directiveEndPos)
{ {
auto currentPos = directiveStartPos; auto currentPos = directiveStartPos;
@ -116,7 +116,7 @@ bool IncludingStreamProxy::MatchPragmaOnceDirective(const ParserLine& line, cons
bool IncludingStreamProxy::MatchDirectives(const ParserLine& line) bool IncludingStreamProxy::MatchDirectives(const ParserLine& line)
{ {
size_t directiveStartPos, directiveEndPos; unsigned directiveStartPos, directiveEndPos;
if (!FindDirective(line, directiveStartPos, directiveEndPos)) if (!FindDirective(line, directiveStartPos, directiveEndPos))
return false; return false;

View File

@ -16,9 +16,9 @@ class IncludingStreamProxy final : public AbstractDirectiveStreamProxy
std::set<std::string> m_included_files; std::set<std::string> m_included_files;
_NODISCARD static bool _NODISCARD static bool
ExtractIncludeFilename(const ParserLine& line, size_t includeDirectivePosition, size_t& filenameStartPosition, size_t& filenameEndPosition); ExtractIncludeFilename(const ParserLine& line, unsigned includeDirectivePosition, unsigned& filenameStartPosition, unsigned& filenameEndPosition);
_NODISCARD bool MatchIncludeDirective(const ParserLine& line, size_t directiveStartPos, size_t directiveEndPos) const; _NODISCARD bool MatchIncludeDirective(const ParserLine& line, unsigned directiveStartPos, unsigned directiveEndPos) const;
_NODISCARD bool MatchPragmaOnceDirective(const ParserLine& line, size_t directiveStartPos, size_t directiveEndPos); _NODISCARD bool MatchPragmaOnceDirective(const ParserLine& line, unsigned directiveStartPos, unsigned directiveEndPos);
_NODISCARD bool MatchDirectives(const ParserLine& line); _NODISCARD bool MatchDirectives(const ParserLine& line);
public: public:

View File

@ -7,7 +7,7 @@ PackDefinitionStreamProxy::PackDefinitionStreamProxy(IParserLineStream* stream)
{ {
} }
bool PackDefinitionStreamProxy::MatchPackDirective(const ParserLine& line, const size_t directiveStartPosition, const size_t directiveEndPosition) bool PackDefinitionStreamProxy::MatchPackDirective(const ParserLine& line, const unsigned directiveStartPosition, const unsigned directiveEndPosition)
{ {
auto packValue = 0; auto packValue = 0;
auto currentPosition = directiveStartPosition; auto currentPosition = directiveStartPosition;
@ -60,7 +60,7 @@ bool PackDefinitionStreamProxy::MatchPackDirective(const ParserLine& line, const
bool PackDefinitionStreamProxy::MatchDirectives(const ParserLine& line) bool PackDefinitionStreamProxy::MatchDirectives(const ParserLine& line)
{ {
size_t directiveStartPos, directiveEndPos; unsigned directiveStartPos, directiveEndPos;
if (!FindDirective(line, directiveStartPos, directiveEndPos)) if (!FindDirective(line, directiveStartPos, directiveEndPos))
return false; return false;

View File

@ -21,7 +21,7 @@ private:
IParserLineStream* const m_stream; IParserLineStream* const m_stream;
std::stack<int> m_current_pack; std::stack<int> m_current_pack;
_NODISCARD bool MatchPackDirective(const ParserLine& line, size_t directiveStartPosition, size_t directiveEndPosition); _NODISCARD bool MatchPackDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition);
_NODISCARD bool MatchDirectives(const ParserLine& line); _NODISCARD bool MatchDirectives(const ParserLine& line);
public: public:

View File

@ -15,7 +15,7 @@ void SetDefineStreamProxy::SetDefinesProxy(DefinesStreamProxy* definesProxy)
m_defines_proxy = definesProxy; m_defines_proxy = definesProxy;
} }
bool SetDefineStreamProxy::MatchSetDirective(const ParserLine& line, const size_t directiveStartPosition, const size_t directiveEndPosition) const bool SetDefineStreamProxy::MatchSetDirective(const ParserLine& line, const unsigned directiveStartPosition, const unsigned directiveEndPosition) const
{ {
auto currentPosition = directiveStartPosition; auto currentPosition = directiveStartPosition;
@ -59,7 +59,7 @@ bool SetDefineStreamProxy::MatchSetDirective(const ParserLine& line, const size_
bool SetDefineStreamProxy::MatchDirectives(const ParserLine& line) const bool SetDefineStreamProxy::MatchDirectives(const ParserLine& line) const
{ {
size_t directiveStartPos, directiveEndPos; unsigned directiveStartPos, directiveEndPos;
if (!FindDirective(line, directiveStartPos, directiveEndPos)) if (!FindDirective(line, directiveStartPos, directiveEndPos))
return false; return false;

View File

@ -22,7 +22,7 @@ namespace templating
private: private:
static constexpr const char* SET_DIRECTIVE = "set"; static constexpr const char* SET_DIRECTIVE = "set";
_NODISCARD bool MatchSetDirective(const ParserLine& line, size_t directiveStartPosition, size_t directiveEndPosition) const; _NODISCARD bool MatchSetDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition) const;
_NODISCARD bool MatchDirectives(const ParserLine& line) const; _NODISCARD bool MatchDirectives(const ParserLine& line) const;
IParserLineStream* const m_stream; IParserLineStream* const m_stream;

View File

@ -18,7 +18,7 @@ void TemplatingStreamProxy::SetDefinesProxy(DefinesStreamProxy* definesProxy)
m_defines_proxy = definesProxy; m_defines_proxy = definesProxy;
} }
bool TemplatingStreamProxy::MatchSwitchDirective(const ParserLine& line, const size_t directiveStartPosition, const size_t directiveEndPosition) const bool TemplatingStreamProxy::MatchSwitchDirective(const ParserLine& line, const unsigned directiveStartPosition, const unsigned directiveEndPosition) const
{ {
auto currentPosition = directiveStartPosition; auto currentPosition = directiveStartPosition;
@ -43,7 +43,7 @@ bool TemplatingStreamProxy::MatchSwitchDirective(const ParserLine& line, const s
return true; return true;
} }
bool TemplatingStreamProxy::MatchOptionsDirective(const ParserLine& line, const size_t directiveStartPosition, const size_t directiveEndPosition) const bool TemplatingStreamProxy::MatchOptionsDirective(const ParserLine& line, const unsigned directiveStartPosition, const unsigned directiveEndPosition) const
{ {
auto currentPosition = directiveStartPosition; auto currentPosition = directiveStartPosition;
@ -93,7 +93,7 @@ bool TemplatingStreamProxy::MatchOptionsDirective(const ParserLine& line, const
return true; return true;
} }
bool TemplatingStreamProxy::MatchFilenameDirective(const ParserLine& line, const size_t directiveStartPosition, const size_t directiveEndPosition) const bool TemplatingStreamProxy::MatchFilenameDirective(const ParserLine& line, const unsigned directiveStartPosition, const unsigned directiveEndPosition) const
{ {
auto currentPosition = directiveStartPosition; auto currentPosition = directiveStartPosition;
@ -128,7 +128,7 @@ bool TemplatingStreamProxy::MatchFilenameDirective(const ParserLine& line, const
return true; return true;
} }
bool TemplatingStreamProxy::MatchSkipDirective(const ParserLine& line, const size_t directiveStartPosition, const size_t directiveEndPosition) const bool TemplatingStreamProxy::MatchSkipDirective(const ParserLine& line, const unsigned directiveStartPosition, const unsigned directiveEndPosition) const
{ {
auto currentPosition = directiveStartPosition; auto currentPosition = directiveStartPosition;
@ -146,7 +146,7 @@ bool TemplatingStreamProxy::MatchSkipDirective(const ParserLine& line, const siz
bool TemplatingStreamProxy::MatchDirectives(const ParserLine& line) const bool TemplatingStreamProxy::MatchDirectives(const ParserLine& line) const
{ {
size_t directiveStartPos, directiveEndPos; unsigned directiveStartPos, directiveEndPos;
if (!FindDirective(line, directiveStartPos, directiveEndPos)) if (!FindDirective(line, directiveStartPos, directiveEndPos))
return false; return false;

View File

@ -43,10 +43,10 @@ namespace templating
static constexpr const char* FILENAME_DIRECTIVE = "filename"; static constexpr const char* FILENAME_DIRECTIVE = "filename";
static constexpr const char* SKIP_DIRECTIVE = "skip"; static constexpr const char* SKIP_DIRECTIVE = "skip";
_NODISCARD bool MatchSwitchDirective(const ParserLine& line, size_t directiveStartPosition, size_t directiveEndPosition) const; _NODISCARD bool MatchSwitchDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition) const;
_NODISCARD bool MatchOptionsDirective(const ParserLine& line, size_t directiveStartPosition, size_t directiveEndPosition) const; _NODISCARD bool MatchOptionsDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition) const;
_NODISCARD bool MatchFilenameDirective(const ParserLine& line, size_t directiveStartPosition, size_t directiveEndPosition) const; _NODISCARD bool MatchFilenameDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition) const;
_NODISCARD bool MatchSkipDirective(const ParserLine& line, size_t directiveStartPosition, size_t directiveEndPosition) const; _NODISCARD bool MatchSkipDirective(const ParserLine& line, unsigned directiveStartPosition, unsigned directiveEndPosition) const;
_NODISCARD bool MatchDirectives(const ParserLine& line) const; _NODISCARD bool MatchDirectives(const ParserLine& line) const;
IParserLineStream* const m_stream; IParserLineStream* const m_stream;

View File

@ -2,6 +2,6 @@
int main(const int argc, const char** argv) int main(const int argc, const char** argv)
{ {
auto zoneCodeGenerator = ZoneCodeGenerator::Create(); const ZoneCodeGenerator zoneCodeGenerator;
return zoneCodeGenerator->Run(argc, argv); return zoneCodeGenerator.Run(argc, argv);
} }

View File

@ -2,35 +2,32 @@
#include "Domain/Information/MemberInformation.h" #include "Domain/Information/MemberInformation.h"
#include <vector>
class MemberComputations class MemberComputations
{ {
const MemberInformation* const m_info;
public: public:
explicit MemberComputations(const MemberInformation* member); explicit MemberComputations(const MemberInformation* member);
[[nodiscard]] bool ShouldIgnore() const; _NODISCARD bool ShouldIgnore() const;
[[nodiscard]] bool ContainsNonEmbeddedReference() const; _NODISCARD bool ContainsNonEmbeddedReference() const;
[[nodiscard]] bool ContainsSinglePointerReference() const; _NODISCARD bool ContainsSinglePointerReference() const;
[[nodiscard]] bool ContainsArrayPointerReference() const; _NODISCARD bool ContainsArrayPointerReference() const;
[[nodiscard]] bool ContainsPointerArrayReference() const; _NODISCARD bool ContainsPointerArrayReference() const;
[[nodiscard]] bool ContainsArrayReference() const; _NODISCARD bool ContainsArrayReference() const;
[[nodiscard]] const IEvaluation* GetArrayPointerCountEvaluation() const; _NODISCARD const IEvaluation* GetArrayPointerCountEvaluation() const;
[[nodiscard]] bool IsArray() const; _NODISCARD bool IsArray() const;
[[nodiscard]] std::vector<int> GetArraySizes() const; _NODISCARD std::vector<int> GetArraySizes() const;
[[nodiscard]] int GetArrayDimension() const; _NODISCARD int GetArrayDimension() const;
[[nodiscard]] bool IsPointerToArray() const; _NODISCARD bool IsPointerToArray() const;
[[nodiscard]] std::vector<int> GetPointerToArraySizes() const; _NODISCARD std::vector<int> GetPointerToArraySizes() const;
[[nodiscard]] int GetPointerDepth() const; _NODISCARD int GetPointerDepth() const;
[[nodiscard]] bool IsNotInDefaultNormalBlock() const; _NODISCARD bool IsNotInDefaultNormalBlock() const;
[[nodiscard]] bool IsInTempBlock() const; _NODISCARD bool IsInTempBlock() const;
[[nodiscard]] bool IsInRuntimeBlock() const; _NODISCARD bool IsInRuntimeBlock() const;
[[nodiscard]] bool IsFirstMember() const; _NODISCARD bool IsFirstMember() const;
[[nodiscard]] bool IsLastMember() const; _NODISCARD bool IsLastMember() const;
[[nodiscard]] bool HasDynamicArraySize() const; _NODISCARD bool HasDynamicArraySize() const;
[[nodiscard]] bool IsDynamicMember() const; _NODISCARD bool IsDynamicMember() const;
[[nodiscard]] bool IsAfterPartialLoad() const; _NODISCARD bool IsAfterPartialLoad() const;
private:
const MemberInformation* const m_info;
}; };

View File

@ -2,36 +2,34 @@
#include "Domain/Evaluation/IEvaluation.h" #include "Domain/Evaluation/IEvaluation.h"
#include "Domain/Information/MemberInformation.h" #include "Domain/Information/MemberInformation.h"
#include "Utils/ClassUtils.h"
#include <vector>
class DeclarationModifierComputations class DeclarationModifierComputations
{ {
public:
explicit DeclarationModifierComputations(const MemberInformation* member);
[[nodiscard]] DeclarationModifier* GetDeclarationModifier() const;
[[nodiscard]] DeclarationModifier* GetNextDeclarationModifier() const;
[[nodiscard]] std::vector<DeclarationModifier*> GetFollowingDeclarationModifiers() const;
[[nodiscard]] std::vector<int> GetArrayIndices() const;
[[nodiscard]] bool IsArray() const;
[[nodiscard]] int GetArraySize() const;
[[nodiscard]] bool HasDynamicArrayCount() const;
[[nodiscard]] const IEvaluation* GetDynamicArrayCountEvaluation() const;
[[nodiscard]] std::vector<DeclarationModifierComputations> GetArrayEntries() const;
[[nodiscard]] bool IsSinglePointer() const;
[[nodiscard]] bool IsArrayPointer() const;
[[nodiscard]] const IEvaluation* GetArrayPointerCountEvaluation() const;
[[nodiscard]] bool IsPointerArray() const;
[[nodiscard]] const IEvaluation* GetPointerArrayCountEvaluation() const;
[[nodiscard]] bool IsDynamicArray() const;
[[nodiscard]] const IEvaluation* GetDynamicArraySizeEvaluation() const;
[[nodiscard]] unsigned GetAlignment() const;
private:
DeclarationModifierComputations(const MemberInformation* member, std::vector<int> modifierIndices);
const MemberInformation* const m_information; const MemberInformation* const m_information;
std::vector<int> m_modifier_indices; std::vector<int> m_modifier_indices;
int m_combined_index; int m_combined_index;
DeclarationModifierComputations(const MemberInformation* member, std::vector<int> modifierIndices);
public:
explicit DeclarationModifierComputations(const MemberInformation* member);
_NODISCARD DeclarationModifier* GetDeclarationModifier() const;
_NODISCARD DeclarationModifier* GetNextDeclarationModifier() const;
_NODISCARD std::vector<DeclarationModifier*> GetFollowingDeclarationModifiers() const;
_NODISCARD std::vector<int> GetArrayIndices() const;
_NODISCARD bool IsArray() const;
_NODISCARD int GetArraySize() const;
_NODISCARD bool HasDynamicArrayCount() const;
_NODISCARD const IEvaluation* GetDynamicArrayCountEvaluation() const;
_NODISCARD std::vector<DeclarationModifierComputations> GetArrayEntries() const;
_NODISCARD bool IsSinglePointer() const;
_NODISCARD bool IsArrayPointer() const;
_NODISCARD const IEvaluation* GetArrayPointerCountEvaluation() const;
_NODISCARD bool IsPointerArray() const;
_NODISCARD const IEvaluation* GetPointerArrayCountEvaluation() const;
_NODISCARD bool IsDynamicArray() const;
_NODISCARD const IEvaluation* GetDynamicArraySizeEvaluation() const;
_NODISCARD unsigned GetAlignment() const;
}; };

View File

@ -4,13 +4,12 @@
class StructureComputations class StructureComputations
{ {
const StructureInformation* const m_info;
public: public:
explicit StructureComputations(const StructureInformation* structure); explicit StructureComputations(const StructureInformation* structure);
[[nodiscard]] bool IsAsset() const; _NODISCARD bool IsAsset() const;
[[nodiscard]] MemberInformation* GetDynamicMember() const; _NODISCARD MemberInformation* GetDynamicMember() const;
[[nodiscard]] std::vector<MemberInformation*> GetUsedMembers() const; _NODISCARD std::vector<MemberInformation*> GetUsedMembers() const;
private:
const StructureInformation* m_info;
}; };

View File

@ -2,16 +2,13 @@
#include "DeclarationModifier.h" #include "DeclarationModifier.h"
#include "Domain/Evaluation/IEvaluation.h" #include "Domain/Evaluation/IEvaluation.h"
#include "Utils/ClassUtils.h"
#include <memory> #include <memory>
class ArrayDeclarationModifier final : public DeclarationModifier class ArrayDeclarationModifier final : public DeclarationModifier
{ {
public: public:
explicit ArrayDeclarationModifier(int size);
[[nodiscard]] DeclarationModifierType GetType() const override;
int m_size; int m_size;
/** /**
@ -23,4 +20,8 @@ public:
* \brief The array has a size that is given by \c m_size but only a certain dynamic amount is handled by generated count. * \brief The array has a size that is given by \c m_size but only a certain dynamic amount is handled by generated count.
*/ */
std::unique_ptr<IEvaluation> m_dynamic_count_evaluation; std::unique_ptr<IEvaluation> m_dynamic_count_evaluation;
explicit ArrayDeclarationModifier(int size);
_NODISCARD DeclarationModifierType GetType() const override;
}; };

View File

@ -4,6 +4,17 @@
class BaseTypeDefinition final : public DataDefinition class BaseTypeDefinition final : public DataDefinition
{ {
public: public:
const unsigned m_size;
private:
BaseTypeDefinition(std::string name, unsigned size);
public:
_NODISCARD DataDefinitionType GetType() const override;
_NODISCARD unsigned GetAlignment() const override;
_NODISCARD bool GetForceAlignment() const override;
_NODISCARD unsigned GetSize() const override;
static const BaseTypeDefinition* const FLOAT; static const BaseTypeDefinition* const FLOAT;
static const BaseTypeDefinition* const DOUBLE; static const BaseTypeDefinition* const DOUBLE;
static const BaseTypeDefinition* const BOOL; static const BaseTypeDefinition* const BOOL;
@ -21,14 +32,4 @@ public:
static const BaseTypeDefinition* const ALL_BASE_TYPES[]; static const BaseTypeDefinition* const ALL_BASE_TYPES[];
static const size_t ALL_BASE_TYPES_COUNT; static const size_t ALL_BASE_TYPES_COUNT;
[[nodiscard]] DataDefinitionType GetType() const override;
[[nodiscard]] unsigned GetAlignment() const override;
[[nodiscard]] bool GetForceAlignment() const override;
[[nodiscard]] unsigned GetSize() const override;
const unsigned m_size;
private:
BaseTypeDefinition(std::string name, unsigned size);
}; };

View File

@ -25,13 +25,13 @@ public:
DataDefinition& operator=(const DataDefinition& other) = default; DataDefinition& operator=(const DataDefinition& other) = default;
DataDefinition& operator=(DataDefinition&& other) noexcept = default; DataDefinition& operator=(DataDefinition&& other) noexcept = default;
[[nodiscard]] virtual DataDefinitionType GetType() const = 0;
[[nodiscard]] virtual unsigned GetAlignment() const = 0;
[[nodiscard]] virtual bool GetForceAlignment() const = 0;
[[nodiscard]] virtual unsigned GetSize() const = 0;
[[nodiscard]] std::string GetFullName() const;
std::string m_namespace; std::string m_namespace;
std::string m_name; std::string m_name;
_NODISCARD virtual DataDefinitionType GetType() const = 0;
_NODISCARD virtual unsigned GetAlignment() const = 0;
_NODISCARD virtual bool GetForceAlignment() const = 0;
_NODISCARD virtual unsigned GetSize() const = 0;
_NODISCARD std::string GetFullName() const;
}; };

View File

@ -18,5 +18,5 @@ public:
DeclarationModifier& operator=(const DeclarationModifier& other) = default; DeclarationModifier& operator=(const DeclarationModifier& other) = default;
DeclarationModifier& operator=(DeclarationModifier&& other) noexcept = default; DeclarationModifier& operator=(DeclarationModifier&& other) noexcept = default;
[[nodiscard]] virtual DeclarationModifierType GetType() const = 0; _NODISCARD virtual DeclarationModifierType GetType() const = 0;
}; };

View File

@ -14,6 +14,26 @@ DefinitionWithMembers::DefinitionWithMembers(std::string _namespace, std::string
{ {
} }
// void DefinitionWithMembers::CalculateAlignment()
//{
// if (m_has_alignment_override)
// {
// m_flags |= FLAG_ALIGNMENT_FORCED;
// m_alignment = m_alignment_override;
// }
// else
// {
// m_alignment = 0;
// for (const auto& member : m_members)
// {
// const auto memberAlignment = member->GetAlignment();
// if (memberAlignment > m_alignment)
// m_alignment = memberAlignment;
// }
// }
// m_flags |= FLAG_ALIGNMENT_CALCULATED;
// }
unsigned DefinitionWithMembers::GetAlignment() const unsigned DefinitionWithMembers::GetAlignment() const
{ {
assert(m_flags & FLAG_FIELDS_CALCULATED); assert(m_flags & FLAG_FIELDS_CALCULATED);

View File

@ -13,12 +13,6 @@ public:
static constexpr int FLAG_FIELDS_CALCULATING = 1 << 1; static constexpr int FLAG_FIELDS_CALCULATING = 1 << 1;
static constexpr int FLAG_ALIGNMENT_FORCED = 1 << 2; static constexpr int FLAG_ALIGNMENT_FORCED = 1 << 2;
DefinitionWithMembers(std::string _namespace, std::string name, unsigned pack);
[[nodiscard]] unsigned GetAlignment() const override;
[[nodiscard]] bool GetForceAlignment() const override;
[[nodiscard]] unsigned GetSize() const override;
unsigned m_flags; unsigned m_flags;
unsigned m_size; unsigned m_size;
unsigned m_alignment; unsigned m_alignment;
@ -30,4 +24,10 @@ public:
unsigned m_alignment_override; unsigned m_alignment_override;
std::vector<std::shared_ptr<Variable>> m_members; std::vector<std::shared_ptr<Variable>> m_members;
DefinitionWithMembers(std::string _namespace, std::string name, unsigned pack);
_NODISCARD unsigned GetAlignment() const override;
_NODISCARD bool GetForceAlignment() const override;
_NODISCARD unsigned GetSize() const override;
}; };

View File

@ -10,15 +10,15 @@
class EnumDefinition final : public DataDefinition class EnumDefinition final : public DataDefinition
{ {
public: public:
EnumDefinition(std::string _namespace, std::string name, const BaseTypeDefinition* parentType);
[[nodiscard]] DataDefinitionType GetType() const override;
[[nodiscard]] unsigned GetAlignment() const override;
[[nodiscard]] bool GetForceAlignment() const override;
[[nodiscard]] unsigned GetSize() const override;
void AddEnumMember(EnumMember enumMember);
const BaseTypeDefinition* m_parent_type; const BaseTypeDefinition* m_parent_type;
std::vector<std::unique_ptr<EnumMember>> m_members; std::vector<std::unique_ptr<EnumMember>> m_members;
EnumDefinition(std::string _namespace, std::string name, const BaseTypeDefinition* parentType);
_NODISCARD DataDefinitionType GetType() const override;
_NODISCARD unsigned GetAlignment() const override;
_NODISCARD bool GetForceAlignment() const override;
_NODISCARD unsigned GetSize() const override;
void AddEnumMember(EnumMember enumMember);
}; };

View File

@ -5,9 +5,9 @@
class EnumMember class EnumMember
{ {
public: public:
EnumMember();
EnumMember(std::string name, int value);
std::string m_name; std::string m_name;
int m_value; int m_value;
EnumMember();
EnumMember(std::string name, int value);
}; };

View File

@ -5,13 +5,13 @@
class ForwardDeclaration final : public DataDefinition class ForwardDeclaration final : public DataDefinition
{ {
public: public:
ForwardDeclaration(std::string _namespace, std::string name, DataDefinitionType type);
[[nodiscard]] DataDefinitionType GetType() const override;
[[nodiscard]] unsigned GetAlignment() const override;
[[nodiscard]] bool GetForceAlignment() const override;
[[nodiscard]] unsigned GetSize() const override;
const DataDefinitionType m_forwarded_type; const DataDefinitionType m_forwarded_type;
const DataDefinition* m_definition; const DataDefinition* m_definition;
ForwardDeclaration(std::string _namespace, std::string name, DataDefinitionType type);
_NODISCARD DataDefinitionType GetType() const override;
_NODISCARD unsigned GetAlignment() const override;
_NODISCARD bool GetForceAlignment() const override;
_NODISCARD unsigned GetSize() const override;
}; };

View File

@ -8,19 +8,19 @@
class PointerDeclarationModifier final : public DeclarationModifier class PointerDeclarationModifier final : public DeclarationModifier
{ {
static const IEvaluation* const DEFAULT_COUNT;
static bool EvaluationIsArray(const IEvaluation* evaluation);
public: public:
[[nodiscard]] DeclarationModifierType GetType() const override;
[[nodiscard]] const IEvaluation* GetCountEvaluation() const;
[[nodiscard]] const IEvaluation* GetCountEvaluationForArrayIndex(int index);
[[nodiscard]] bool CountEvaluationIsArray() const;
[[nodiscard]] bool CountEvaluationIsArray(int index) const;
[[nodiscard]] bool AnyCountEvaluationIsArray() const;
std::unique_ptr<IEvaluation> m_count_evaluation; std::unique_ptr<IEvaluation> m_count_evaluation;
std::vector<std::unique_ptr<IEvaluation>> m_count_evaluation_by_array_index; std::vector<std::unique_ptr<IEvaluation>> m_count_evaluation_by_array_index;
private: _NODISCARD DeclarationModifierType GetType() const override;
static const IEvaluation* const DEFAULT_COUNT; _NODISCARD const IEvaluation* GetCountEvaluation() const;
static bool EvaluationIsArray(const IEvaluation* evaluation); _NODISCARD const IEvaluation* GetCountEvaluationForArrayIndex(int index);
_NODISCARD bool CountEvaluationIsArray() const;
_NODISCARD bool CountEvaluationIsArray(int index) const;
_NODISCARD bool AnyCountEvaluationIsArray() const;
}; };

View File

@ -7,5 +7,5 @@ class StructDefinition final : public DefinitionWithMembers
public: public:
StructDefinition(std::string _namespace, std::string name, int pack); StructDefinition(std::string _namespace, std::string name, int pack);
[[nodiscard]] DataDefinitionType GetType() const override; _NODISCARD DataDefinitionType GetType() const override;
}; };

View File

@ -13,21 +13,21 @@ public:
static constexpr int FLAG_FIELDS_CALCULATED = 1 << 0; static constexpr int FLAG_FIELDS_CALCULATED = 1 << 0;
static constexpr int FLAG_ALIGNMENT_FORCED = 1 << 1; static constexpr int FLAG_ALIGNMENT_FORCED = 1 << 1;
unsigned m_flags;
unsigned m_size;
unsigned m_alignment;
explicit TypeDeclaration(const DataDefinition* type); explicit TypeDeclaration(const DataDefinition* type);
[[nodiscard]] unsigned GetSize() const;
[[nodiscard]] unsigned GetAlignment() const;
[[nodiscard]] bool GetForceAlignment() const;
std::vector<std::unique_ptr<DeclarationModifier>> m_declaration_modifiers;
bool m_is_const; bool m_is_const;
bool m_has_custom_bit_size; bool m_has_custom_bit_size;
const DataDefinition* m_type; const DataDefinition* m_type;
unsigned m_custom_bit_size; unsigned m_custom_bit_size;
unsigned m_flags; std::vector<std::unique_ptr<DeclarationModifier>> m_declaration_modifiers;
unsigned m_size;
unsigned m_alignment; _NODISCARD unsigned GetSize() const;
_NODISCARD unsigned GetAlignment() const;
_NODISCARD bool GetForceAlignment() const;
}; };

View File

@ -6,14 +6,14 @@
class TypedefDefinition final : public DataDefinition class TypedefDefinition final : public DataDefinition
{ {
public: public:
TypedefDefinition(std::string _namespace, std::string name, std::unique_ptr<TypeDeclaration> typeDeclaration);
[[nodiscard]] DataDefinitionType GetType() const override;
[[nodiscard]] unsigned GetAlignment() const override;
[[nodiscard]] bool GetForceAlignment() const override;
[[nodiscard]] unsigned GetSize() const override;
bool m_has_alignment_override; bool m_has_alignment_override;
unsigned m_alignment_override; unsigned m_alignment_override;
std::unique_ptr<TypeDeclaration> m_type_declaration; std::unique_ptr<TypeDeclaration> m_type_declaration;
TypedefDefinition(std::string _namespace, std::string name, std::unique_ptr<TypeDeclaration> typeDeclaration);
_NODISCARD DataDefinitionType GetType() const override;
_NODISCARD unsigned GetAlignment() const override;
_NODISCARD bool GetForceAlignment() const override;
_NODISCARD unsigned GetSize() const override;
}; };

View File

@ -4,8 +4,11 @@
class UnionDefinition final : public DefinitionWithMembers class UnionDefinition final : public DefinitionWithMembers
{ {
// protected:
// void CalculateSize() override;
public: public:
UnionDefinition(std::string _namespace, std::string name, int pack); UnionDefinition(std::string _namespace, std::string name, int pack);
[[nodiscard]] DataDefinitionType GetType() const override; _NODISCARD DataDefinitionType GetType() const override;
}; };

View File

@ -9,14 +9,14 @@
class Variable class Variable
{ {
public: public:
Variable(std::string name, std::unique_ptr<TypeDeclaration> typeDeclaration);
[[nodiscard]] unsigned GetAlignment() const;
[[nodiscard]] bool GetForceAlignment() const;
std::string m_name; std::string m_name;
bool m_has_alignment_override; bool m_has_alignment_override;
unsigned m_alignment_override; unsigned m_alignment_override;
unsigned m_offset; unsigned m_offset;
std::unique_ptr<TypeDeclaration> m_type_declaration; std::unique_ptr<TypeDeclaration> m_type_declaration;
Variable(std::string name, std::unique_ptr<TypeDeclaration> typeDeclaration);
_NODISCARD unsigned GetAlignment() const;
_NODISCARD bool GetForceAlignment() const;
}; };

View File

@ -1,5 +1,7 @@
#pragma once #pragma once
#include "Utils/ClassUtils.h"
enum class EvaluationType enum class EvaluationType
{ {
OPERAND_DYNAMIC, OPERAND_DYNAMIC,
@ -18,7 +20,7 @@ public:
IEvaluation& operator=(const IEvaluation& other) = default; IEvaluation& operator=(const IEvaluation& other) = default;
IEvaluation& operator=(IEvaluation&& other) noexcept = default; IEvaluation& operator=(IEvaluation&& other) noexcept = default;
[[nodiscard]] virtual EvaluationType GetType() const = 0; _NODISCARD virtual EvaluationType GetType() const = 0;
[[nodiscard]] virtual bool IsStatic() const = 0; _NODISCARD virtual bool IsStatic() const = 0;
[[nodiscard]] virtual int EvaluateNumeric() const = 0; _NODISCARD virtual int EvaluateNumeric() const = 0;
}; };

View File

@ -9,16 +9,16 @@
class OperandDynamic final : public IEvaluation class OperandDynamic final : public IEvaluation
{ {
public: public:
StructureInformation* const m_structure;
std::vector<MemberInformation*> m_referenced_member_chain;
std::vector<std::unique_ptr<IEvaluation>> m_array_indices;
explicit OperandDynamic(StructureInformation* structure); explicit OperandDynamic(StructureInformation* structure);
OperandDynamic(StructureInformation* structure, OperandDynamic(StructureInformation* structure,
std::vector<MemberInformation*> referencedMemberChain, std::vector<MemberInformation*> referencedMemberChain,
std::vector<std::unique_ptr<IEvaluation>> arrayIndices); std::vector<std::unique_ptr<IEvaluation>> arrayIndices);
[[nodiscard]] EvaluationType GetType() const override; _NODISCARD EvaluationType GetType() const override;
[[nodiscard]] bool IsStatic() const override; _NODISCARD bool IsStatic() const override;
[[nodiscard]] int EvaluateNumeric() const override; _NODISCARD int EvaluateNumeric() const override;
StructureInformation* const m_structure;
std::vector<MemberInformation*> m_referenced_member_chain;
std::vector<std::unique_ptr<IEvaluation>> m_array_indices;
}; };

View File

@ -6,13 +6,13 @@
class OperandStatic final : public IEvaluation class OperandStatic final : public IEvaluation
{ {
public: public:
const int m_value;
EnumMember* const m_enum_member;
explicit OperandStatic(int value); explicit OperandStatic(int value);
explicit OperandStatic(EnumMember* enumMember); explicit OperandStatic(EnumMember* enumMember);
[[nodiscard]] EvaluationType GetType() const override; _NODISCARD EvaluationType GetType() const override;
[[nodiscard]] bool IsStatic() const override; _NODISCARD bool IsStatic() const override;
[[nodiscard]] int EvaluateNumeric() const override; _NODISCARD int EvaluateNumeric() const override;
const int m_value;
EnumMember* const m_enum_member;
}; };

View File

@ -9,17 +9,17 @@
class Operation final : public IEvaluation class Operation final : public IEvaluation
{ {
public: public:
explicit Operation(const OperationType* type);
Operation(const OperationType* type, std::unique_ptr<IEvaluation> operand1, std::unique_ptr<IEvaluation> operand2);
[[nodiscard]] EvaluationType GetType() const override;
[[nodiscard]] bool IsStatic() const override;
[[nodiscard]] int EvaluateNumeric() const override;
[[nodiscard]] bool Operand1NeedsParenthesis() const;
[[nodiscard]] bool Operand2NeedsParenthesis() const;
const OperationType* const m_operation_type; const OperationType* const m_operation_type;
std::unique_ptr<IEvaluation> m_operand1; std::unique_ptr<IEvaluation> m_operand1;
std::unique_ptr<IEvaluation> m_operand2; std::unique_ptr<IEvaluation> m_operand2;
explicit Operation(const OperationType* type);
Operation(const OperationType* type, std::unique_ptr<IEvaluation> operand1, std::unique_ptr<IEvaluation> operand2);
_NODISCARD EvaluationType GetType() const override;
_NODISCARD bool IsStatic() const override;
_NODISCARD int EvaluateNumeric() const override;
_NODISCARD bool Operand1NeedsParenthesis() const;
_NODISCARD bool Operand2NeedsParenthesis() const;
}; };

View File

@ -20,6 +20,14 @@ enum class OperationPrecedence
class OperationType class OperationType
{ {
public:
std::string m_syntax;
OperationPrecedence m_precedence;
std::function<int(int operand1, int operand2)> m_evaluation_function;
private:
OperationType(std::string syntax, OperationPrecedence precedence, std::function<int(int, int)> evaluationFunction);
public: public:
static const OperationType* const OPERATION_ADD; static const OperationType* const OPERATION_ADD;
static const OperationType* const OPERATION_SUBTRACT; static const OperationType* const OPERATION_SUBTRACT;
@ -41,11 +49,4 @@ public:
static const OperationType* const OPERATION_OR; static const OperationType* const OPERATION_OR;
static const OperationType* const ALL_OPERATION_TYPES[]; static const OperationType* const ALL_OPERATION_TYPES[];
std::string m_syntax;
OperationPrecedence m_precedence;
std::function<int(int operand1, int operand2)> m_evaluation_function;
private:
OperationType(std::string syntax, OperationPrecedence precedence, std::function<int(int, int)> evaluationFunction);
}; };

View File

@ -8,8 +8,8 @@
class CustomAction class CustomAction
{ {
public: public:
CustomAction(std::string actionName, std::vector<DataDefinition*> parameterTypes);
std::string m_action_name; std::string m_action_name;
std::vector<DataDefinition*> m_parameter_types; std::vector<DataDefinition*> m_parameter_types;
CustomAction(std::string actionName, std::vector<DataDefinition*> parameterTypes);
}; };

View File

@ -13,10 +13,10 @@ enum class FastFileBlockType
class FastFileBlock class FastFileBlock
{ {
public: public:
FastFileBlock(std::string name, unsigned index, FastFileBlockType type, bool isDefault);
std::string m_name; std::string m_name;
unsigned m_index; unsigned m_index;
FastFileBlockType m_type; FastFileBlockType m_type;
bool m_is_default; bool m_is_default;
FastFileBlock(std::string name, unsigned index, FastFileBlockType type, bool isDefault);
}; };

View File

@ -12,8 +12,6 @@ class StructureInformation;
class MemberInformation class MemberInformation
{ {
public: public:
MemberInformation(StructureInformation* parent, StructureInformation* type, Variable* member);
StructureInformation* m_parent; StructureInformation* m_parent;
StructureInformation* m_type; StructureInformation* m_type;
Variable* m_member; Variable* m_member;
@ -26,4 +24,6 @@ public:
std::unique_ptr<CustomAction> m_post_load_action; std::unique_ptr<CustomAction> m_post_load_action;
const FastFileBlock* m_fast_file_block; const FastFileBlock* m_fast_file_block;
const EnumMember* m_asset_ref; const EnumMember* m_asset_ref;
MemberInformation(StructureInformation* parent, StructureInformation* type, Variable* member);
}; };

View File

@ -5,17 +5,13 @@
#include "Domain/Extension/CustomAction.h" #include "Domain/Extension/CustomAction.h"
#include "Domain/FastFile/FastFileBlock.h" #include "Domain/FastFile/FastFileBlock.h"
#include "MemberInformation.h" #include "MemberInformation.h"
#include "Utils/ClassUtils.h"
#include <memory>
#include <vector>
class MemberInformation; class MemberInformation;
class StructureInformation class StructureInformation
{ {
public: public:
explicit StructureInformation(DefinitionWithMembers* definition);
DefinitionWithMembers* const m_definition; DefinitionWithMembers* const m_definition;
EnumMember* m_asset_enum_entry; EnumMember* m_asset_enum_entry;
@ -35,4 +31,6 @@ public:
std::unique_ptr<CustomAction> m_post_load_action; std::unique_ptr<CustomAction> m_post_load_action;
const FastFileBlock* m_block; const FastFileBlock* m_block;
std::vector<MemberInformation*> m_name_chain; std::vector<MemberInformation*> m_name_chain;
explicit StructureInformation(DefinitionWithMembers* definition);
}; };

View File

@ -3,24 +3,21 @@
#include "ICodeTemplate.h" #include "ICodeTemplate.h"
#include "ZoneCodeGeneratorArguments.h" #include "ZoneCodeGeneratorArguments.h"
#include <memory>
#include <string>
#include <unordered_map> #include <unordered_map>
class CodeGenerator class CodeGenerator
{ {
public: const ZoneCodeGeneratorArguments* m_args;
explicit CodeGenerator(const ZoneCodeGeneratorArguments* args);
bool GenerateCode(IDataRepository* repository); std::unordered_map<std::string, std::unique_ptr<ICodeTemplate>> m_template_mapping;
private:
void SetupTemplates(); void SetupTemplates();
bool GenerateCodeForTemplate(RenderingContext* context, ICodeTemplate* codeTemplate) const; bool GenerateCodeForTemplate(RenderingContext* context, ICodeTemplate* codeTemplate) const;
static bool GetAssetWithName(IDataRepository* repository, const std::string& name, StructureInformation*& asset); static bool GetAssetWithName(IDataRepository* repository, const std::string& name, StructureInformation*& asset);
const ZoneCodeGeneratorArguments* m_args; public:
explicit CodeGenerator(const ZoneCodeGeneratorArguments* args);
std::unordered_map<std::string, std::unique_ptr<ICodeTemplate>> m_template_mapping; bool GenerateCode(IDataRepository* repository);
}; };

View File

@ -10,8 +10,6 @@
class RenderingUsedType class RenderingUsedType
{ {
public: public:
RenderingUsedType(const DataDefinition* type, StructureInformation* info);
bool m_members_loaded; bool m_members_loaded;
const DataDefinition* m_type; const DataDefinition* m_type;
StructureInformation* m_info; StructureInformation* m_info;
@ -22,13 +20,25 @@ public:
bool m_array_reference_exists; bool m_array_reference_exists;
bool m_pointer_array_reference_exists; bool m_pointer_array_reference_exists;
bool m_pointer_array_reference_is_reusable; bool m_pointer_array_reference_is_reusable;
RenderingUsedType(const DataDefinition* type, StructureInformation* info);
}; };
class RenderingContext class RenderingContext
{ {
public: std::unordered_map<const DataDefinition*, std::unique_ptr<RenderingUsedType>> m_used_types_lookup;
static std::unique_ptr<RenderingContext> BuildContext(const IDataRepository* repository, StructureInformation* asset);
RenderingContext(std::string game, std::vector<const FastFileBlock*> fastFileBlocks);
RenderingUsedType* AddUsedType(std::unique_ptr<RenderingUsedType> usedType);
RenderingUsedType* GetBaseType(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType);
void AddMembersToContext(const IDataRepository* repository, StructureInformation* info);
void ScanUsedTypeIfNeeded(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType);
void MakeAsset(const IDataRepository* repository, StructureInformation* asset);
void CreateUsedTypeCollections();
bool UsedTypeHasActions(const RenderingUsedType* usedType) const;
public:
std::string m_game; std::string m_game;
std::vector<const FastFileBlock*> m_blocks; std::vector<const FastFileBlock*> m_blocks;
@ -42,16 +52,5 @@ public:
const FastFileBlock* m_default_normal_block; const FastFileBlock* m_default_normal_block;
const FastFileBlock* m_default_temp_block; const FastFileBlock* m_default_temp_block;
private: static std::unique_ptr<RenderingContext> BuildContext(const IDataRepository* repository, StructureInformation* asset);
RenderingContext(std::string game, std::vector<const FastFileBlock*> fastFileBlocks);
RenderingUsedType* AddUsedType(std::unique_ptr<RenderingUsedType> usedType);
RenderingUsedType* GetBaseType(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType);
void AddMembersToContext(const IDataRepository* repository, StructureInformation* info);
void ScanUsedTypeIfNeeded(const IDataRepository* repository, MemberComputations* computations, RenderingUsedType* usedType);
void MakeAsset(const IDataRepository* repository, StructureInformation* asset);
void CreateUsedTypeCollections();
bool UsedTypeHasActions(const RenderingUsedType* usedType) const;
std::unordered_map<const DataDefinition*, std::unique_ptr<RenderingUsedType>> m_used_types_lookup;
}; };

View File

@ -6,14 +6,34 @@
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
namespace class AssetStructTestsTemplate::Internal final : BaseTemplate
{ {
static constexpr int TAG_SOURCE = 1; void TestMethod(StructureInformation* structure)
{
LINE("TEST_CASE(\"" << m_env.m_game << "::" << m_env.m_asset->m_definition->GetFullName() << ": Tests for " << structure->m_definition->GetFullName()
<< "\", \"[assetstruct]\")")
LINE("{")
m_intendation++;
class Template final : BaseTemplate for (const auto& member : structure->m_ordered_members)
{ {
if (!member->m_member->m_name.empty() && !member->m_member->m_type_declaration->m_has_custom_bit_size)
{
LINE("REQUIRE(offsetof(" << structure->m_definition->GetFullName() << ", " << member->m_member->m_name << ") == " << member->m_member->m_offset
<< ");")
}
}
LINE("")
LINE("REQUIRE(" << structure->m_definition->GetSize() << "u == sizeof(" << structure->m_definition->GetFullName() << "));")
LINE("REQUIRE(" << structure->m_definition->GetAlignment() << "u == alignof(" << structure->m_definition->GetFullName() << "));")
m_intendation--;
LINE("}")
}
public: public:
Template(std::ostream& stream, RenderingContext* context) Internal(std::ostream& stream, RenderingContext* context)
: BaseTemplate(stream, context) : BaseTemplate(stream, context)
{ {
} }
@ -48,33 +68,7 @@ namespace
m_intendation--; m_intendation--;
LINE("}") LINE("}")
} }
private:
void TestMethod(StructureInformation* structure)
{
LINE("TEST_CASE(\"" << m_env.m_game << "::" << m_env.m_asset->m_definition->GetFullName() << ": Tests for "
<< structure->m_definition->GetFullName() << "\", \"[assetstruct]\")")
LINE("{")
m_intendation++;
for (const auto& member : structure->m_ordered_members)
{
if (!member->m_member->m_name.empty() && !member->m_member->m_type_declaration->m_has_custom_bit_size)
{
LINE("REQUIRE(offsetof(" << structure->m_definition->GetFullName() << ", " << member->m_member->m_name
<< ") == " << member->m_member->m_offset << ");")
}
}
LINE("")
LINE("REQUIRE(" << structure->m_definition->GetSize() << "u == sizeof(" << structure->m_definition->GetFullName() << "));")
LINE("REQUIRE(" << structure->m_definition->GetAlignment() << "u == alignof(" << structure->m_definition->GetFullName() << "));")
m_intendation--;
LINE("}")
}
}; };
} // namespace
std::vector<CodeTemplateFile> AssetStructTestsTemplate::GetFilesToRender(RenderingContext* context) std::vector<CodeTemplateFile> AssetStructTestsTemplate::GetFilesToRender(RenderingContext* context)
{ {
@ -95,10 +89,10 @@ std::vector<CodeTemplateFile> AssetStructTestsTemplate::GetFilesToRender(Renderi
void AssetStructTestsTemplate::RenderFile(std::ostream& stream, const int fileTag, RenderingContext* context) void AssetStructTestsTemplate::RenderFile(std::ostream& stream, const int fileTag, RenderingContext* context)
{ {
Template t(stream, context); Internal internal(stream, context);
if (fileTag == TAG_SOURCE) if (fileTag == TAG_SOURCE)
t.Source(); internal.Source();
else else
std::cout << "Invalid tag in AssetStructTestsTemplate\n"; std::cout << "Invalid tag in AssetStructTestsTemplate\n";
} }

View File

@ -3,6 +3,10 @@
class AssetStructTestsTemplate final : public ICodeTemplate class AssetStructTestsTemplate final : public ICodeTemplate
{ {
static constexpr int TAG_SOURCE = 1;
class Internal;
public: public:
std::vector<CodeTemplateFile> GetFilesToRender(RenderingContext* context) override; std::vector<CodeTemplateFile> GetFilesToRender(RenderingContext* context) override;
void RenderFile(std::ostream& stream, int fileTag, RenderingContext* context) override; void RenderFile(std::ostream& stream, int fileTag, RenderingContext* context) override;

View File

@ -15,10 +15,27 @@ class BaseTemplate
protected: protected:
static constexpr const char* INTENDATION = " "; static constexpr const char* INTENDATION = " ";
std::ostream& m_out;
RenderingContext& m_env;
unsigned m_intendation;
BaseTemplate(std::ostream& stream, RenderingContext* context); BaseTemplate(std::ostream& stream, RenderingContext* context);
void DoIntendation() const; void DoIntendation() const;
private:
static void MakeSafeTypeNameInternal(const DataDefinition* def, std::ostringstream& str);
static void MakeTypeVarNameInternal(const DataDefinition* def, std::ostringstream& str);
static void MakeTypeWrittenVarNameInternal(const DataDefinition* def, std::ostringstream& str);
static void MakeTypePtrVarNameInternal(const DataDefinition* def, std::ostringstream& str);
static void MakeTypeWrittenPtrVarNameInternal(const DataDefinition* def, std::ostringstream& str);
static void MakeArrayIndicesInternal(const DeclarationModifierComputations& modifierComputations, std::ostringstream& str);
static void MakeOperandStatic(const OperandStatic* op, std::ostringstream& str);
static void MakeOperandDynamic(const OperandDynamic* op, std::ostringstream& str);
static void MakeOperation(const Operation* operation, std::ostringstream& str);
static void MakeEvaluationInternal(const IEvaluation* evaluation, std::ostringstream& str);
protected:
static std::string Upper(std::string str); static std::string Upper(std::string str);
static std::string Lower(std::string str); static std::string Lower(std::string str);
static std::string MakeTypeVarName(const DataDefinition* def); static std::string MakeTypeVarName(const DataDefinition* def);
@ -38,22 +55,6 @@ protected:
static std::string MakeCustomActionCall(CustomAction* action); static std::string MakeCustomActionCall(CustomAction* action);
static std::string MakeArrayCount(const ArrayDeclarationModifier* arrayModifier); static std::string MakeArrayCount(const ArrayDeclarationModifier* arrayModifier);
static std::string MakeEvaluation(const IEvaluation* evaluation); static std::string MakeEvaluation(const IEvaluation* evaluation);
std::ostream& m_out;
RenderingContext& m_env;
unsigned m_intendation;
private:
static void MakeSafeTypeNameInternal(const DataDefinition* def, std::ostringstream& str);
static void MakeTypeVarNameInternal(const DataDefinition* def, std::ostringstream& str);
static void MakeTypeWrittenVarNameInternal(const DataDefinition* def, std::ostringstream& str);
static void MakeTypePtrVarNameInternal(const DataDefinition* def, std::ostringstream& str);
static void MakeTypeWrittenPtrVarNameInternal(const DataDefinition* def, std::ostringstream& str);
static void MakeArrayIndicesInternal(const DeclarationModifierComputations& modifierComputations, std::ostringstream& str);
static void MakeOperandStatic(const OperandStatic* op, std::ostringstream& str);
static void MakeOperandDynamic(const OperandDynamic* op, std::ostringstream& str);
static void MakeOperation(const Operation* operation, std::ostringstream& str);
static void MakeEvaluationInternal(const IEvaluation* evaluation, std::ostringstream& str);
}; };
#define LINE(x) \ #define LINE(x) \

View File

@ -8,175 +8,8 @@
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
namespace class ZoneLoadTemplate::Internal final : BaseTemplate
{ {
static constexpr int TAG_HEADER = 1;
static constexpr int TAG_SOURCE = 2;
class Template final : BaseTemplate
{
public:
Template(std::ostream& stream, RenderingContext* context)
: BaseTemplate(stream, context)
{
}
void Header()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify. ")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
LINE("#pragma once")
LINE("")
LINE("#include \"Loading/AssetLoader.h\"")
LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"")
if (m_env.m_has_actions)
{
LINE("#include \"Game/" << m_env.m_game << "/XAssets/" << Lower(m_env.m_asset->m_definition->m_name) << "/"
<< Lower(m_env.m_asset->m_definition->m_name) << "_actions.h\"")
}
LINE("#include <string>")
LINE("")
LINE("namespace " << m_env.m_game)
LINE("{")
m_intendation++;
LINE("class " << LoaderClassName(m_env.m_asset) << " final : public AssetLoader")
LINE("{")
m_intendation++;
LINE("XAssetInfo<" << m_env.m_asset->m_definition->GetFullName() << ">* m_asset_info;")
if (m_env.m_has_actions)
{
LINE("Actions_" << m_env.m_asset->m_definition->m_name << " m_actions;")
}
LINE(VariableDecl(m_env.m_asset->m_definition))
LINE(PointerVariableDecl(m_env.m_asset->m_definition))
LINE("")
// Variable Declarations: type varType;
for (auto* type : m_env.m_used_types)
{
if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
LINE(VariableDecl(type->m_type))
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists && !type->m_is_context_asset)
{
LINE(PointerVariableDecl(type->m_type))
}
}
LINE("")
// Method Declarations
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists)
{
PrintHeaderPtrArrayLoadMethodDeclaration(type->m_type);
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists)
{
PrintHeaderArrayLoadMethodDeclaration(type->m_type);
}
}
for (auto* type : m_env.m_used_structures)
{
if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
PrintHeaderLoadMethodDeclaration(type->m_info);
}
}
PrintHeaderLoadMethodDeclaration(m_env.m_asset);
PrintHeaderTempPtrLoadMethodDeclaration(m_env.m_asset);
PrintHeaderAssetLoadMethodDeclaration(m_env.m_asset);
LINE("")
m_intendation--;
LINE("public:")
m_intendation++;
PrintHeaderConstructor();
PrintHeaderMainLoadMethodDeclaration(m_env.m_asset);
PrintHeaderGetNameMethodDeclaration(m_env.m_asset);
m_intendation--;
LINE("};")
m_intendation--;
LINE("}")
}
void Source()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify. ")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_load_db.h\"")
LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_mark_db.h\"")
LINE("#include <cassert>")
LINE("#include <cstring>")
LINE("")
if (!m_env.m_referenced_assets.empty())
{
LINE("// Referenced Assets:")
for (auto* type : m_env.m_referenced_assets)
{
LINE("#include \"../" << Lower(type->m_type->m_name) << "/" << Lower(type->m_type->m_name) << "_load_db.h\"")
}
LINE("")
}
LINE("using namespace " << m_env.m_game << ";")
LINE("")
PrintConstructorMethod();
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists)
{
LINE("")
PrintLoadPtrArrayMethod(type->m_type, type->m_info, type->m_pointer_array_reference_is_reusable);
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists)
{
LINE("")
PrintLoadArrayMethod(type->m_type, type->m_info);
}
}
for (auto* type : m_env.m_used_structures)
{
if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
LINE("")
PrintLoadMethod(type->m_info);
}
}
LINE("")
PrintLoadMethod(m_env.m_asset);
LINE("")
PrintLoadPtrMethod(m_env.m_asset);
LINE("")
PrintLoadAssetMethod(m_env.m_asset);
LINE("")
PrintMainLoadMethod();
LINE("")
PrintGetNameMethod();
}
private:
enum class MemberLoadType enum class MemberLoadType
{ {
ARRAY_POINTER, ARRAY_POINTER,
@ -504,8 +337,8 @@ namespace
else else
{ {
LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get())
<< MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier)
<< MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") << ", " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");")
} }
} }
@ -561,8 +394,8 @@ namespace
else if (computations.IsAfterPartialLoad()) else if (computations.IsAfterPartialLoad())
{ {
LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get())
<< MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier)
<< MakeMemberAccess(info, member, modifier) << ", " << arraySizeStr << ");") << ", " << arraySizeStr << ");")
} }
} }
@ -577,8 +410,8 @@ namespace
else else
{ {
LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get())
<< MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier)
<< MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") << ", " << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");")
} }
} }
@ -613,8 +446,8 @@ namespace
else if (computations.IsAfterPartialLoad()) else if (computations.IsAfterPartialLoad())
{ {
LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get())
<< MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(&" << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(&" << MakeMemberAccess(info, member, modifier)
<< MakeMemberAccess(info, member, modifier) << ");") << ");")
} }
} }
@ -641,8 +474,8 @@ namespace
else else
{ {
LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) LINE("m_stream->Load<" << MakeTypeDecl(member->m_member->m_type_declaration.get())
<< MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier)
<< MakeMemberAccess(info, member, modifier) << ");") << ");")
} }
} }
@ -722,10 +555,7 @@ namespace
return true; return true;
} }
void LoadMember_Alloc(StructureInformation* info, void LoadMember_Alloc(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberLoadType loadType)
MemberInformation* member,
const DeclarationModifierComputations& modifier,
const MemberLoadType loadType)
{ {
if (!LoadMember_ShouldMakeAlloc(info, member, modifier, loadType)) if (!LoadMember_ShouldMakeAlloc(info, member, modifier, loadType))
{ {
@ -744,8 +574,8 @@ namespace
// This used to use `alignof()` to calculate alignment but due to inconsistencies between compilers and bugs discovered in MSVC // This used to use `alignof()` to calculate alignment but due to inconsistencies between compilers and bugs discovered in MSVC
// (Alignment specified via `__declspec(align())` showing as correct via intellisense but is incorrect when compiled for types that have a larger // (Alignment specified via `__declspec(align())` showing as correct via intellisense but is incorrect when compiled for types that have a larger
// alignment than the specified value) this was changed to make ZoneCodeGenerator calculate what is supposed to be used as alignment when // alignment than the specified value) this was changed to make ZoneCodeGenerator calculate what is supposed to be used as alignment when allocating.
// allocating. This is more reliable when being used with different compilers and the value used can be seen in the source code directly // This is more reliable when being used with different compilers and the value used can be seen in the source code directly
if (member->m_alloc_alignment) if (member->m_alloc_alignment)
{ {
LINE(MakeMemberAccess(info, member, modifier) LINE(MakeMemberAccess(info, member, modifier)
@ -798,10 +628,7 @@ namespace
return true; return true;
} }
void LoadMember_Reuse(StructureInformation* info, void LoadMember_Reuse(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, const MemberLoadType loadType)
MemberInformation* member,
const DeclarationModifierComputations& modifier,
const MemberLoadType loadType)
{ {
if (!LoadMember_ShouldMakeReuse(info, member, modifier, loadType) || !member->m_is_reusable) if (!LoadMember_ShouldMakeReuse(info, member, modifier, loadType) || !member->m_is_reusable)
{ {
@ -812,8 +639,7 @@ namespace
const MemberComputations computations(member); const MemberComputations computations(member);
if (computations.IsInTempBlock()) if (computations.IsInTempBlock())
{ {
LINE("if(" << MakeMemberAccess(info, member, modifier) << " == PTR_FOLLOWING || " << MakeMemberAccess(info, member, modifier) LINE("if(" << MakeMemberAccess(info, member, modifier) << " == PTR_FOLLOWING || " << MakeMemberAccess(info, member, modifier) << " == PTR_INSERT)")
<< " == PTR_INSERT)")
LINE("{") LINE("{")
m_intendation++; m_intendation++;
@ -1161,8 +987,7 @@ namespace
if (inTemp) if (inTemp)
{ {
LINE("if(*" << MakeTypePtrVarName(info->m_definition) << " == PTR_FOLLOWING || *" << MakeTypePtrVarName(info->m_definition) LINE("if(*" << MakeTypePtrVarName(info->m_definition) << " == PTR_FOLLOWING || *" << MakeTypePtrVarName(info->m_definition) << " == PTR_INSERT)")
<< " == PTR_INSERT)")
} }
else else
{ {
@ -1343,8 +1168,168 @@ namespace
m_intendation--; m_intendation--;
LINE("}") LINE("}")
} }
public:
Internal(std::ostream& stream, RenderingContext* context)
: BaseTemplate(stream, context)
{
}
void Header()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify. ")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
LINE("#pragma once")
LINE("")
LINE("#include \"Loading/AssetLoader.h\"")
LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"")
if (m_env.m_has_actions)
{
LINE("#include \"Game/" << m_env.m_game << "/XAssets/" << Lower(m_env.m_asset->m_definition->m_name) << "/"
<< Lower(m_env.m_asset->m_definition->m_name) << "_actions.h\"")
}
LINE("#include <string>")
LINE("")
LINE("namespace " << m_env.m_game)
LINE("{")
m_intendation++;
LINE("class " << LoaderClassName(m_env.m_asset) << " final : public AssetLoader")
LINE("{")
m_intendation++;
LINE("XAssetInfo<" << m_env.m_asset->m_definition->GetFullName() << ">* m_asset_info;")
if (m_env.m_has_actions)
{
LINE("Actions_" << m_env.m_asset->m_definition->m_name << " m_actions;")
}
LINE(VariableDecl(m_env.m_asset->m_definition))
LINE(PointerVariableDecl(m_env.m_asset->m_definition))
LINE("")
// Variable Declarations: type varType;
for (auto* type : m_env.m_used_types)
{
if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
LINE(VariableDecl(type->m_type))
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists && !type->m_is_context_asset)
{
LINE(PointerVariableDecl(type->m_type))
}
}
LINE("")
// Method Declarations
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists)
{
PrintHeaderPtrArrayLoadMethodDeclaration(type->m_type);
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists)
{
PrintHeaderArrayLoadMethodDeclaration(type->m_type);
}
}
for (auto* type : m_env.m_used_structures)
{
if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
PrintHeaderLoadMethodDeclaration(type->m_info);
}
}
PrintHeaderLoadMethodDeclaration(m_env.m_asset);
PrintHeaderTempPtrLoadMethodDeclaration(m_env.m_asset);
PrintHeaderAssetLoadMethodDeclaration(m_env.m_asset);
LINE("")
m_intendation--;
LINE("public:")
m_intendation++;
PrintHeaderConstructor();
PrintHeaderMainLoadMethodDeclaration(m_env.m_asset);
PrintHeaderGetNameMethodDeclaration(m_env.m_asset);
m_intendation--;
LINE("};")
m_intendation--;
LINE("}")
}
void Source()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify. ")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_load_db.h\"")
LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_mark_db.h\"")
LINE("#include <cassert>")
LINE("#include <cstring>")
LINE("")
if (!m_env.m_referenced_assets.empty())
{
LINE("// Referenced Assets:")
for (auto* type : m_env.m_referenced_assets)
{
LINE("#include \"../" << Lower(type->m_type->m_name) << "/" << Lower(type->m_type->m_name) << "_load_db.h\"")
}
LINE("")
}
LINE("using namespace " << m_env.m_game << ";")
LINE("")
PrintConstructorMethod();
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists)
{
LINE("")
PrintLoadPtrArrayMethod(type->m_type, type->m_info, type->m_pointer_array_reference_is_reusable);
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists)
{
LINE("")
PrintLoadArrayMethod(type->m_type, type->m_info);
}
}
for (auto* type : m_env.m_used_structures)
{
if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
LINE("")
PrintLoadMethod(type->m_info);
}
}
LINE("")
PrintLoadMethod(m_env.m_asset);
LINE("")
PrintLoadPtrMethod(m_env.m_asset);
LINE("")
PrintLoadAssetMethod(m_env.m_asset);
LINE("")
PrintMainLoadMethod();
LINE("")
PrintGetNameMethod();
}
}; };
} // namespace
std::vector<CodeTemplateFile> ZoneLoadTemplate::GetFilesToRender(RenderingContext* context) std::vector<CodeTemplateFile> ZoneLoadTemplate::GetFilesToRender(RenderingContext* context)
{ {
@ -1371,15 +1356,18 @@ std::vector<CodeTemplateFile> ZoneLoadTemplate::GetFilesToRender(RenderingContex
void ZoneLoadTemplate::RenderFile(std::ostream& stream, const int fileTag, RenderingContext* context) void ZoneLoadTemplate::RenderFile(std::ostream& stream, const int fileTag, RenderingContext* context)
{ {
Template t(stream, context); Internal internal(stream, context);
if (fileTag == TAG_HEADER) if (fileTag == TAG_HEADER)
{ {
t.Header(); internal.Header();
}
else if (fileTag == TAG_SOURCE)
{
internal.Source();
} }
else else
{ {
assert(fileTag == TAG_SOURCE); std::cout << "Unknown tag for ZoneLoadTemplate: " << fileTag << "\n";
t.Source();
} }
} }

View File

@ -3,6 +3,11 @@
class ZoneLoadTemplate final : public ICodeTemplate class ZoneLoadTemplate final : public ICodeTemplate
{ {
static constexpr int TAG_HEADER = 1;
static constexpr int TAG_SOURCE = 2;
class Internal;
public: public:
std::vector<CodeTemplateFile> GetFilesToRender(RenderingContext* context) override; std::vector<CodeTemplateFile> GetFilesToRender(RenderingContext* context) override;
void RenderFile(std::ostream& stream, int fileTag, RenderingContext* context) override; void RenderFile(std::ostream& stream, int fileTag, RenderingContext* context) override;

View File

@ -9,165 +9,8 @@
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
namespace class ZoneMarkTemplate::Internal final : BaseTemplate
{ {
static constexpr int TAG_HEADER = 1;
static constexpr int TAG_SOURCE = 2;
class Template final : BaseTemplate
{
public:
Template(std::ostream& stream, RenderingContext* context)
: BaseTemplate(stream, context)
{
}
void Header()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify. ")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
LINE("#pragma once")
LINE("")
LINE("#include \"Loading/AssetMarker.h\"")
LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"")
LINE("#include <string>")
LINE("")
LINE("namespace " << m_env.m_game)
LINE("{")
m_intendation++;
LINE("class " << MarkerClassName(m_env.m_asset) << " final : public AssetMarker")
LINE("{")
m_intendation++;
LINE(VariableDecl(m_env.m_asset->m_definition))
LINE(PointerVariableDecl(m_env.m_asset->m_definition))
LINE("")
m_intendation--;
LINE("public:")
m_intendation++;
// Variable Declarations: type varType;
for (auto* type : m_env.m_used_types)
{
if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
LINE(VariableDecl(type->m_type))
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists && !type->m_is_context_asset)
{
LINE(PointerVariableDecl(type->m_type))
}
}
LINE("")
// Method Declarations
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists && type->m_info->m_requires_marking)
{
PrintHeaderPtrArrayMarkMethodDeclaration(type->m_type);
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_info->m_requires_marking
&& type->m_non_runtime_reference_exists)
{
PrintHeaderArrayMarkMethodDeclaration(type->m_type);
}
}
for (const auto* type : m_env.m_used_structures)
{
if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && type->m_info->m_requires_marking
&& !StructureComputations(type->m_info).IsAsset())
{
PrintHeaderMarkMethodDeclaration(type->m_info);
}
}
PrintHeaderMarkMethodDeclaration(m_env.m_asset);
LINE("")
PrintHeaderGetNameMethodDeclaration(m_env.m_asset);
PrintHeaderGetAssetInfoMethodDeclaration(m_env.m_asset);
LINE("")
PrintHeaderConstructor();
PrintHeaderMainMarkMethodDeclaration(m_env.m_asset);
m_intendation--;
LINE("};")
m_intendation--;
LINE("}")
}
void Source()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify. ")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_mark_db.h\"")
LINE("#include <cassert>")
LINE("")
if (!m_env.m_referenced_assets.empty())
{
LINE("// Referenced Assets:")
for (const auto* type : m_env.m_referenced_assets)
{
LINE("#include \"../" << Lower(type->m_type->m_name) << "/" << Lower(type->m_type->m_name) << "_mark_db.h\"")
}
LINE("")
}
LINE("using namespace " << m_env.m_game << ";")
LINE("")
PrintConstructorMethod();
for (const auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists && type->m_info->m_requires_marking)
{
LINE("")
PrintMarkPtrArrayMethod(type->m_type, type->m_info, type->m_pointer_array_reference_is_reusable);
}
}
for (const auto* type : m_env.m_used_types)
{
if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_info->m_requires_marking
&& type->m_non_runtime_reference_exists)
{
LINE("")
PrintMarkArrayMethod(type->m_type, type->m_info);
}
}
for (const auto* type : m_env.m_used_structures)
{
if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && type->m_info->m_requires_marking
&& !StructureComputations(type->m_info).IsAsset())
{
LINE("")
PrintMarkMethod(type->m_info);
}
}
LINE("")
PrintMarkMethod(m_env.m_asset);
LINE("")
PrintMainMarkMethod();
LINE("")
PrintGetNameMethod();
PrintGetAssetInfoMethod();
}
private:
enum class MemberLoadType enum class MemberLoadType
{ {
ARRAY_POINTER, ARRAY_POINTER,
@ -434,8 +277,8 @@ namespace
void MarkMember_ArrayPointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const void MarkMember_ArrayPointer(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const
{ {
LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";")
LINE("MarkArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" LINE("MarkArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" << MakeEvaluation(modifier.GetArrayPointerCountEvaluation())
<< MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") << ");")
} }
void MarkMember_PointerArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const void MarkMember_PointerArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const
@ -469,8 +312,8 @@ namespace
void MarkMember_DynamicArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const void MarkMember_DynamicArray(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const
{ {
LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";")
LINE("MarkArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" LINE("MarkArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(" << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation())
<< MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") << ");")
} }
void MarkMember_Embedded(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const void MarkMember_Embedded(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier) const
@ -820,8 +663,158 @@ namespace
m_intendation--; m_intendation--;
LINE("}") LINE("}")
} }
public:
Internal(std::ostream& stream, RenderingContext* context)
: BaseTemplate(stream, context)
{
}
void Header()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify. ")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
LINE("#pragma once")
LINE("")
LINE("#include \"Loading/AssetMarker.h\"")
LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"")
LINE("#include <string>")
LINE("")
LINE("namespace " << m_env.m_game)
LINE("{")
m_intendation++;
LINE("class " << MarkerClassName(m_env.m_asset) << " final : public AssetMarker")
LINE("{")
m_intendation++;
LINE(VariableDecl(m_env.m_asset->m_definition))
LINE(PointerVariableDecl(m_env.m_asset->m_definition))
LINE("")
m_intendation--;
LINE("public:")
m_intendation++;
// Variable Declarations: type varType;
for (auto* type : m_env.m_used_types)
{
if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
LINE(VariableDecl(type->m_type))
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists && !type->m_is_context_asset)
{
LINE(PointerVariableDecl(type->m_type))
}
}
LINE("")
// Method Declarations
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists && type->m_info->m_requires_marking)
{
PrintHeaderPtrArrayMarkMethodDeclaration(type->m_type);
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_info->m_requires_marking
&& type->m_non_runtime_reference_exists)
{
PrintHeaderArrayMarkMethodDeclaration(type->m_type);
}
}
for (const auto* type : m_env.m_used_structures)
{
if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && type->m_info->m_requires_marking
&& !StructureComputations(type->m_info).IsAsset())
{
PrintHeaderMarkMethodDeclaration(type->m_info);
}
}
PrintHeaderMarkMethodDeclaration(m_env.m_asset);
LINE("")
PrintHeaderGetNameMethodDeclaration(m_env.m_asset);
PrintHeaderGetAssetInfoMethodDeclaration(m_env.m_asset);
LINE("")
PrintHeaderConstructor();
PrintHeaderMainMarkMethodDeclaration(m_env.m_asset);
m_intendation--;
LINE("};")
m_intendation--;
LINE("}")
}
void Source()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify. ")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_mark_db.h\"")
LINE("#include <cassert>")
LINE("")
if (!m_env.m_referenced_assets.empty())
{
LINE("// Referenced Assets:")
for (const auto* type : m_env.m_referenced_assets)
{
LINE("#include \"../" << Lower(type->m_type->m_name) << "/" << Lower(type->m_type->m_name) << "_mark_db.h\"")
}
LINE("")
}
LINE("using namespace " << m_env.m_game << ";")
LINE("")
PrintConstructorMethod();
for (const auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists && type->m_info->m_requires_marking)
{
LINE("")
PrintMarkPtrArrayMethod(type->m_type, type->m_info, type->m_pointer_array_reference_is_reusable);
}
}
for (const auto* type : m_env.m_used_types)
{
if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_info->m_requires_marking
&& type->m_non_runtime_reference_exists)
{
LINE("")
PrintMarkArrayMethod(type->m_type, type->m_info);
}
}
for (const auto* type : m_env.m_used_structures)
{
if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && type->m_info->m_requires_marking
&& !StructureComputations(type->m_info).IsAsset())
{
LINE("")
PrintMarkMethod(type->m_info);
}
}
LINE("")
PrintMarkMethod(m_env.m_asset);
LINE("")
PrintMainMarkMethod();
LINE("")
PrintGetNameMethod();
PrintGetAssetInfoMethod();
}
}; };
} // namespace
std::vector<CodeTemplateFile> ZoneMarkTemplate::GetFilesToRender(RenderingContext* context) std::vector<CodeTemplateFile> ZoneMarkTemplate::GetFilesToRender(RenderingContext* context)
{ {
@ -847,15 +840,18 @@ std::vector<CodeTemplateFile> ZoneMarkTemplate::GetFilesToRender(RenderingContex
void ZoneMarkTemplate::RenderFile(std::ostream& stream, const int fileTag, RenderingContext* context) void ZoneMarkTemplate::RenderFile(std::ostream& stream, const int fileTag, RenderingContext* context)
{ {
Template t(stream, context); Internal internal(stream, context);
if (fileTag == TAG_HEADER) if (fileTag == TAG_HEADER)
{ {
t.Header(); internal.Header();
}
else if (fileTag == TAG_SOURCE)
{
internal.Source();
} }
else else
{ {
assert(fileTag == TAG_SOURCE); std::cout << "Unknown tag for ZoneMarkTemplate: " << fileTag << "\n";
t.Source();
} }
} }

View File

@ -3,6 +3,11 @@
class ZoneMarkTemplate final : public ICodeTemplate class ZoneMarkTemplate final : public ICodeTemplate
{ {
static constexpr int TAG_HEADER = 1;
static constexpr int TAG_SOURCE = 2;
class Internal;
public: public:
std::vector<CodeTemplateFile> GetFilesToRender(RenderingContext* context) override; std::vector<CodeTemplateFile> GetFilesToRender(RenderingContext* context) override;
void RenderFile(std::ostream& stream, int fileTag, RenderingContext* context) override; void RenderFile(std::ostream& stream, int fileTag, RenderingContext* context) override;

View File

@ -8,164 +8,8 @@
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
namespace class ZoneWriteTemplate::Internal final : BaseTemplate
{ {
static constexpr int TAG_HEADER = 1;
static constexpr int TAG_SOURCE = 2;
class Template final : BaseTemplate
{
public:
Template(std::ostream& stream, RenderingContext* context)
: BaseTemplate(stream, context)
{
}
void Header()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify. ")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
LINE("#pragma once")
LINE("")
LINE("#include \"Writing/AssetWriter.h\"")
LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"")
LINE("#include <string>")
LINE("")
LINE("namespace " << m_env.m_game)
LINE("{")
m_intendation++;
LINE("class " << WriterClassName(m_env.m_asset) << " final : public AssetWriter")
LINE("{")
m_intendation++;
LINE(VariableDecl(m_env.m_asset->m_definition))
LINE(WrittenVariableDecl(m_env.m_asset->m_definition))
LINE(PointerVariableDecl(m_env.m_asset->m_definition))
LINE(WrittenPointerVariableDecl(m_env.m_asset->m_definition))
LINE("")
// Variable Declarations: type varType;
for (auto* type : m_env.m_used_types)
{
if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
LINE(VariableDecl(type->m_type))
LINE(WrittenVariableDecl(type->m_type))
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists && !type->m_is_context_asset)
{
LINE(PointerVariableDecl(type->m_type))
LINE(WrittenPointerVariableDecl(type->m_type))
}
}
LINE("")
// Method Declarations
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists)
{
PrintHeaderPtrArrayWriteMethodDeclaration(type->m_type);
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists)
{
PrintHeaderArrayWriteMethodDeclaration(type->m_type);
}
}
for (auto* type : m_env.m_used_structures)
{
if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
PrintHeaderWriteMethodDeclaration(type->m_info);
}
}
PrintHeaderWriteMethodDeclaration(m_env.m_asset);
PrintHeaderTempPtrWriteMethodDeclaration(m_env.m_asset);
LINE("")
m_intendation--;
LINE("public:")
m_intendation++;
PrintHeaderConstructor();
PrintHeaderMainWriteMethodDeclaration(m_env.m_asset);
PrintHeaderGetNameMethodDeclaration(m_env.m_asset);
m_intendation--;
LINE("};")
m_intendation--;
LINE("}")
}
void Source()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify. ")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_write_db.h\"")
LINE("#include <cassert>")
LINE("")
if (!m_env.m_referenced_assets.empty())
{
LINE("// Referenced Assets:")
for (auto* type : m_env.m_referenced_assets)
{
LINE("#include \"../" << Lower(type->m_type->m_name) << "/" << Lower(type->m_type->m_name) << "_write_db.h\"")
}
LINE("")
}
LINE("using namespace " << m_env.m_game << ";")
LINE("")
PrintConstructorMethod();
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists)
{
LINE("")
PrintWritePtrArrayMethod(type->m_type, type->m_info, type->m_pointer_array_reference_is_reusable);
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists)
{
LINE("")
PrintWriteArrayMethod(type->m_type, type->m_info);
}
}
for (auto* type : m_env.m_used_structures)
{
if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
LINE("")
PrintWriteMethod(type->m_info);
}
}
LINE("")
PrintWriteMethod(m_env.m_asset);
LINE("")
PrintWritePtrMethod(m_env.m_asset);
LINE("")
PrintMainWriteMethod();
LINE("")
PrintGetNameMethod();
}
private:
enum class MemberWriteType : std::uint8_t enum class MemberWriteType : std::uint8_t
{ {
ARRAY_POINTER, ARRAY_POINTER,
@ -243,8 +87,7 @@ namespace
void PrintHeaderConstructor() const void PrintHeaderConstructor() const
{ {
LINE(WriterClassName(m_env.m_asset) << "(" << m_env.m_asset->m_definition->GetFullName() LINE(WriterClassName(m_env.m_asset) << "(" << m_env.m_asset->m_definition->GetFullName() << "* asset, const Zone& zone, IZoneOutputStream& stream);")
<< "* asset, const Zone& zone, IZoneOutputStream& stream);")
} }
void PrintVariableInitialization(const DataDefinition* def) const void PrintVariableInitialization(const DataDefinition* def) const
@ -407,9 +250,8 @@ namespace
else else
{ {
LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get())
<< MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier)
<< MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ", " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");")
<< ");")
} }
} }
@ -449,16 +291,15 @@ namespace
else else
{ {
LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";") LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeMemberAccess(info, member, modifier) << ";")
LINE(MakeTypeWrittenVarName(member->m_member->m_type_declaration->m_type) LINE(MakeTypeWrittenVarName(member->m_member->m_type_declaration->m_type) << " = " << MakeWrittenMemberAccess(info, member, modifier) << ";")
<< " = " << MakeWrittenMemberAccess(info, member, modifier) << ";")
LINE("WriteArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false, " << arraySizeStr << ");") LINE("WriteArray_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false, " << arraySizeStr << ");")
} }
} }
else if (computations.IsAfterPartialLoad()) else if (computations.IsAfterPartialLoad())
{ {
LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get())
<< MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier)
<< MakeMemberAccess(info, member, modifier) << ", " << arraySizeStr << ");") << ", " << arraySizeStr << ");")
} }
} }
@ -473,8 +314,8 @@ namespace
else else
{ {
LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get())
<< MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier)
<< MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");") << ", " << MakeEvaluation(modifier.GetDynamicArraySizeEvaluation()) << ");")
} }
} }
@ -492,16 +333,15 @@ namespace
else else
{ {
LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeMemberAccess(info, member, modifier) << ";") LINE(MakeTypeVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeMemberAccess(info, member, modifier) << ";")
LINE(MakeTypeWrittenVarName(member->m_member->m_type_declaration->m_type) LINE(MakeTypeWrittenVarName(member->m_member->m_type_declaration->m_type) << " = &" << MakeWrittenMemberAccess(info, member, modifier) << ";")
<< " = &" << MakeWrittenMemberAccess(info, member, modifier) << ";")
LINE("Write_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false);") LINE("Write_" << MakeSafeTypeName(member->m_member->m_type_declaration->m_type) << "(false);")
} }
} }
else if (computations.IsAfterPartialLoad()) else if (computations.IsAfterPartialLoad())
{ {
LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get())
<< MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(&" << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(&" << MakeMemberAccess(info, member, modifier)
<< MakeMemberAccess(info, member, modifier) << ");") << ");")
} }
} }
@ -517,8 +357,8 @@ namespace
else else
{ {
LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get()) LINE("m_stream->Write<" << MakeTypeDecl(member->m_member->m_type_declaration.get())
<< MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeFollowingReferences(modifier.GetFollowingDeclarationModifiers()) << ">(" << MakeMemberAccess(info, member, modifier)
<< MakeMemberAccess(info, member, modifier) << ");") << ");")
} }
} }
@ -621,8 +461,8 @@ namespace
if (writeType == MemberWriteType::ARRAY_POINTER) if (writeType == MemberWriteType::ARRAY_POINTER)
{ {
LINE("m_stream->ReusableAddOffset(" << MakeMemberAccess(info, member, modifier) << ", " LINE("m_stream->ReusableAddOffset(" << MakeMemberAccess(info, member, modifier) << ", " << MakeEvaluation(modifier.GetArrayPointerCountEvaluation())
<< MakeEvaluation(modifier.GetArrayPointerCountEvaluation()) << ");") << ");")
} }
else if (writeType == MemberWriteType::POINTER_ARRAY) else if (writeType == MemberWriteType::POINTER_ARRAY)
{ {
@ -784,8 +624,7 @@ namespace
} }
} }
void void WriteMember_Block(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, MemberWriteType writeType)
WriteMember_Block(StructureInformation* info, MemberInformation* member, const DeclarationModifierComputations& modifier, MemberWriteType writeType)
{ {
const MemberComputations computations(member); const MemberComputations computations(member);
@ -1265,8 +1104,157 @@ namespace
m_intendation--; m_intendation--;
LINE("}") LINE("}")
} }
public:
Internal(std::ostream& stream, RenderingContext* context)
: BaseTemplate(stream, context)
{
}
void Header()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify. ")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
LINE("#pragma once")
LINE("")
LINE("#include \"Writing/AssetWriter.h\"")
LINE("#include \"Game/" << m_env.m_game << "/" << m_env.m_game << ".h\"")
LINE("#include <string>")
LINE("")
LINE("namespace " << m_env.m_game)
LINE("{")
m_intendation++;
LINE("class " << WriterClassName(m_env.m_asset) << " final : public AssetWriter")
LINE("{")
m_intendation++;
LINE(VariableDecl(m_env.m_asset->m_definition))
LINE(WrittenVariableDecl(m_env.m_asset->m_definition))
LINE(PointerVariableDecl(m_env.m_asset->m_definition))
LINE(WrittenPointerVariableDecl(m_env.m_asset->m_definition))
LINE("")
// Variable Declarations: type varType;
for (auto* type : m_env.m_used_types)
{
if (type->m_info && !type->m_info->m_definition->m_anonymous && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
LINE(VariableDecl(type->m_type))
LINE(WrittenVariableDecl(type->m_type))
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists && !type->m_is_context_asset)
{
LINE(PointerVariableDecl(type->m_type))
LINE(WrittenPointerVariableDecl(type->m_type))
}
}
LINE("")
// Method Declarations
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists)
{
PrintHeaderPtrArrayWriteMethodDeclaration(type->m_type);
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists)
{
PrintHeaderArrayWriteMethodDeclaration(type->m_type);
}
}
for (auto* type : m_env.m_used_structures)
{
if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
PrintHeaderWriteMethodDeclaration(type->m_info);
}
}
PrintHeaderWriteMethodDeclaration(m_env.m_asset);
PrintHeaderTempPtrWriteMethodDeclaration(m_env.m_asset);
LINE("")
m_intendation--;
LINE("public:")
m_intendation++;
PrintHeaderConstructor();
PrintHeaderMainWriteMethodDeclaration(m_env.m_asset);
PrintHeaderGetNameMethodDeclaration(m_env.m_asset);
m_intendation--;
LINE("};")
m_intendation--;
LINE("}")
}
void Source()
{
LINE("// ====================================================================")
LINE("// This file has been generated by ZoneCodeGenerator.")
LINE("// Do not modify. ")
LINE("// Any changes will be discarded when regenerating.")
LINE("// ====================================================================")
LINE("")
LINE("#include \"" << Lower(m_env.m_asset->m_definition->m_name) << "_write_db.h\"")
LINE("#include <cassert>")
LINE("")
if (!m_env.m_referenced_assets.empty())
{
LINE("// Referenced Assets:")
for (auto* type : m_env.m_referenced_assets)
{
LINE("#include \"../" << Lower(type->m_type->m_name) << "/" << Lower(type->m_type->m_name) << "_write_db.h\"")
}
LINE("")
}
LINE("using namespace " << m_env.m_game << ";")
LINE("")
PrintConstructorMethod();
for (auto* type : m_env.m_used_types)
{
if (type->m_pointer_array_reference_exists)
{
LINE("")
PrintWritePtrArrayMethod(type->m_type, type->m_info, type->m_pointer_array_reference_is_reusable);
}
}
for (auto* type : m_env.m_used_types)
{
if (type->m_array_reference_exists && type->m_info && !type->m_info->m_is_leaf && type->m_non_runtime_reference_exists)
{
LINE("")
PrintWriteArrayMethod(type->m_type, type->m_info);
}
}
for (auto* type : m_env.m_used_structures)
{
if (type->m_non_runtime_reference_exists && !type->m_info->m_is_leaf && !StructureComputations(type->m_info).IsAsset())
{
LINE("")
PrintWriteMethod(type->m_info);
}
}
LINE("")
PrintWriteMethod(m_env.m_asset);
LINE("")
PrintWritePtrMethod(m_env.m_asset);
LINE("")
PrintMainWriteMethod();
LINE("")
PrintGetNameMethod();
}
}; };
} // namespace
std::vector<CodeTemplateFile> ZoneWriteTemplate::GetFilesToRender(RenderingContext* context) std::vector<CodeTemplateFile> ZoneWriteTemplate::GetFilesToRender(RenderingContext* context)
{ {
@ -1293,15 +1281,18 @@ std::vector<CodeTemplateFile> ZoneWriteTemplate::GetFilesToRender(RenderingConte
void ZoneWriteTemplate::RenderFile(std::ostream& stream, const int fileTag, RenderingContext* context) void ZoneWriteTemplate::RenderFile(std::ostream& stream, const int fileTag, RenderingContext* context)
{ {
Template t(stream, context); Internal internal(stream, context);
if (fileTag == TAG_HEADER) if (fileTag == TAG_HEADER)
{ {
t.Header(); internal.Header();
}
else if (fileTag == TAG_SOURCE)
{
internal.Source();
} }
else else
{ {
assert(fileTag == TAG_SOURCE); std::cout << "Unknown tag for ZoneWriteTemplate: " << fileTag << "\n";
t.Source();
} }
} }

View File

@ -3,6 +3,11 @@
class ZoneWriteTemplate final : public ICodeTemplate class ZoneWriteTemplate final : public ICodeTemplate
{ {
static constexpr int TAG_HEADER = 1;
static constexpr int TAG_SOURCE = 2;
class Internal;
public: public:
std::vector<CodeTemplateFile> GetFilesToRender(RenderingContext* context) override; std::vector<CodeTemplateFile> GetFilesToRender(RenderingContext* context) override;
void RenderFile(std::ostream& stream, int fileTag, RenderingContext* context) override; void RenderFile(std::ostream& stream, int fileTag, RenderingContext* context) override;

View File

@ -17,12 +17,6 @@
#include <chrono> #include <chrono>
#include <iostream> #include <iostream>
namespace
{
static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_NAME = "__zonecodegenerator";
static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_VALUE = "1";
} // namespace
CommandsFileReader::CommandsFileReader(const ZoneCodeGeneratorArguments* args, std::string filename) CommandsFileReader::CommandsFileReader(const ZoneCodeGeneratorArguments* args, std::string filename)
: m_args(args), : m_args(args),
m_filename(std::move(filename)), m_filename(std::move(filename)),
@ -36,7 +30,7 @@ bool CommandsFileReader::OpenBaseStream()
auto stream = std::make_unique<ParserFilesystemStream>(m_filename); auto stream = std::make_unique<ParserFilesystemStream>(m_filename);
if (!stream->IsOpen()) if (!stream->IsOpen())
{ {
std::cerr << "Could not open commands file\n"; std::cout << "Could not open commands file\n";
return false; return false;
} }
@ -74,7 +68,7 @@ bool CommandsFileReader::ReadCommandsFile(IDataRepository* repository)
{ {
if (m_args->m_verbose) if (m_args->m_verbose)
{ {
std::cout << std::format("Reading commands file: {}\n", m_filename); std::cout << "Reading commands file: " << m_filename << "\n";
} }
if (!OpenBaseStream()) if (!OpenBaseStream())
@ -90,7 +84,9 @@ bool CommandsFileReader::ReadCommandsFile(IDataRepository* repository)
const auto end = std::chrono::steady_clock::now(); const auto end = std::chrono::steady_clock::now();
if (m_args->m_verbose) if (m_args->m_verbose)
std::cout << std::format("Processing commands took {}ms\n", std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count()); {
std::cout << "Processing commands took " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms\n";
}
if (!result) if (!result)
return false; return false;

View File

@ -9,15 +9,8 @@
class CommandsFileReader class CommandsFileReader
{ {
public: static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_NAME = "__zonecodegenerator";
CommandsFileReader(const ZoneCodeGeneratorArguments* args, std::string filename); static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_VALUE = "1";
bool ReadCommandsFile(IDataRepository* repository);
private:
bool OpenBaseStream();
void SetupStreamProxies();
void SetupPostProcessors();
const ZoneCodeGeneratorArguments* m_args; const ZoneCodeGeneratorArguments* m_args;
std::string m_filename; std::string m_filename;
@ -26,4 +19,13 @@ private:
IParserLineStream* m_stream; IParserLineStream* m_stream;
std::vector<std::unique_ptr<IPostProcessor>> m_post_processors; std::vector<std::unique_ptr<IPostProcessor>> m_post_processors;
bool OpenBaseStream();
void SetupStreamProxies();
void SetupPostProcessors();
public:
explicit CommandsFileReader(const ZoneCodeGeneratorArguments* args, std::string filename);
bool ReadCommandsFile(IDataRepository* repository);
}; };

View File

@ -5,9 +5,9 @@
class CommandsLexer final : public AbstractLexer<CommandsParserValue> class CommandsLexer final : public AbstractLexer<CommandsParserValue>
{ {
public:
explicit CommandsLexer(IParserLineStream* stream);
protected: protected:
CommandsParserValue GetNextToken() override; CommandsParserValue GetNextToken() override;
public:
explicit CommandsLexer(IParserLineStream* stream);
}; };

View File

@ -8,12 +8,11 @@
class CommandsParser final : public AbstractParser<CommandsParserValue, CommandsParserState> class CommandsParser final : public AbstractParser<CommandsParserValue, CommandsParserState>
{ {
public: IDataRepository* m_repository;
CommandsParser(CommandsLexer* lexer, IDataRepository* targetRepository);
protected: protected:
const std::vector<sequence_t*>& GetTestsForState() override; const std::vector<sequence_t*>& GetTestsForState() override;
private: public:
IDataRepository* m_repository; CommandsParser(CommandsLexer* lexer, IDataRepository* targetRepository);
}; };

View File

@ -1,28 +1,16 @@
#pragma once #pragma once
#include "Persistence/IDataRepository.h" #include "Persistence/IDataRepository.h"
#include "Utils/ClassUtils.h"
#include <memory> #include <memory>
#include <string> #include <string>
class CommandsParserState class CommandsParserState
{ {
public: IDataRepository* m_repository;
explicit CommandsParserState(IDataRepository* repository); StructureInformation* m_in_use;
[[nodiscard]] const IDataRepository* GetRepository() const;
void AddBlock(std::unique_ptr<FastFileBlock> block) const;
void SetArchitecture(Architecture architecture) const;
void SetGame(std::string gameName) const;
[[nodiscard]] StructureInformation* GetInUse() const;
void SetInUse(StructureInformation* structure);
bool GetMembersFromTypename(const std::string& typeNameValue, StructureInformation* baseType, std::vector<MemberInformation*>& members) const;
bool GetTypenameAndMembersFromTypename(const std::string& typeNameValue, StructureInformation*& structure, std::vector<MemberInformation*>& members) const;
private:
static MemberInformation* GetMemberWithName(const std::string& memberName, StructureInformation* type); static MemberInformation* GetMemberWithName(const std::string& memberName, StructureInformation* type);
static bool GetNextTypenameSeparatorPos(const std::string& typeNameValue, unsigned startPos, unsigned& separatorPos); static bool GetNextTypenameSeparatorPos(const std::string& typeNameValue, unsigned startPos, unsigned& separatorPos);
static bool ExtractMembersFromTypenameInternal(const std::string& typeNameValue, static bool ExtractMembersFromTypenameInternal(const std::string& typeNameValue,
@ -30,6 +18,18 @@ private:
StructureInformation* type, StructureInformation* type,
std::vector<MemberInformation*>& members); std::vector<MemberInformation*>& members);
IDataRepository* m_repository; public:
StructureInformation* m_in_use; explicit CommandsParserState(IDataRepository* repository);
_NODISCARD const IDataRepository* GetRepository() const;
void AddBlock(std::unique_ptr<FastFileBlock> block) const;
void SetArchitecture(Architecture architecture) const;
void SetGame(std::string gameName) const;
_NODISCARD StructureInformation* GetInUse() const;
void SetInUse(StructureInformation* structure);
bool GetMembersFromTypename(const std::string& typeNameValue, StructureInformation* baseType, std::vector<MemberInformation*>& members) const;
bool GetTypenameAndMembersFromTypename(const std::string& typeNameValue, StructureInformation*& structure, std::vector<MemberInformation*>& members) const;
}; };

View File

@ -52,6 +52,10 @@ enum class CommandsParserValueType
class CommandsParserValue final : public IParserValue class CommandsParserValue final : public IParserValue
{ {
public: public:
TokenPos m_pos;
CommandsParserValueType m_type;
size_t m_hash;
union ValueType union ValueType
{ {
char char_value; char char_value;
@ -79,28 +83,25 @@ public:
static CommandsParserValue TypeName(TokenPos pos, std::string* typeName); static CommandsParserValue TypeName(TokenPos pos, std::string* typeName);
static CommandsParserValue OpType(TokenPos pos, const OperationType* operationType); static CommandsParserValue OpType(TokenPos pos, const OperationType* operationType);
CommandsParserValue(const CommandsParserValue& other) = delete; private:
CommandsParserValue(TokenPos pos, CommandsParserValueType type);
public:
~CommandsParserValue() override; ~CommandsParserValue() override;
CommandsParserValue(const CommandsParserValue& other) = delete;
CommandsParserValue(CommandsParserValue&& other) noexcept; CommandsParserValue(CommandsParserValue&& other) noexcept;
CommandsParserValue& operator=(const CommandsParserValue& other) = delete; CommandsParserValue& operator=(const CommandsParserValue& other) = delete;
CommandsParserValue& operator=(CommandsParserValue&& other) noexcept; CommandsParserValue& operator=(CommandsParserValue&& other) noexcept;
[[nodiscard]] bool IsEof() const override; _NODISCARD bool IsEof() const override;
[[nodiscard]] const TokenPos& GetPos() const override; _NODISCARD const TokenPos& GetPos() const override;
[[nodiscard]] char CharacterValue() const; _NODISCARD char CharacterValue() const;
[[nodiscard]] int IntegerValue() const; _NODISCARD int IntegerValue() const;
[[nodiscard]] double FloatingPointValue() const; _NODISCARD double FloatingPointValue() const;
[[nodiscard]] std::string& StringValue() const; _NODISCARD std::string& StringValue() const;
[[nodiscard]] std::string& IdentifierValue() const; _NODISCARD std::string& IdentifierValue() const;
[[nodiscard]] size_t IdentifierHash() const; _NODISCARD size_t IdentifierHash() const;
[[nodiscard]] std::string& TypeNameValue() const; _NODISCARD std::string& TypeNameValue() const;
[[nodiscard]] const OperationType* OpTypeValue() const; _NODISCARD const OperationType* OpTypeValue() const;
TokenPos m_pos;
CommandsParserValueType m_type;
size_t m_hash;
private:
CommandsParserValue(TokenPos pos, CommandsParserValueType type);
}; };

View File

@ -5,12 +5,11 @@
class CommandsMatcherCharacter final : public AbstractMatcher<CommandsParserValue> class CommandsMatcherCharacter final : public AbstractMatcher<CommandsParserValue>
{ {
public: char m_char;
explicit CommandsMatcherCharacter(char c);
protected: protected:
MatcherResult<CommandsParserValue> CanMatch(ILexer<CommandsParserValue>* lexer, unsigned tokenOffset) override; MatcherResult<CommandsParserValue> CanMatch(ILexer<CommandsParserValue>* lexer, unsigned tokenOffset) override;
private: public:
char m_char; explicit CommandsMatcherCharacter(char c);
}; };

View File

@ -10,10 +10,10 @@ class CommandsMatcherFactory final : public AbstractMatcherFactory<CommandsParse
public: public:
explicit CommandsMatcherFactory(const IMatcherForLabelSupplier<CommandsParserValue>* labelSupplier); explicit CommandsMatcherFactory(const IMatcherForLabelSupplier<CommandsParserValue>* labelSupplier);
[[nodiscard]] MatcherFactoryWrapper<CommandsParserValue> Type(CommandsParserValueType type) const; _NODISCARD MatcherFactoryWrapper<CommandsParserValue> Type(CommandsParserValueType type) const;
[[nodiscard]] MatcherFactoryWrapper<CommandsParserValue> Keyword(std::string value) const; _NODISCARD MatcherFactoryWrapper<CommandsParserValue> Keyword(std::string value) const;
[[nodiscard]] MatcherFactoryWrapper<CommandsParserValue> Identifier() const; _NODISCARD MatcherFactoryWrapper<CommandsParserValue> Identifier() const;
[[nodiscard]] MatcherFactoryWrapper<CommandsParserValue> Integer() const; _NODISCARD MatcherFactoryWrapper<CommandsParserValue> Integer() const;
[[nodiscard]] MatcherFactoryWrapper<CommandsParserValue> FloatingPoint() const; _NODISCARD MatcherFactoryWrapper<CommandsParserValue> FloatingPoint() const;
[[nodiscard]] MatcherFactoryWrapper<CommandsParserValue> Char(char c) const; _NODISCARD MatcherFactoryWrapper<CommandsParserValue> Char(char c) const;
}; };

View File

@ -7,13 +7,12 @@
class CommandsMatcherKeyword final : public AbstractMatcher<CommandsParserValue> class CommandsMatcherKeyword final : public AbstractMatcher<CommandsParserValue>
{ {
public: size_t m_hash;
explicit CommandsMatcherKeyword(std::string value); std::string m_value;
protected: protected:
MatcherResult<CommandsParserValue> CanMatch(ILexer<CommandsParserValue>* lexer, unsigned tokenOffset) override; MatcherResult<CommandsParserValue> CanMatch(ILexer<CommandsParserValue>* lexer, unsigned tokenOffset) override;
private: public:
size_t m_hash; explicit CommandsMatcherKeyword(std::string value);
std::string m_value;
}; };

View File

@ -5,12 +5,11 @@
class CommandsMatcherValueType final : public AbstractMatcher<CommandsParserValue> class CommandsMatcherValueType final : public AbstractMatcher<CommandsParserValue>
{ {
public: CommandsParserValueType m_type;
explicit CommandsMatcherValueType(CommandsParserValueType type);
protected: protected:
MatcherResult<CommandsParserValue> CanMatch(ILexer<CommandsParserValue>* lexer, unsigned tokenOffset) override; MatcherResult<CommandsParserValue> CanMatch(ILexer<CommandsParserValue>* lexer, unsigned tokenOffset) override;
private: public:
CommandsParserValueType m_type; explicit CommandsMatcherValueType(CommandsParserValueType type);
}; };

View File

@ -3,15 +3,6 @@
#include "Parsing/Commands/Matcher/CommandsCommonMatchers.h" #include "Parsing/Commands/Matcher/CommandsCommonMatchers.h"
#include "Parsing/Commands/Matcher/CommandsMatcherFactory.h" #include "Parsing/Commands/Matcher/CommandsMatcherFactory.h"
namespace
{
static constexpr auto CAPTURE_ACTION_NAME = 1;
static constexpr auto CAPTURE_TYPE = 2;
static constexpr auto CAPTURE_ARG_TYPE = 3;
static constexpr auto LABEL_ACTION_ARGS = 1;
} // namespace
SequenceAction::SequenceAction() SequenceAction::SequenceAction()
{ {
const CommandsMatcherFactory create(this); const CommandsMatcherFactory create(this);

View File

@ -4,9 +4,15 @@
class SequenceAction final : public CommandsParser::sequence_t class SequenceAction final : public CommandsParser::sequence_t
{ {
public: static constexpr auto CAPTURE_ACTION_NAME = 1;
SequenceAction(); static constexpr auto CAPTURE_TYPE = 2;
static constexpr auto CAPTURE_ARG_TYPE = 3;
static constexpr auto LABEL_ACTION_ARGS = 1;
protected: protected:
void ProcessMatch(CommandsParserState* state, SequenceResult<CommandsParserValue>& result) const override; void ProcessMatch(CommandsParserState* state, SequenceResult<CommandsParserValue>& result) const override;
public:
SequenceAction();
}; };

Some files were not shown because too many files have changed in this diff Show More