diff --git a/Source/Engine/Core/Types/Span.h b/Source/Engine/Core/Types/Span.h
index 8f16b8c7d..3120ae670 100644
--- a/Source/Engine/Core/Types/Span.h
+++ b/Source/Engine/Core/Types/Span.h
@@ -85,6 +85,30 @@ public:
return (U*)_data;
}
+public:
+ ///
+ /// Constructs a slice out of the current span that begins at a specified index.
+ ///
+ /// The zero-based index at which to begin the slice.
+ /// A span that consists of all elements of the current span from to the end of the span.
+ Span Slice(int32 start)
+ {
+ ASSERT(start <= _length);
+ return Span(_data + start, _length - start);
+ }
+
+ ///
+ /// Constructs a slice out of the current span starting at a specified index for a specified length.
+ ///
+ /// The zero-based index at which to begin this slice.
+ /// The length for the result slice.
+ /// A span that consists of elements from the current span starting at .
+ Span Slice(int32 start, int32 length)
+ {
+ ASSERT(start + length <= _length);
+ return Span(_data + start, length);
+ }
+
public:
///
/// Gets or sets the element by index
diff --git a/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp b/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp
index 714805f45..ab38822c0 100644
--- a/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp
@@ -33,7 +33,7 @@ void DecalMaterialShader::Bind(BindParameters& params)
Span cb(_cbData.Get(), _cbData.Count());
ASSERT_LOW_LAYER(cb.Length() >= sizeof(DecalMaterialShaderData));
auto materialData = reinterpret_cast(cb.Get());
- cb = Span(cb.Get() + sizeof(DecalMaterialShaderData), cb.Length() - sizeof(DecalMaterialShaderData));
+ cb = cb.Slice(sizeof(DecalMaterialShaderData));
const bool isCameraInside = OrientedBoundingBox(Vector3::Half, drawCall.World).Contains(view.Position) == ContainmentType::Contains;
// Setup parameters
diff --git a/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp b/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp
index 434d1ef05..333c9eb35 100644
--- a/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp
@@ -41,7 +41,7 @@ void DeformableMaterialShader::Bind(BindParameters& params)
Span cb(_cbData.Get(), _cbData.Count());
ASSERT_LOW_LAYER(cb.Length() >= sizeof(DeformableMaterialShaderData));
auto materialData = reinterpret_cast(cb.Get());
- cb = Span(cb.Get() + sizeof(DeformableMaterialShaderData), cb.Length() - sizeof(DeformableMaterialShaderData));
+ cb = cb.Slice(sizeof(DeformableMaterialShaderData));
int32 srv = 1;
// Setup features
diff --git a/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp b/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp
index 69a097a2a..d6066adab 100644
--- a/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp
@@ -32,7 +32,7 @@ void GUIMaterialShader::Bind(BindParameters& params)
Span cb(_cbData.Get(), _cbData.Count());
ASSERT_LOW_LAYER(cb.Length() >= sizeof(GUIMaterialShaderData));
auto materialData = reinterpret_cast(cb.Get());
- cb = Span(cb.Get() + sizeof(GUIMaterialShaderData), cb.Length() - sizeof(GUIMaterialShaderData));
+ cb = cb.Slice(sizeof(GUIMaterialShaderData));
int32 srv = 0;
const auto ps = context->IsDepthBufferBinded() ? _cache.Depth : _cache.NoDepth;
auto customData = (Render2D::CustomData*)params.CustomData;
diff --git a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp
index 2b2d079cd..a0b85092a 100644
--- a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp
+++ b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp
@@ -113,7 +113,7 @@ void ForwardShadingFeature::Bind(MaterialShader::BindParameters& params, Span(cb.Get() + sizeof(Data), cb.Length() - sizeof(Data));
+ cb = cb.Slice(sizeof(Data));
srv += SRVs;
}
@@ -184,7 +184,7 @@ bool GlobalIlluminationFeature::Bind(MaterialShader::BindParameters& params, Spa
params.GPUContext->UnBindSR(srv + 2);
}
- cb = Span(cb.Get() + sizeof(Data), cb.Length() - sizeof(Data));
+ cb = cb.Slice(sizeof(Data));
srv += SRVs;
return useGI;
}
@@ -236,7 +236,7 @@ bool SDFReflectionsFeature::Bind(MaterialShader::BindParameters& params, SpanUnBindSR(srv + 6);
}
- cb = Span(cb.Get() + sizeof(Data), cb.Length() - sizeof(Data));
+ cb = cb.Slice(sizeof(Data));
srv += SRVs;
return useSDFReflections;
}
diff --git a/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp b/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp
index 33e2bb454..1659e973e 100644
--- a/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp
@@ -53,7 +53,7 @@ void ParticleMaterialShader::Bind(BindParameters& params)
Span cb(_cbData.Get(), _cbData.Count());
ASSERT_LOW_LAYER(cb.Length() >= sizeof(ParticleMaterialShaderData));
auto materialData = reinterpret_cast(cb.Get());
- cb = Span(cb.Get() + sizeof(ParticleMaterialShaderData), cb.Length() - sizeof(ParticleMaterialShaderData));
+ cb = cb.Slice(sizeof(ParticleMaterialShaderData));
int32 srv = 2;
// Setup features
diff --git a/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp b/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp
index c820fc613..edb293c65 100644
--- a/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp
@@ -31,7 +31,7 @@ void PostFxMaterialShader::Bind(BindParameters& params)
Span cb(_cbData.Get(), _cbData.Count());
ASSERT_LOW_LAYER(cb.Length() >= sizeof(PostFxMaterialShaderData));
auto materialData = reinterpret_cast(cb.Get());
- cb = Span(cb.Get() + sizeof(PostFxMaterialShaderData), cb.Length() - sizeof(PostFxMaterialShaderData));
+ cb = cb.Slice(sizeof(PostFxMaterialShaderData));
int32 srv = 0;
// Setup parameters
diff --git a/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp b/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp
index 2a040b55a..2bb0b42ad 100644
--- a/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp
@@ -50,7 +50,7 @@ void TerrainMaterialShader::Bind(BindParameters& params)
Span cb(_cbData.Get(), _cbData.Count());
ASSERT_LOW_LAYER(cb.Length() >= sizeof(TerrainMaterialShaderData));
auto materialData = reinterpret_cast(cb.Get());
- cb = Span(cb.Get() + sizeof(TerrainMaterialShaderData), cb.Length() - sizeof(TerrainMaterialShaderData));
+ cb = cb.Slice(sizeof(TerrainMaterialShaderData));
int32 srv = 3;
// Setup features
diff --git a/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp b/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp
index cc04498df..853058226 100644
--- a/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp
+++ b/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp
@@ -41,7 +41,7 @@ void VolumeParticleMaterialShader::Bind(BindParameters& params)
Span cb(_cbData.Get(), _cbData.Count());
ASSERT_LOW_LAYER(cb.Length() >= sizeof(VolumeParticleMaterialShaderData));
auto materialData = reinterpret_cast(cb.Get());
- cb = Span(cb.Get() + sizeof(VolumeParticleMaterialShaderData), cb.Length() - sizeof(VolumeParticleMaterialShaderData));
+ cb = cb.Slice(sizeof(VolumeParticleMaterialShaderData));
int32 srv = 1;
auto customData = (VolumetricFogPass::CustomData*)params.CustomData;
diff --git a/Source/Engine/GraphicsDevice/DirectX/DX12/GPUShaderDX12.cpp b/Source/Engine/GraphicsDevice/DirectX/DX12/GPUShaderDX12.cpp
index c4aea2172..0fe07a466 100644
--- a/Source/Engine/GraphicsDevice/DirectX/DX12/GPUShaderDX12.cpp
+++ b/Source/Engine/GraphicsDevice/DirectX/DX12/GPUShaderDX12.cpp
@@ -12,7 +12,7 @@ GPUShaderProgram* GPUShaderDX12::CreateGPUShaderProgram(ShaderStage type, const
{
// Extract the DX shader header from the cache
DxShaderHeader* header = (DxShaderHeader*)bytecode.Get();
- bytecode = Span(bytecode.Get() + sizeof(DxShaderHeader), bytecode.Length() - sizeof(DxShaderHeader));
+ bytecode = bytecode.Slice(sizeof(DxShaderHeader));
GPUShaderProgram* shader = nullptr;
switch (type)
diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUShaderVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUShaderVulkan.cpp
index d36919b5f..9608d5207 100644
--- a/Source/Engine/GraphicsDevice/Vulkan/GPUShaderVulkan.cpp
+++ b/Source/Engine/GraphicsDevice/Vulkan/GPUShaderVulkan.cpp
@@ -102,7 +102,7 @@ GPUShaderProgram* GPUShaderVulkan::CreateGPUShaderProgram(ShaderStage type, cons
{
// Extract the SPIR-V shader header from the cache
SpirvShaderHeader* header = (SpirvShaderHeader*)bytecode.Get();
- bytecode = Span(bytecode.Get() + sizeof(SpirvShaderHeader), bytecode.Length() - sizeof(SpirvShaderHeader));
+ bytecode = bytecode.Slice(sizeof(SpirvShaderHeader));
// Extract the SPIR-V bytecode
BytesContainer spirv;
diff --git a/Source/Engine/Particles/Graph/GPU/GPUParticles.cpp b/Source/Engine/Particles/Graph/GPU/GPUParticles.cpp
index dbd7c0d02..43fde57db 100644
--- a/Source/Engine/Particles/Graph/GPU/GPUParticles.cpp
+++ b/Source/Engine/Particles/Graph/GPU/GPUParticles.cpp
@@ -166,7 +166,7 @@ void GPUParticles::Execute(GPUContext* context, ParticleEmitter* emitter, Partic
// Setup parameters
MaterialParameter::BindMeta bindMeta;
bindMeta.Context = context;
- bindMeta.Constants = hasCB ? Span(_cbData.Get() + sizeof(GPUParticlesData), _cbData.Count() - sizeof(GPUParticlesData)) : Span(nullptr, 0);
+ bindMeta.Constants = hasCB ? ToSpan(_cbData).Slice(sizeof(GPUParticlesData)) : Span(nullptr, 0);
bindMeta.Input = nullptr;
if (viewTask)
{