Sync editor rendering and UI workspace updates

This commit is contained in:
2026-04-09 02:59:36 +08:00
parent 23b23a56be
commit d46bf87970
107 changed files with 10918 additions and 430 deletions

View File

@@ -26,6 +26,7 @@ public:
bool Compile(
const void* sourceData,
size_t sourceSize,
const wchar_t* sourcePath,
const D3D_SHADER_MACRO* macros,
const char* entryPoint,
const char* target);

View File

@@ -59,6 +59,9 @@ inline bool TryBuildBuiltinPassResourceBindingPlan(
case BuiltinPassResourceSemantic::PassConstants:
location = &outPlan.passConstants;
break;
case BuiltinPassResourceSemantic::VolumeField:
location = &outPlan.volumeField;
break;
case BuiltinPassResourceSemantic::BaseColorTexture:
location = &outPlan.baseColorTexture;
break;
@@ -305,6 +308,24 @@ inline bool TryBuildBuiltinPassDefaultResourceBindings(
return true;
}
if (ShaderPassMatchesBuiltinPass(shaderPass, BuiltinMaterialPass::Volumetric)) {
AppendBuiltinPassResourceBinding(
outBindings,
"PerObjectConstants",
Resources::ShaderResourceType::ConstantBuffer,
0u,
0u,
"PerObject");
AppendBuiltinPassResourceBinding(
outBindings,
"MaterialConstants",
Resources::ShaderResourceType::ConstantBuffer,
1u,
0u,
"Material");
return true;
}
if (ShaderPassMatchesBuiltinPass(shaderPass, BuiltinMaterialPass::PostProcess)) {
AppendBuiltinPassResourceBinding(
outBindings,
@@ -538,6 +559,9 @@ inline bool TryBuildBuiltinPassSetLayouts(
case BuiltinPassResourceSemantic::PassConstants:
setLayout.usesPassConstants = true;
break;
case BuiltinPassResourceSemantic::VolumeField:
setLayout.usesVolumeField = true;
break;
case BuiltinPassResourceSemantic::BaseColorTexture:
setLayout.usesTexture = true;
setLayout.usesBaseColorTexture = true;

View File

@@ -25,6 +25,8 @@ inline const char* GetBuiltinPassCanonicalName(BuiltinMaterialPass pass) {
return "objectid";
case BuiltinMaterialPass::Skybox:
return "skybox";
case BuiltinMaterialPass::Volumetric:
return "volumetric";
case BuiltinMaterialPass::PostProcess:
return "colorscale";
case BuiltinMaterialPass::FinalColor:
@@ -136,6 +138,11 @@ inline BuiltinPassResourceSemantic ResolveBuiltinPassResourceSemantic(
return BuiltinPassResourceSemantic::PassConstants;
}
if (semantic == Containers::String("volumefield") ||
semantic == Containers::String("volumedata")) {
return BuiltinPassResourceSemantic::VolumeField;
}
if (semantic == Containers::String("basecolortexture") ||
semantic == Containers::String("maintex")) {
return BuiltinPassResourceSemantic::BaseColorTexture;
@@ -196,6 +203,8 @@ inline const char* BuiltinPassResourceSemanticToString(BuiltinPassResourceSemant
return "Environment";
case BuiltinPassResourceSemantic::PassConstants:
return "PassConstants";
case BuiltinPassResourceSemantic::VolumeField:
return "VolumeField";
case BuiltinPassResourceSemantic::BaseColorTexture:
return "BaseColorTexture";
case BuiltinPassResourceSemantic::SourceColorTexture:
@@ -281,6 +290,9 @@ inline bool IsBuiltinPassResourceTypeCompatible(
type == Resources::ShaderResourceType::RawBuffer ||
type == Resources::ShaderResourceType::RWStructuredBuffer ||
type == Resources::ShaderResourceType::RWRawBuffer;
case BuiltinPassResourceSemantic::VolumeField:
return type == Resources::ShaderResourceType::StructuredBuffer ||
type == Resources::ShaderResourceType::RawBuffer;
case BuiltinPassResourceSemantic::BaseColorTexture:
case BuiltinPassResourceSemantic::SourceColorTexture:
case BuiltinPassResourceSemantic::SkyboxPanoramicTexture:

View File

@@ -19,6 +19,7 @@ enum class BuiltinMaterialPass : Core::uint32 {
ShadowCaster,
ObjectId,
Skybox,
Volumetric,
PostProcess,
FinalColor,
Forward = ForwardLit
@@ -42,6 +43,7 @@ enum class BuiltinPassResourceSemantic : Core::uint8 {
ShadowReceiver,
Environment,
PassConstants,
VolumeField,
BaseColorTexture,
SourceColorTexture,
SkyboxPanoramicTexture,
@@ -70,6 +72,7 @@ struct BuiltinPassResourceBindingPlan {
bool usesMaterialBuffers = false;
PassResourceBindingLocation perObject = {};
PassResourceBindingLocation material = {};
PassResourceBindingLocation volumeField = {};
PassResourceBindingLocation lighting = {};
PassResourceBindingLocation shadowReceiver = {};
PassResourceBindingLocation environment = {};
@@ -106,6 +109,7 @@ struct BuiltinPassSetLayoutMetadata {
bool usesEnvironment = false;
bool usesPassConstants = false;
bool usesMaterialBuffers = false;
bool usesVolumeField = false;
bool usesTexture = false;
bool usesBaseColorTexture = false;
bool usesSourceColorTexture = false;

View File

@@ -6,6 +6,7 @@
#include <XCEngine/RHI/RHITexture.h>
#include <XCEngine/Resources/Mesh/Mesh.h>
#include <XCEngine/Resources/Texture/Texture.h>
#include <XCEngine/Resources/Volume/VolumeField.h>
#include <unordered_map>
@@ -36,12 +37,24 @@ public:
RHI::RHIResourceView* resourceView = nullptr;
};
struct CachedVolumeField {
RHI::RHIBuffer* payloadBuffer = nullptr;
RHI::RHIResourceView* shaderResourceView = nullptr;
uint32_t elementStride = 0;
uint32_t elementCount = 0;
uint64_t payloadSize = 0;
Resources::VolumeStorageKind storageKind = Resources::VolumeStorageKind::Unknown;
};
~RenderResourceCache();
void Shutdown();
const CachedMesh* GetOrCreateMesh(RHI::RHIDevice* device, const Resources::Mesh* mesh);
const CachedTexture* GetOrCreateTexture(RHI::RHIDevice* device, const Resources::Texture* texture);
const CachedVolumeField* GetOrCreateVolumeField(
RHI::RHIDevice* device,
const Resources::VolumeField* volumeField);
const CachedBufferView* GetOrCreateBufferView(
RHI::RHIDevice* device,
RHI::RHIBuffer* buffer,
@@ -77,6 +90,10 @@ private:
bool UploadMesh(RHI::RHIDevice* device, const Resources::Mesh* mesh, CachedMesh& cachedMesh);
bool UploadTexture(RHI::RHIDevice* device, const Resources::Texture* texture, CachedTexture& cachedTexture);
bool UploadVolumeField(
RHI::RHIDevice* device,
const Resources::VolumeField* volumeField,
CachedVolumeField& cachedVolumeField);
bool CreateBufferView(
RHI::RHIDevice* device,
RHI::RHIBuffer* buffer,
@@ -86,6 +103,7 @@ private:
std::unordered_map<const Resources::Mesh*, CachedMesh> m_meshCache;
std::unordered_map<const Resources::Texture*, CachedTexture> m_textureCache;
std::unordered_map<const Resources::VolumeField*, CachedVolumeField> m_volumeFieldCache;
std::unordered_map<BufferViewCacheKey, CachedBufferView, BufferViewCacheKeyHash> m_bufferViewCache;
};

View File

@@ -36,6 +36,7 @@ Containers::String GetBuiltinShadowCasterShaderPath();
Containers::String GetBuiltinObjectIdShaderPath();
Containers::String GetBuiltinObjectIdOutlineShaderPath();
Containers::String GetBuiltinSkyboxShaderPath();
Containers::String GetBuiltinVolumetricShaderPath();
Containers::String GetBuiltinColorScalePostProcessShaderPath();
Containers::String GetBuiltinFinalColorShaderPath();
Containers::String GetBuiltinDefaultPrimitiveTexturePath();

View File

@@ -1,7 +1,9 @@
#pragma once
#include <cstddef>
#include <string>
#include <string_view>
#include <vector>
namespace XCEngine {
namespace UI {
@@ -11,14 +13,26 @@ class UISelectionModel {
public:
bool HasSelection() const;
const std::string& GetSelectedId() const;
const std::vector<std::string>& GetSelectedIds() const;
std::size_t GetSelectionCount() const;
bool HasMultipleSelection() const;
bool IsSelected(std::string_view id) const;
bool SetSelection(std::string selectionId);
bool SetSelections(
std::vector<std::string> selectionIds,
std::string primarySelectionId = {});
bool SetPrimarySelection(std::string selectionId);
bool AddSelection(std::string selectionId, bool makePrimary = false);
bool RemoveSelection(std::string_view selectionId);
bool ClearSelection();
bool ToggleSelection(std::string selectionId);
private:
std::string m_selectedId = {};
static void NormalizeSelectionIds(std::vector<std::string>& selectionIds);
std::vector<std::string> m_selectedIds = {};
std::string m_primarySelectedId = {};
};
} // namespace Widgets