chore: add system test to make sure reusing global assets is safe

This commit is contained in:
Jan Laupetin committed 2025-12-25 14:58:19 +01:00
1 parent 6711cf0afe
commit 2442d7160c
11 files changed
+725 -2

No files matched your search

+21 -2
View File
@@ -1,12 +1,23 @@
#include "Utils/Logging/Log.h"
#include <catch2/catch_session.hpp>
#include <cstdlib>
#include <filesystem>
#include <format>
#include <iostream>
namespace fs = std::filesystem;
namespace
{
bool ShouldClearTempFolder()
{
auto* envVar = std::getenv("OAT_KEEP_TMP_DIR");
return !envVar || !envVar[0] || (envVar[0] == '0' && !envVar[1]);
}
} // namespace
int main(const int argc, char* argv[])
{
con::init();
@@ -46,8 +57,16 @@ int main(const int argc, char* argv[])
const auto result = Catch::Session().run(argc, argv);
const auto tempDir = expectedBuildDir / ".tmp";
if (fs::is_directory(tempDir))
fs::remove_all(tempDir);
if (ShouldClearTempFolder())
{
con::info("Clearing tmp folder. Define env var OAT_KEEP_TMP_DIR=1 to keep it.");
if (fs::is_directory(tempDir))
fs::remove_all(tempDir);
}
else
{
con::info("Kept tmp dir {} on disk.", tempDir.string());
}
return result;
}
@@ -0,0 +1,6 @@
>game,T6
material,,Suzanne
material,,Suzanne2
xmodel,Suzanne1
xmodel,Suzanne2
@@ -0,0 +1,181 @@
{
"asset": {
"generator": "Khronos glTF Blender I/O v5.0.21",
"version": "2.0"
},
"scene": 0,
"scenes": [
{
"name": "Scene",
"nodes": [4]
}
],
"nodes": [
{
"name": "EarLeft",
"rotation": [
1.5454309831852697e-8, 1.5454309831852697e-8, -0.7071067690849304,
0.7071067690849304
],
"scale": [1, 0.9999999403953552, 1],
"translation": [0, 23.455289840698242, 0]
},
{
"name": "EarRight",
"rotation": [
1.5454309831852697e-8, -1.5454313384566376e-8, 0.7071067690849304,
0.7071067690849304
],
"translation": [0, 23.455289840698242, 0]
},
{
"children": [0, 1],
"name": "Root",
"rotation": [-2.980232594040899e-8, 0, 0, 1],
"scale": [1, 0.9999999403953552, 0.9999999403953552]
},
{
"mesh": 0,
"name": "Suzanne",
"skin": 0
},
{
"children": [3, 2],
"name": "Armature",
"translation": [0, -23.480762481689453, 0]
}
],
"materials": [
{
"doubleSided": true,
"name": "Suzanne",
"pbrMetallicRoughness": {
"baseColorFactor": [
0.800000011920929, 0.800000011920929, 0.800000011920929, 1
],
"metallicFactor": 0,
"roughnessFactor": 0.5
}
}
],
"meshes": [
{
"name": "Suzanne",
"primitives": [
{
"attributes": {
"POSITION": 0,
"NORMAL": 1,
"TEXCOORD_0": 2,
"JOINTS_0": 3,
"WEIGHTS_0": 4
},
"indices": 5,
"material": 0
}
]
}
],
"skins": [
{
"inverseBindMatrices": 6,
"joints": [2, 0, 1],
"name": "Armature"
}
],
"accessors": [
{
"bufferView": 0,
"componentType": 5126,
"count": 2865,
"max": [34.1796875, 24.609375, 21.2890625],
"min": [-34.1796875, -24.609375, -21.2890625],
"type": "VEC3"
},
{
"bufferView": 1,
"componentType": 5126,
"count": 2865,
"type": "VEC3"
},
{
"bufferView": 2,
"componentType": 5126,
"count": 2865,
"type": "VEC2"
},
{
"bufferView": 3,
"componentType": 5121,
"count": 2865,
"type": "VEC4"
},
{
"bufferView": 4,
"componentType": 5126,
"count": 2865,
"type": "VEC4"
},
{
"bufferView": 5,
"componentType": 5123,
"count": 2901,
"type": "SCALAR"
},
{
"bufferView": 6,
"componentType": 5126,
"count": 3,
"type": "MAT4"
}
],
"bufferViews": [
{
"buffer": 0,
"byteLength": 34380,
"byteOffset": 0,
"target": 34962
},
{
"buffer": 0,
"byteLength": 34380,
"byteOffset": 34380,
"target": 34962
},
{
"buffer": 0,
"byteLength": 22920,
"byteOffset": 68760,
"target": 34962
},
{
"buffer": 0,
"byteLength": 11460,
"byteOffset": 91680,
"target": 34962
},
{
"buffer": 0,
"byteLength": 45840,
"byteOffset": 103140,
"target": 34962
},
{
"buffer": 0,
"byteLength": 5802,
"byteOffset": 148980,
"target": 34963
},
{
"buffer": 0,
"byteLength": 192,
"byteOffset": 154784
}
],
"buffers": [
{
"byteLength": 154976,
"uri": "data:application/octet-stream;base64,AAAvQQBAg0AAIJlBAAAvQQBAg0AAIJlBAAAvQQBAg0AAIJlBAAAvQQBAg0AAIJlBAAAvQQBAg0AAIJlBAAAvQQBAg0AAIJlBAAAvwQBAg0AAIJlBAAAvwQBAg0AAIJlBAAAvwQBAg0AAIJlBAAAvwQBAg0AAIJlBAAAvwQBAg0AAIJlBAAAvwQBAg0AAIJlBAABIQQAAFkAAgIlBAABIQQAAFkAAgIlBAABIQQAAFkAAgIlBAABIQQAAFkAAgIlBAABIQQAAFkAAgIlBAABIQQAAFkAAgIlBAABIwQAAFkAAgIlBAABIwQAAFkAAgIlBAABIwQAAFkAAgIlBAABIwQAAFkAAgIlBAABIwQAAFkAAgIlBAABIwQAAFkAAgIlBAMBaQQAArz8AQGdBAMBaQQAArz8AQGdBAMBaQQAArz8AQGdBAMBawQAArz8AQGdBAMBawQAArz8AQGdBAMBawQAArz8AQGdBAKAMQQAAFr8A4HZBAKAMQQAAFr8A4HZBAKAMQQAAFr8A4HZBAKAMwQAAFr8A4HZBAKAMwQAAFr8A4HZBAKAMwQAAFr8A4HZBAKAMQQAASD8AwI9BAKAMQQAASD8AwI9BAKAMQQAASD8AwI9BAKAMQQAASD8AwI9BAKAMQQAASD8AwI9BAKAMQQAASD8AwI9BAKAMwQAASD8AwI9BAKAMwQAASD8AwI9BAKAMwQAASD8AwI9BAKAMwQAASD8AwI9BAKAMwQAASD8AwI9BAKAMwQAASD8AwI9BAKAMQQCAVEAAQJxBAKAMQQCAVEAAQJxBAKAMQQCAVEAAQJxBAKAMQQCAVEAAQJxBAKAMQQCAVEAAQJxBAKAMQQCAVEAAQJxBAKAMwQCAVEAAQJxBAKAMwQCAVEAAQJxBAKAMwQCAVEAAQJxBAKAMwQCAVEAAQJxBAKAMwQCAVEAAQJxBAKAMwQCAVEAAQJxBAMDaQABAg0AAYJ9BAMDaQABAg0AAYJ9BAMDaQABAg0AAYJ9BAMDaQABAg0AAYJ9BAMDaQABAg0AAYJ9BAMDawABAg0AAYJ9BAMDawABAg0AAYJ9BAMDawABAg0AAYJ9BAMDawABAg0AAYJ9BAMDawABAg0AAYJ9BAICiQAAAFkAAcJRBAICiQAAAFkAAcJRBAICiQAAAFkAAcJRBAICiQAAAFkAAcJRBAICiQAAAFkAAcJRBAICiQAAAFkAAcJRBAICiwAAAFkAAcJRBAICiwAAAFkAAcJRBAICiwAAAFkAAcJRBAICiwAAAFkAAcJRBAICiwAAAFkAAcJRBAICiwAAAFkAAcJRBAAB6QAAArz8AsIFBAAB6QAAArz8AsIFBAAB6QAAArz8AsIFBAAB6QAAArz8AsIFBAAB6wAAArz8AsIFBAAB6wAAArz8AsIFBAAB6wAAArz8AsIFBAAB6wAAArz8AsIFBAAD6PwDAwUAAQINBAAD6PwDAwUAAQINBAAD6PwDAwUAAQINBAAD6vwDAwUAAQINBAAD6vwDAwUAAQINBAAD6vwDAwUAAQINBAABhQADAwUAAcJRBAABhQADAwUAAcJRBAABhQADAwUAAcJRBAABhQADAwUAAcJRBAABhQADAwUAAcJRBAABhwADAwUAAcJRBAABhwADAwUAAcJRBAABhwADAwUAAcJRBAABhwADAwUAAcJRBAABhwADAwUAAcJRBAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDaQABAA0EAYJ9BAMDaQABAA0EAYJ9BAMDaQABAA0EAYJ9BAMDaQABAA0EAYJ9BAMDaQABAA0EAYJ9BAMDawABAA0EAYJ9BAMDawABAA0EAYJ9BAMDawABAA0EAYJ9BAMDawABAA0EAYJ9BAMDawABAA0EAYJ9BAICiQABAHEEAcJRBAICiQABAHEEAcJRBAICiQABAHEEAcJRBAICiQABAHEEAcJRBAICiQABAHEEAcJRBAICiQABAHEEAcJRBAICiQABAHEEAcJRBAICiwABAHEEAcJRBAICiwABAHEEAcJRBAICiwABAHEEAcJRBAICiwABAHEEAcJRBAICiwABAHEEAcJRBAICiwABAHEEAcJRBAICiwABAHEEAcJRBAAB6QAAAL0EAsIFBAAB6QAAAL0EAsIFBAAB6QAAAL0EAsIFBAAB6wAAAL0EAsIFBAAB6wAAAL0EAsIFBAAB6wAAAL0EAsIFBAKAMQQBATkEA4HZBAKAMQQBATkEA4HZBAKAMQQBATkEA4HZBAKAMwQBATkEA4HZBAKAMwQBATkEA4HZBAKAMwQBATkEA4HZBAKAMQQBANUEAwI9BAKAMQQBANUEAwI9BAKAMQQBANUEAwI9BAKAMQQBANUEAwI9BAKAMQQBANUEAwI9BAKAMQQBANUEAwI9BAKAMwQBANUEAwI9BAKAMwQBANUEAwI9BAKAMwQBANUEAwI9BAKAMwQBANUEAwI9BAKAMwQBANUEAwI9BAKAMwQBANUEAwI9BAKAMQQDAD0EAQJxBAKAMQQDAD0EAQJxBAKAMQQDAD0EAQJxBAKAMQQDAD0EAQJxBAKAMQQDAD0EAQJxBAKAMQQDAD0EAQJxBAKAMwQDAD0EAQJxBAKAMwQDAD0EAQJxBAKAMwQDAD0EAQJxBAKAMwQDAD0EAQJxBAKAMwQDAD0EAQJxBAKAMwQDAD0EAQJxBAAAvQQBAA0EAIJlBAAAvQQBAA0EAIJlBAAAvQQBAA0EAIJlBAAAvQQBAA0EAIJlBAAAvQQBAA0EAIJlBAAAvQQBAA0EAIJlBAAAvwQBAA0EAIJlBAAAvwQBAA0EAIJlBAAAvwQBAA0EAIJlBAAAvwQBAA0EAIJlBAAAvwQBAA0EAIJlBAAAvwQBAA0EAIJlBAABIQQBAHEEAgIlBAABIQQBAHEEAgIlBAABIQQBAHEEAgIlBAABIQQBAHEEAgIlBAABIQQBAHEEAgIlBAABIQQBAHEEAgIlBAABIwQBAHEEAgIlBAABIwQBAHEEAgIlBAABIwQBAHEEAgIlBAABIwQBAHEEAgIlBAABIwQBAHEEAgIlBAABIwQBAHEEAgIlBAMBaQQAAL0EAQGdBAMBaQQAAL0EAQGdBAMBaQQAAL0EAQGdBAMBawQAAL0EAQGdBAMBawQAAL0EAQGdBAMBawQAAL0EAQGdBAAB6QQDAwUAAAGFBAAB6QQDAwUAAAGFBAAB6wQDAwUAAAGFBAAB6wQDAwUAAAGFBAABhQQDAwUAAYIZBAABhQQDAwUAAYIZBAABhQQDAwUAAYIZBAABhQQDAwUAAYIZBAABhQQDAwUAAYIZBAABhQQDAwUAAYIZBAABhwQDAwUAAYIZBAABhwQDAwUAAYIZBAABhwQDAwUAAYIZBAABhwQDAwUAAYIZBAABhwQDAwUAAYIZBAABhwQDAwUAAYIZBAIA7QQDAwUAAkJdBAIA7QQDAwUAAkJdBAIA7QQDAwUAAkJdBAIA7QQDAwUAAkJdBAIA7QQDAwUAAkJdBAIA7QQDAwUAAkJdBAIA7wQDAwUAAkJdBAIA7wQDAwUAAkJdBAIA7wQDAwUAAkJdBAIA7wQDAwUAAkJdBAIA7wQDAwUAAkJdBAIA7wQDAwUAAkJdBAKA+QQDAwUAAsJpBAKA+QQDAwUAAsJpBAKA+QQDAwUAAsJpBAKA+QQDAwUAAsJpBAKA+QQDAwUAAsJpBAKA+QQDAwUAAsJpBAKA+wQDAwUAAsJpBAKA+wQDAwUAAsJpBAKA+wQDAwUAAsJpBAKA+wQDAwUAAsJpBAKA+wQDAwUAAsJpBAKA+wQDAwUAAsJpBACAyQQBgBkEAQJxBACAyQQBgBkEAQJxBACAyQQBgBkEAQJxBACAyQQBgBkEAQJxBACAyQQBgBkEAQJxBACAywQBgBkEAQJxBACAywQBgBkEAQJxBACAywQBgBkEAQJxBACAywQBgBkEAQJxBACAywQBgBkEAQJxBAKAMQQAAFkEA8KBBAKAMQQAAFkEA8KBBAKAMQQAAFkEA8KBBAKAMQQAAFkEA8KBBAKAMQQAAFkEA8KBBAKAMwQAAFkEA8KBBAKAMwQAAFkEA8KBBAKAMwQAAFkEA8KBBAKAMwQAAFkEA8KBBAKAMwQAAFkEA8KBBAIDUQABgBkEAEKRBAIDUQABgBkEAEKRBAIDUQABgBkEAEKRBAIDUQABgBkEAEKRBAIDUQABgBkEAEKRBAIDUwABgBkEAEKRBAIDUwABgBkEAEKRBAIDUwABgBkEAEKRBAIDUwABgBkEAEKRBAIDUwABgBkEAEKRBAEC1QADAwUAAEKRBAEC1QADAwUAAEKRBAEC1QADAwUAAEKRBAEC1QADAwUAAEKRBAEC1wADAwUAAEKRBAEC1wADAwUAAEKRBAEC1wADAwUAAEKRBAEC1wADAwUAAEKRBAIDUQAAAekAAEKRBAIDUQAAAekAAEKRBAIDUQAAAekAAEKRBAIDUQAAAekAAEKRBAIDUQAAAekAAEKRBAIDUwAAAekAAEKRBAIDUwAAAekAAEKRBAIDUwAAAekAAEKRBAIDUwAAAekAAEKRBAIDUwAAAekAAEKRBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMwQDAwUAAoKVBAKAMLine truncated
}
]
}
@@ -0,0 +1,181 @@
{
"asset": {
"generator": "Khronos glTF Blender I/O v5.0.21",
"version": "2.0"
},
"scene": 0,
"scenes": [
{
"name": "Scene",
"nodes": [4]
}
],
"nodes": [
{
"name": "EarLeft2",
"rotation": [
1.5454309831852697e-8, 1.5454309831852697e-8, -0.7071067690849304,
0.7071067690849304
],
"scale": [1, 0.9999999403953552, 1],
"translation": [0, 23.455289840698242, 0]
},
{
"name": "EarRight2",
"rotation": [
1.5454309831852697e-8, -1.5454313384566376e-8, 0.7071067690849304,
0.7071067690849304
],
"translation": [0, 23.455289840698242, 0]
},
{
"children": [0, 1],
"name": "Root2",
"rotation": [-2.980232594040899e-8, 0, 0, 1],
"scale": [1, 0.9999999403953552, 0.9999999403953552]
},
{
"mesh": 0,
"name": "Suzanne",
"skin": 0
},
{
"children": [3, 2],
"name": "Armature",
"translation": [0, -23.480762481689453, 0]
}
],
"materials": [
{
"doubleSided": true,
"name": "Suzanne2",
"pbrMetallicRoughness": {
"baseColorFactor": [
0.800000011920929, 0.800000011920929, 0.800000011920929, 1
],
"metallicFactor": 0,
"roughnessFactor": 0.5
}
}
],
"meshes": [
{
"name": "Suzanne",
"primitives": [
{
"attributes": {
"POSITION": 0,
"NORMAL": 1,
"TEXCOORD_0": 2,
"JOINTS_0": 3,
"WEIGHTS_0": 4
},
"indices": 5,
"material": 0
}
]
}
],
"skins": [
{
"inverseBindMatrices": 6,
"joints": [2, 0, 1],
"name": "Armature"
}
],
"accessors": [
{
"bufferView": 0,
"componentType": 5126,
"count": 2865,
"max": [34.1796875, 24.609375, 21.2890625],
"min": [-34.1796875, -24.609375, -21.2890625],
"type": "VEC3"
},
{
"bufferView": 1,
"componentType": 5126,
"count": 2865,
"type": "VEC3"
},
{
"bufferView": 2,
"componentType": 5126,
"count": 2865,
"type": "VEC2"
},
{
"bufferView": 3,
"componentType": 5121,
"count": 2865,
"type": "VEC4"
},
{
"bufferView": 4,
"componentType": 5126,
"count": 2865,
"type": "VEC4"
},
{
"bufferView": 5,
"componentType": 5123,
"count": 2901,
"type": "SCALAR"
},
{
"bufferView": 6,
"componentType": 5126,
"count": 3,
"type": "MAT4"
}
],
"bufferViews": [
{
"buffer": 0,
"byteLength": 34380,
"byteOffset": 0,
"target": 34962
},
{
"buffer": 0,
"byteLength": 34380,
"byteOffset": 34380,
"target": 34962
},
{
"buffer": 0,
"byteLength": 22920,
"byteOffset": 68760,
"target": 34962
},
{
"buffer": 0,
"byteLength": 11460,
"byteOffset": 91680,
"target": 34962
},
{
"buffer": 0,
"byteLength": 45840,
"byteOffset": 103140,
"target": 34962
},
{
"buffer": 0,
"byteLength": 5802,
"byteOffset": 148980,
"target": 34963
},
{
"buffer": 0,
"byteLength": 192,
"byteOffset": 154784
}
],
"buffers": [
{
"byteLength": 154976,
"uri": "data:application/octet-stream;base64,AAAvQQBAg0AAIJlBAAAvQQBAg0AAIJlBAAAvQQBAg0AAIJlBAAAvQQBAg0AAIJlBAAAvQQBAg0AAIJlBAAAvQQBAg0AAIJlBAAAvwQBAg0AAIJlBAAAvwQBAg0AAIJlBAAAvwQBAg0AAIJlBAAAvwQBAg0AAIJlBAAAvwQBAg0AAIJlBAAAvwQBAg0AAIJlBAABIQQAAFkAAgIlBAABIQQAAFkAAgIlBAABIQQAAFkAAgIlBAABIQQAAFkAAgIlBAABIQQAAFkAAgIlBAABIQQAAFkAAgIlBAABIwQAAFkAAgIlBAABIwQAAFkAAgIlBAABIwQAAFkAAgIlBAABIwQAAFkAAgIlBAABIwQAAFkAAgIlBAABIwQAAFkAAgIlBAMBaQQAArz8AQGdBAMBaQQAArz8AQGdBAMBaQQAArz8AQGdBAMBawQAArz8AQGdBAMBawQAArz8AQGdBAMBawQAArz8AQGdBAKAMQQAAFr8A4HZBAKAMQQAAFr8A4HZBAKAMQQAAFr8A4HZBAKAMwQAAFr8A4HZBAKAMwQAAFr8A4HZBAKAMwQAAFr8A4HZBAKAMQQAASD8AwI9BAKAMQQAASD8AwI9BAKAMQQAASD8AwI9BAKAMQQAASD8AwI9BAKAMQQAASD8AwI9BAKAMQQAASD8AwI9BAKAMwQAASD8AwI9BAKAMwQAASD8AwI9BAKAMwQAASD8AwI9BAKAMwQAASD8AwI9BAKAMwQAASD8AwI9BAKAMwQAASD8AwI9BAKAMQQCAVEAAQJxBAKAMQQCAVEAAQJxBAKAMQQCAVEAAQJxBAKAMQQCAVEAAQJxBAKAMQQCAVEAAQJxBAKAMQQCAVEAAQJxBAKAMwQCAVEAAQJxBAKAMwQCAVEAAQJxBAKAMwQCAVEAAQJxBAKAMwQCAVEAAQJxBAKAMwQCAVEAAQJxBAKAMwQCAVEAAQJxBAMDaQABAg0AAYJ9BAMDaQABAg0AAYJ9BAMDaQABAg0AAYJ9BAMDaQABAg0AAYJ9BAMDaQABAg0AAYJ9BAMDawABAg0AAYJ9BAMDawABAg0AAYJ9BAMDawABAg0AAYJ9BAMDawABAg0AAYJ9BAMDawABAg0AAYJ9BAICiQAAAFkAAcJRBAICiQAAAFkAAcJRBAICiQAAAFkAAcJRBAICiQAAAFkAAcJRBAICiQAAAFkAAcJRBAICiQAAAFkAAcJRBAICiwAAAFkAAcJRBAICiwAAAFkAAcJRBAICiwAAAFkAAcJRBAICiwAAAFkAAcJRBAICiwAAAFkAAcJRBAICiwAAAFkAAcJRBAAB6QAAArz8AsIFBAAB6QAAArz8AsIFBAAB6QAAArz8AsIFBAAB6QAAArz8AsIFBAAB6wAAArz8AsIFBAAB6wAAArz8AsIFBAAB6wAAArz8AsIFBAAB6wAAArz8AsIFBAAD6PwDAwUAAQINBAAD6PwDAwUAAQINBAAD6PwDAwUAAQINBAAD6vwDAwUAAQINBAAD6vwDAwUAAQINBAAD6vwDAwUAAQINBAABhQADAwUAAcJRBAABhQADAwUAAcJRBAABhQADAwUAAcJRBAABhQADAwUAAcJRBAABhQADAwUAAcJRBAABhwADAwUAAcJRBAABhwADAwUAAcJRBAABhwADAwUAAcJRBAABhwADAwUAAcJRBAABhwADAwUAAcJRBAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBQADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDBwADAwUAAYJ9BAMDaQABAA0EAYJ9BAMDaQABAA0EAYJ9BAMDaQABAA0EAYJ9BAMDaQABAA0EAYJ9BAMDaQABAA0EAYJ9BAMDawABAA0EAYJ9BAMDawABAA0EAYJ9BAMDawABAA0EAYJ9BAMDawABAA0EAYJ9BAMDawABAA0EAYJ9BAICiQABAHEEAcJRBAICiQABAHEEAcJRBAICiQABAHEEAcJRBAICiQABAHEEAcJRBAICiQABAHEEAcJRBAICiQABAHEEAcJRBAICiQABAHEEAcJRBAICiwABAHEEAcJRBAICiwABAHEEAcJRBAICiwABAHEEAcJRBAICiwABAHEEAcJRBAICiwABAHEEAcJRBAICiwABAHEEAcJRBAICiwABAHEEAcJRBAAB6QAAAL0EAsIFBAAB6QAAAL0EAsIFBAAB6QAAAL0EAsIFBAAB6wAAAL0EAsIFBAAB6wAAAL0EAsIFBAAB6wAAAL0EAsIFBAKAMQQBATkEA4HZBAKAMQQBATkEA4HZBAKAMQQBATkEA4HZBAKAMwQBATkEA4HZBAKAMwQBATkEA4HZBAKAMwQBATkEA4HZBAKAMQQBANUEAwI9BAKAMQQBANUEAwI9BAKAMQQBANUEAwI9BAKAMQQBANUEAwI9BAKAMQQBANUEAwI9BAKAMQQBANUEAwI9BAKAMwQBANUEAwI9BAKAMwQBANUEAwI9BAKAMwQBANUEAwI9BAKAMwQBANUEAwI9BAKAMwQBANUEAwI9BAKAMwQBANUEAwI9BAKAMQQDAD0EAQJxBAKAMQQDAD0EAQJxBAKAMQQDAD0EAQJxBAKAMQQDAD0EAQJxBAKAMQQDAD0EAQJxBAKAMQQDAD0EAQJxBAKAMwQDAD0EAQJxBAKAMwQDAD0EAQJxBAKAMwQDAD0EAQJxBAKAMwQDAD0EAQJxBAKAMwQDAD0EAQJxBAKAMwQDAD0EAQJxBAAAvQQBAA0EAIJlBAAAvQQBAA0EAIJlBAAAvQQBAA0EAIJlBAAAvQQBAA0EAIJlBAAAvQQBAA0EAIJlBAAAvQQBAA0EAIJlBAAAvwQBAA0EAIJlBAAAvwQBAA0EAIJlBAAAvwQBAA0EAIJlBAAAvwQBAA0EAIJlBAAAvwQBAA0EAIJlBAAAvwQBAA0EAIJlBAABIQQBAHEEAgIlBAABIQQBAHEEAgIlBAABIQQBAHEEAgIlBAABIQQBAHEEAgIlBAABIQQBAHEEAgIlBAABIQQBAHEEAgIlBAABIwQBAHEEAgIlBAABIwQBAHEEAgIlBAABIwQBAHEEAgIlBAABIwQBAHEEAgIlBAABIwQBAHEEAgIlBAABIwQBAHEEAgIlBAMBaQQAAL0EAQGdBAMBaQQAAL0EAQGdBAMBaQQAAL0EAQGdBAMBawQAAL0EAQGdBAMBawQAAL0EAQGdBAMBawQAAL0EAQGdBAAB6QQDAwUAAAGFBAAB6QQDAwUAAAGFBAAB6wQDAwUAAAGFBAAB6wQDAwUAAAGFBAABhQQDAwUAAYIZBAABhQQDAwUAAYIZBAABhQQDAwUAAYIZBAABhQQDAwUAAYIZBAABhQQDAwUAAYIZBAABhQQDAwUAAYIZBAABhwQDAwUAAYIZBAABhwQDAwUAAYIZBAABhwQDAwUAAYIZBAABhwQDAwUAAYIZBAABhwQDAwUAAYIZBAABhwQDAwUAAYIZBAIA7QQDAwUAAkJdBAIA7QQDAwUAAkJdBAIA7QQDAwUAAkJdBAIA7QQDAwUAAkJdBAIA7QQDAwUAAkJdBAIA7QQDAwUAAkJdBAIA7wQDAwUAAkJdBAIA7wQDAwUAAkJdBAIA7wQDAwUAAkJdBAIA7wQDAwUAAkJdBAIA7wQDAwUAAkJdBAIA7wQDAwUAAkJdBAKA+QQDAwUAAsJpBAKA+QQDAwUAAsJpBAKA+QQDAwUAAsJpBAKA+QQDAwUAAsJpBAKA+QQDAwUAAsJpBAKA+QQDAwUAAsJpBAKA+wQDAwUAAsJpBAKA+wQDAwUAAsJpBAKA+wQDAwUAAsJpBAKA+wQDAwUAAsJpBAKA+wQDAwUAAsJpBAKA+wQDAwUAAsJpBACAyQQBgBkEAQJxBACAyQQBgBkEAQJxBACAyQQBgBkEAQJxBACAyQQBgBkEAQJxBACAyQQBgBkEAQJxBACAywQBgBkEAQJxBACAywQBgBkEAQJxBACAywQBgBkEAQJxBACAywQBgBkEAQJxBACAywQBgBkEAQJxBAKAMQQAAFkEA8KBBAKAMQQAAFkEA8KBBAKAMQQAAFkEA8KBBAKAMQQAAFkEA8KBBAKAMQQAAFkEA8KBBAKAMwQAAFkEA8KBBAKAMwQAAFkEA8KBBAKAMwQAAFkEA8KBBAKAMwQAAFkEA8KBBAKAMwQAAFkEA8KBBAIDUQABgBkEAEKRBAIDUQABgBkEAEKRBAIDUQABgBkEAEKRBAIDUQABgBkEAEKRBAIDUQABgBkEAEKRBAIDUwABgBkEAEKRBAIDUwABgBkEAEKRBAIDUwABgBkEAEKRBAIDUwABgBkEAEKRBAIDUwABgBkEAEKRBAEC1QADAwUAAEKRBAEC1QADAwUAAEKRBAEC1QADAwUAAEKRBAEC1QADAwUAAEKRBAEC1wADAwUAAEKRBAEC1wADAwUAAEKRBAEC1wADAwUAAEKRBAEC1wADAwUAAEKRBAIDUQAAAekAAEKRBAIDUQAAAekAAEKRBAIDUQAAAekAAEKRBAIDUQAAAekAAEKRBAIDUQAAAekAAEKRBAIDUwAAAekAAEKRBAIDUwAAAekAAEKRBAIDUwAAAekAAEKRBAIDUwAAAekAAEKRBAIDUwAAAekAAEKRBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMQQDAwUAAoKVBAKAMwQDAwUAAoKVBAKAMLine truncated
}
]
}
@@ -0,0 +1,20 @@
{
"$schema": "http://openassettools.dev/schema/xmodel.v1.json",
"_game": "t6",
"_type": "xmodel",
"_version": 2,
"flags": 2621440,
"lightingOriginOffset": {
"x": 0.0,
"y": 0.0,
"z": 0.5
},
"lightingOriginRange": 0.5,
"lods": [
{
"distance": 11447.6904296875,
"file": "model_export/Suzanne1.gltf"
}
],
"type": "rigid"
}
@@ -0,0 +1,20 @@
{
"$schema": "http://openassettools.dev/schema/xmodel.v1.json",
"_game": "t6",
"_type": "xmodel",
"_version": 2,
"flags": 2621440,
"lightingOriginOffset": {
"x": 0.0,
"y": 0.0,
"z": 0.5
},
"lightingOriginRange": 0.5,
"lods": [
{
"distance": 11447.6904296875,
"file": "model_export/Suzanne2.gltf"
}
],
"type": "rigid"
}
@@ -0,0 +1,4 @@
>game,T6
ignore,Ignored
xmodel,Suzanne2
@@ -0,0 +1,77 @@
{
"$schema": "http://openassettools.dev/schema/material.v1.json",
"_game": "t6",
"_type": "material",
"_version": 1,
"cameraRegion": "none",
"constants": [],
"contents": 1,
"gameFlags": [],
"layeredSurfaceTypes": 536870912,
"sortKey": 4,
"stateBits": [
{
"alphaTest": "disabled",
"blendOpAlpha": "disabled",
"blendOpRgb": "disabled",
"colorWriteAlpha": true,
"colorWriteRgb": true,
"cullFace": "back",
"depthTest": "disabled",
"depthWrite": false,
"dstBlendAlpha": "zero",
"dstBlendRgb": "zero",
"polygonOffset": "offset0",
"polymodeLine": false,
"srcBlendAlpha": "one",
"srcBlendRgb": "one"
}
],
"stateBitsEntry": [
-1,
-1,
0,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1
],
"stateFlags": 0,
"surfaceFlags": 0,
"surfaceTypeBits": 0,
"techniqueSet": "trivial_floatz_2992w610",
"textureAtlas": {
"columns": 1,
"rows": 1
},
"textures": []
}
@@ -0,0 +1,77 @@
{
"$schema": "http://openassettools.dev/schema/material.v1.json",
"_game": "t6",
"_type": "material",
"_version": 1,
"cameraRegion": "none",
"constants": [],
"contents": 1,
"gameFlags": [],
"layeredSurfaceTypes": 536870912,
"sortKey": 4,
"stateBits": [
{
"alphaTest": "disabled",
"blendOpAlpha": "disabled",
"blendOpRgb": "disabled",
"colorWriteAlpha": true,
"colorWriteRgb": true,
"cullFace": "back",
"depthTest": "disabled",
"depthWrite": false,
"dstBlendAlpha": "zero",
"dstBlendRgb": "zero",
"polygonOffset": "offset0",
"polymodeLine": false,
"srcBlendAlpha": "one",
"srcBlendRgb": "one"
}
],
"stateBitsEntry": [
-1,
-1,
0,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1
],
"stateFlags": 0,
"surfaceFlags": 0,
"surfaceTypeBits": 0,
"techniqueSet": "trivial_floatz_2992w610",
"textureAtlas": {
"columns": 1,
"rows": 1
},
"textures": []
}
@@ -0,0 +1 @@
techniqueset,trivial_floatz_2992w610
1 techniqueset trivial_floatz_2992w610
@@ -0,0 +1,137 @@
/*
This makes sure that when reusing assets from an existing zone, asset dependencies that are references can be overwritten to be non-references.
In this case:
- The zone `ZoneWithTechsetT6` contains the techniqueset `trivial_floatz_2992w610`
- The zone `ZoneWithMaterialT6` contains the material `test` and with a reference to its techniqueset `,trivial_floatz_2992w610`
- The final zone `CombinedZoneT6` is built while loading both of the other fastfile and is expected to contain both the material `test` with a reference to a
(actual asset, not a reference) techniqueset `trivial_floatz_2992w610`
*/
#include "Game/T6/GameAssetPoolT6.h"
#include "Linker.h"
#include "OatTestPaths.h"
#include "SystemTestsPaths.h"
#include "Unlinker.h"
#include "ZoneLoading.h"
#include <catch2/catch_test_macros.hpp>
#include <filesystem>
#include <format>
#include <memory>
#include <string>
namespace fs = std::filesystem;
using namespace std::literals;
namespace
{
void BuildBaseZone(const fs::path& testDir, const fs::path& outputPath)
{
const auto testDirStr = testDir.string();
const auto assetDirStr = (testDir / "BaseZone").string();
const auto outputPathStr = outputPath.string();
const char* argStrings[]{
"SystemTests", // bin
"--verbose",
"--add-asset-search-path",
assetDirStr.c_str(),
"--source-search-path",
testDirStr.c_str(),
"--output-folder",
outputPathStr.c_str(),
"BaseZone",
};
LinkerArgs args;
bool shouldContinue = true;
const auto couldParseArgs = args.ParseArgs(std::extent_v<decltype(argStrings)>, argStrings, shouldContinue);
REQUIRE(couldParseArgs);
REQUIRE(shouldContinue);
const auto linker = Linker::Create(std::move(args));
const auto linkerResult = linker->Start();
REQUIRE(linkerResult);
}
void BuildTestZone(const fs::path& testDir, const fs::path& outputPath)
{
const auto testDirStr = testDir.string();
const auto assetDirStr = (testDir / "TestZone").string();
const auto outputPathStr = outputPath.string();
const auto baseZonePathStr = (outputPath / "BaseZone.ff").string();
const char* argStrings[]{
"SystemTests", // bin
"--verbose",
"--load",
baseZonePathStr.c_str(),
"--add-asset-search-path",
assetDirStr.c_str(),
"--source-search-path",
testDirStr.c_str(),
"--output-folder",
outputPathStr.c_str(),
"TestZone",
"TestZone", // build twice to ensure the second build uses a global asset that the first build already used
};
LinkerArgs args;
bool shouldContinue = true;
const auto couldParseArgs = args.ParseArgs(std::extent_v<decltype(argStrings)>, argStrings, shouldContinue);
REQUIRE(couldParseArgs);
REQUIRE(shouldContinue);
const auto linker = Linker::Create(std::move(args));
const auto linkerResult = linker->Start();
REQUIRE(linkerResult);
}
void CheckTestZoneContent(const fs::path& outputPath)
{
const auto expectedZonePathStr = (outputPath / "TestZone.ff").string();
auto maybeZone = ZoneLoading::LoadZone(expectedZonePathStr, std::nullopt);
REQUIRE(maybeZone);
auto zone = std::move(*maybeZone);
auto pools = dynamic_cast<GameAssetPoolT6*>(zone->m_pools.get());
REQUIRE(zone->m_game_id == GameId::T6);
REQUIRE(zone->m_platform == GamePlatform::PC);
REQUIRE(zone->m_name == "TestZone");
REQUIRE(pools->GetTotalAssetCount() == 3);
REQUIRE(pools->m_material->GetAsset("Suzanne2"));
REQUIRE(pools->m_technique_set->GetAsset(",trivial_floatz_2992w610"));
const auto* xmodel = pools->m_xmodel->GetAsset("Suzanne2");
REQUIRE(xmodel);
REQUIRE(xmodel->Asset()->boneNames);
REQUIRE(xmodel->Asset()->numRootBones == 1);
REQUIRE(xmodel->Asset()->numBones == 3);
REQUIRE(zone->m_script_strings.Value(xmodel->Asset()->boneNames[0]) == "Root2");
REQUIRE(zone->m_script_strings.Value(xmodel->Asset()->boneNames[1]) == "EarLeft2");
REQUIRE(zone->m_script_strings.Value(xmodel->Asset()->boneNames[2]) == "EarRight2");
}
// x64 for now produces invalid zones, don't try to load them yet
#ifdef ARCH_x86
TEST_CASE("Reuse assets from global asset pool(T6)", "[t6][system][simple]")
{
const auto testDir = oat::paths::GetSystemTestsDirectory() / "Game/T6/ReuseGlobalAssetPoolsAssets";
const auto outputPath = oat::paths::GetTempDirectory("ReuseGlobalAssetPoolsAssetsT6");
BuildBaseZone(testDir, outputPath);
BuildTestZone(testDir, outputPath);
CheckTestZoneContent(outputPath);
}
#endif
} // namespace