载入中...
搜索中...
未找到
TerrainMaterialAtlas.cpp
浏览该文件的文档.
12TerrainAtlasImage solid(std::array<std::uint8_t, 4> color) { return {1, 1, {color[0], color[1], color[2], color[3]}}; }
14std::array<std::uint8_t, 4> sample(const asset::DecodedEvpackImage& image, std::uint32_t x, std::uint32_t y,
37 std::array<std::uint8_t, 4> fallback, const RuntimeTerrainLayer* layer, bool normal, bool mask) {
43 if (normal && layer && layer->normalConvention == "directx") value[1] = std::uint8_t(255 - value[1]);
58Result<std::optional<asset::DecodedEvpackImage>> decodeOptional(const asset::EvpackResourceReader& reader,
64 if (!decoded) return Result<std::optional<asset::DecodedEvpackImage>>::failure(decoded.status());
65 return Result<std::optional<asset::DecodedEvpackImage>>::success(std::move(decoded).takeValue());
72 return {image.pixels[offset], image.pixels[offset + 1], image.pixels[offset + 2], image.pixels[offset + 3]};
75void writePixel(TerrainAtlasImage& image, std::uint32_t x, std::uint32_t y, const std::array<std::uint8_t, 4>& value) {
83 {std::uint8_t(bits), std::uint8_t(bits >> 8), std::uint8_t(bits >> 16), std::uint8_t(bits >> 24)});
87Result<TerrainMaterialAtlases> buildTerrainMaterialAtlases(const asset::EvpackResourceReader& reader,
91 if (material.layers.empty() || material.layers.size() > limits.maximumLayers || limits.maximumLayers > 16)
92 return Result<TerrainMaterialAtlases>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,
126 images[slot] = {std::move(albedo).takeValue(), std::move(normal).takeValue(), std::move(mask).takeValue()};
135 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain atlas tile exceeds dimension budget",
138 if (atlasBytes > limits.maximumOutputBytes || outputBytes > limits.maximumOutputBytes - atlasBytes * 3)
139 return Result<TerrainMaterialAtlases>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,
161 auto control = decodeOptional(reader, material.controlAssets[groupIndex], capabilities, limits.image);
186Result<PackedTerrainMaterialAtlases> packTerrainMaterialAtlases(const TerrainMaterialAtlases& atlases,
189 if (material.layers.empty() || material.layers.size() > 16 || material.layers.size() > limits.maximumLayers ||
194 DiagnosticCode::InvalidArgument, "terrain atlas set is incomplete", {}, {}, "asset.procgen.terrain-atlas"));
200 if (group.tileWidth == 0 || group.tileHeight == 0 || group.control.width == 0 || group.control.height == 0 ||
210 Diagnostic::error(DiagnosticCode::InvalidArgument, "terrain layer atlas dimensions are invalid", {},
223 Diagnostic::error(DiagnosticCode::InvalidArgument, "packed terrain atlas exceeds output limits", {}, {},
242 writePixel(result.albedo, destinationX, destinationY, sampleImage(group.albedo, sourceU, sourceV));
243 writePixel(result.normal, destinationX, destinationY, sampleImage(group.normal, sourceU, sourceV));
251 const TerrainAtlasImage& source = cell < atlases.groups.size() ? atlases.groups[cell].control : atlases.holes;
280Result<void> releaseTerrainMaterialAtlases(graphics::IResourceFactory& factory, TerrainMaterialGpuSet& set) {
292 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Failed, "terrain atlas backend release failed",
301 return factory.newTexture(int(image.width), int(image.height), image.pixels.data(), false, false);
335 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Failed, "packed terrain backend release failed",
340Result<PackedTerrainMaterialGpuSet> uploadPackedTerrainMaterialAtlases(graphics::IResourceFactory& factory,
344 return factory.newTexture(int(image.width), int(image.height), image.pixels.data(), false, false);
353 if (!result.albedo || !result.normal || !result.mask || !result.controls || !result.parameters) {
357 DiagnosticCode::Failed, "packed terrain atlas upload failed", {}, {}, "asset.procgen.terrain-atlas"));
362Result<void> bindPackedTerrainMaterial(graphics::Shader& shader, const PackedTerrainMaterialGpuSet& gpu) {
363 if (!gpu.albedo || !gpu.normal || !gpu.mask || !gpu.controls || !gpu.parameters || gpu.layerCount == 0 ||
379Result<void> bindTerrainMaterialGroup(graphics::Shader& shader, const TerrainMaterialGpuSet& gpu,
386 for (const auto& [slot, texture] : {std::pair<std::size_t, graphics::Texture*>{0, group.albedo},
409 shader.sendVec4("terrainNormalScale", normalScale[0], normalScale[1], normalScale[2], normalScale[3]);
410 shader.sendVec4("terrainSmoothness", smoothness[0], smoothness[1], smoothness[2], smoothness[3]);
CPU assembly of grouped terrain material atlases.
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Immutable reader retaining an admitted pack by shared ownership.
Definition EvpackResourceReader.h:29
Texture / mesh / shader / canvas creation and release.
Definition IResourceFactory.h:38
virtual Texture * newTexture(int width, int height, const uint8_t *rgba, bool repeatU=false, bool repeatV=false)=0
Creates a texture. @ownership Caller deletes unless documented otherwise.
virtual bool releaseTexture(Texture *texture)=0
Release texture.
Result< PackedTerrainMaterialAtlases > packTerrainMaterialAtlases(const TerrainMaterialAtlases &atlases, const LoadedTerrainMaterial &material, const TerrainMaterialAtlasLimits &limits)
Repack grouped CPU atlases and material parameters for one terrain draw.
Definition TerrainMaterialAtlas.cpp:186
Result< void > bindTerrainMaterialGroup(graphics::Shader &shader, const TerrainMaterialGpuSet &gpu, const LoadedTerrainMaterial &material, std::size_t groupIndex)
Bind one uploaded group and its four layer values to a terrain shader.
Definition TerrainMaterialAtlas.cpp:379
Result< void > bindPackedTerrainMaterial(graphics::Shader &shader, const PackedTerrainMaterialGpuSet &gpu)
Bind a packed terrain set for one draw and publish its feature counts.
Definition TerrainMaterialAtlas.cpp:362
Result< PackedTerrainMaterialGpuSet > uploadPackedTerrainMaterialAtlases(graphics::IResourceFactory &factory, const PackedTerrainMaterialAtlases &atlases)
Upload a packed terrain set transactionally.
Definition TerrainMaterialAtlas.cpp:340
Result< TerrainMaterialAtlases > buildTerrainMaterialAtlases(const asset::EvpackResourceReader &reader, const LoadedTerrainMaterial &material, const asset::EvpackCapabilities &capabilities, const TerrainMaterialAtlasLimits &limits)
Resolve canonical image references and assemble one 2x2 atlas per control map.
Definition TerrainMaterialAtlas.cpp:87
Result< void > releasePackedTerrainMaterialAtlases(graphics::IResourceFactory &factory, PackedTerrainMaterialGpuSet &set)
Release and clear a packed terrain GPU set.
Definition TerrainMaterialAtlas.cpp:325
Result< void > releaseTerrainMaterialAtlases(graphics::IResourceFactory &factory, TerrainMaterialGpuSet &set)
Release every texture in a GPU set and clear it even if one backend release fails.
Definition TerrainMaterialAtlas.cpp:280
Result< TerrainMaterialGpuSet > uploadTerrainMaterialAtlases(graphics::IResourceFactory &factory, const TerrainMaterialAtlases &atlases)
Upload every atlas transactionally; partial failure releases earlier textures.
Definition TerrainMaterialAtlas.cpp:297
Result< DecodedEvpackImage > decodeEvpackImage(const EvpackResourceReader &reader, const AssetRef &image, const EvpackCapabilities &capabilities, const EvpackImageDecodeLimits &limits)
Decode and validate canonical eve.image/3 data with eve.image/2 compatibility.
Definition EvpackImageDecoder.cpp:14
@ InvalidArgument
@ NotFound
@ Failed
Actual runtime device capabilities used for variant selection.
Definition Evpack.h:92
Owning capability-selected terrain material candidate.
Definition EvpackTerrainMaterialLoader.h:44
Single-draw terrain textures covering up to sixteen layers.
Definition TerrainMaterialAtlas.h:34
TerrainAtlasImage albedo
Definition TerrainMaterialAtlas.h:35
TerrainAtlasImage parameters
Definition TerrainMaterialAtlas.h:35
TerrainAtlasImage normal
Definition TerrainMaterialAtlas.h:35
std::uint32_t layerCount
Definition TerrainMaterialAtlas.h:36
TerrainAtlasImage controls
Definition TerrainMaterialAtlas.h:35
bool hasHoles
Definition TerrainMaterialAtlas.h:37
TerrainAtlasImage mask
Definition TerrainMaterialAtlas.h:35
Backend-owned texture set for a single draw of up to sixteen layers.
Definition TerrainMaterialAtlas.h:83
graphics::Texture * albedo
Definition TerrainMaterialAtlas.h:84
std::uint32_t layerCount
Definition TerrainMaterialAtlas.h:89
graphics::Texture * controls
Definition TerrainMaterialAtlas.h:87
graphics::Texture * parameters
Definition TerrainMaterialAtlas.h:88
graphics::Texture * mask
Definition TerrainMaterialAtlas.h:86
bool hasHoles
Definition TerrainMaterialAtlas.h:90
graphics::Texture * normal
Definition TerrainMaterialAtlas.h:85
One owning canonical terrain layer independent of its source engine.
Definition EvpackTerrainMaterialLoader.h:17
Owning base-level linear RGBA8 image ready for backend upload.
Definition TerrainMaterialAtlas.h:16
std::vector< std::uint8_t > pixels
Definition TerrainMaterialAtlas.h:18
std::uint32_t height
Definition TerrainMaterialAtlas.h:17
Four-layer atlas group driven by one RGBA control image.
Definition TerrainMaterialAtlas.h:22
std::uint32_t firstLayer
Definition TerrainMaterialAtlas.h:23
Bounds for deterministic terrain atlas construction.
Definition TerrainMaterialAtlas.h:41
Complete terrain material image set; up to four groups cover sixteen layers.
Definition TerrainMaterialAtlas.h:28
std::vector< TerrainMaterialAtlasGroup > groups
Definition TerrainMaterialAtlas.h:29
TerrainAtlasImage holes
Definition TerrainMaterialAtlas.h:30
Four backend-owned textures for one uploaded terrain group.
Definition TerrainMaterialAtlas.h:69
graphics::Texture * albedo
Definition TerrainMaterialAtlas.h:70
Backend-owned terrain textures released together on their graphics thread.
Definition TerrainMaterialAtlas.h:77
graphics::Texture * holes
Definition TerrainMaterialAtlas.h:79
std::vector< TerrainMaterialGpuGroup > groups
Definition TerrainMaterialAtlas.h:78