Refactor engine to support double-precision vectors

This commit is contained in:
Wojtek Figat
2022-06-13 00:40:32 +02:00
parent f82e370392
commit a881c90b2e
744 changed files with 19062 additions and 12467 deletions

View File

@@ -17,12 +17,12 @@ PACK_STRUCT(struct DecalMaterialShaderData {
Matrix ViewMatrix;
Matrix InvWorld;
Matrix SVPositionToWorld;
Vector3 ViewPos;
Float3 ViewPos;
float ViewFar;
Vector3 ViewDir;
Float3 ViewDir;
float TimeParam;
Vector4 ViewInfo;
Vector4 ScreenSize;
Float4 ViewInfo;
Float4 ScreenSize;
});
DrawPass DecalMaterialShader::GetDrawModes() const

View File

@@ -22,19 +22,19 @@ PACK_STRUCT(struct DeferredMaterialShaderData {
Matrix ViewMatrix;
Matrix PrevViewProjectionMatrix;
Matrix PrevWorldMatrix;
Vector3 ViewPos;
Float3 ViewPos;
float ViewFar;
Vector3 ViewDir;
Float3 ViewDir;
float TimeParam;
Vector4 ViewInfo;
Vector4 ScreenSize;
Vector3 WorldInvScale;
Float4 ViewInfo;
Float4 ScreenSize;
Float3 WorldInvScale;
float WorldDeterminantSign;
Vector2 Dummy0;
Float2 Dummy0;
float LODDitherFactor;
float PerInstanceRandom;
Vector4 TemporalAAJitter;
Vector3 GeometrySize;
Float4 TemporalAAJitter;
Float3 GeometrySize;
float Dummy1;
});
@@ -92,10 +92,10 @@ void DeferredMaterialShader::Bind(BindParameters& params)
materialData->TimeParam = params.TimeParam;
materialData->ViewInfo = view.ViewInfo;
materialData->ScreenSize = view.ScreenSize;
const float scaleX = Vector3(drawCall.World.M11, drawCall.World.M12, drawCall.World.M13).Length();
const float scaleY = Vector3(drawCall.World.M21, drawCall.World.M22, drawCall.World.M23).Length();
const float scaleZ = Vector3(drawCall.World.M31, drawCall.World.M32, drawCall.World.M33).Length();
materialData->WorldInvScale = Vector3(
const float scaleX = Float3(drawCall.World.M11, drawCall.World.M12, drawCall.World.M13).Length();
const float scaleY = Float3(drawCall.World.M21, drawCall.World.M22, drawCall.World.M23).Length();
const float scaleZ = Float3(drawCall.World.M31, drawCall.World.M32, drawCall.World.M33).Length();
materialData->WorldInvScale = Float3(
scaleX > 0.00001f ? 1.0f / scaleX : 0.0f,
scaleY > 0.00001f ? 1.0f / scaleY : 0.0f,
scaleZ > 0.00001f ? 1.0f / scaleZ : 0.0f);

View File

@@ -19,20 +19,20 @@ PACK_STRUCT(struct DeformableMaterialShaderData {
Matrix WorldMatrix;
Matrix LocalMatrix;
Matrix ViewMatrix;
Vector3 ViewPos;
Float3 ViewPos;
float ViewFar;
Vector3 ViewDir;
Float3 ViewDir;
float TimeParam;
Vector4 ViewInfo;
Vector4 ScreenSize;
Vector3 Dummy0;
Float4 ViewInfo;
Float4 ScreenSize;
Float3 Dummy0;
float WorldDeterminantSign;
float MeshMinZ;
float Segment;
float ChunksPerSegment;
float PerInstanceRandom;
Vector4 TemporalAAJitter;
Vector3 GeometrySize;
Float4 TemporalAAJitter;
Float3 GeometrySize;
float MeshMaxZ;
});

View File

@@ -24,19 +24,19 @@ PACK_STRUCT(struct ForwardMaterialShaderData {
Matrix ViewMatrix;
Matrix PrevViewProjectionMatrix;
Matrix PrevWorldMatrix;
Vector3 ViewPos;
Float3 ViewPos;
float ViewFar;
Vector3 ViewDir;
Float3 ViewDir;
float TimeParam;
Vector4 ViewInfo;
Vector4 ScreenSize;
Vector3 WorldInvScale;
Float4 ViewInfo;
Float4 ScreenSize;
Float3 WorldInvScale;
float WorldDeterminantSign;
Vector2 Dummy0;
Float2 Dummy0;
float LODDitherFactor;
float PerInstanceRandom;
Vector4 TemporalAAJitter;
Vector3 GeometrySize;
Float4 TemporalAAJitter;
Float3 GeometrySize;
float Dummy1;
});
@@ -98,10 +98,10 @@ void ForwardMaterialShader::Bind(BindParameters& params)
materialData->TimeParam = params.TimeParam;
materialData->ViewInfo = view.ViewInfo;
materialData->ScreenSize = view.ScreenSize;
const float scaleX = Vector3(drawCall.World.M11, drawCall.World.M12, drawCall.World.M13).Length();
const float scaleY = Vector3(drawCall.World.M21, drawCall.World.M22, drawCall.World.M23).Length();
const float scaleZ = Vector3(drawCall.World.M31, drawCall.World.M32, drawCall.World.M33).Length();
materialData->WorldInvScale = Vector3(
const float scaleX = Float3(drawCall.World.M11, drawCall.World.M12, drawCall.World.M13).Length();
const float scaleY = Float3(drawCall.World.M21, drawCall.World.M22, drawCall.World.M23).Length();
const float scaleZ = Float3(drawCall.World.M31, drawCall.World.M32, drawCall.World.M33).Length();
materialData->WorldInvScale = Float3(
scaleX > 0.00001f ? 1.0f / scaleX : 0.0f,
scaleY > 0.00001f ? 1.0f / scaleY : 0.0f,
scaleZ > 0.00001f ? 1.0f / scaleZ : 0.0f);

View File

@@ -14,12 +14,12 @@ PACK_STRUCT(struct GUIMaterialShaderData {
Matrix ViewProjectionMatrix;
Matrix WorldMatrix;
Matrix ViewMatrix;
Vector3 ViewPos;
Float3 ViewPos;
float ViewFar;
Vector3 ViewDir;
Float3 ViewDir;
float TimeParam;
Vector4 ViewInfo;
Vector4 ScreenSize;
Float4 ViewInfo;
Float4 ScreenSize;
});
void GUIMaterialShader::Bind(BindParameters& params)
@@ -49,13 +49,13 @@ void GUIMaterialShader::Bind(BindParameters& params)
Matrix::Transpose(*viewProjectionMatrix, materialData->ViewProjectionMatrix);
Matrix::Transpose(Matrix::Identity, materialData->WorldMatrix);
Matrix::Transpose(Matrix::Identity, materialData->ViewMatrix);
materialData->ViewPos = Vector3::Zero;
materialData->ViewPos = Float3::Zero;
materialData->ViewFar = 0.0f;
materialData->ViewDir = Vector3::Forward;
materialData->ViewDir = Float3::Forward;
materialData->TimeParam = params.TimeParam;
materialData->ViewInfo = Vector4::Zero;
materialData->ViewInfo = Float4::Zero;
auto& viewport = Render2D::GetViewport();
materialData->ScreenSize = Vector4(viewport.Width, viewport.Height, 1.0f / viewport.Width, 1.0f / viewport.Height);
materialData->ScreenSize = Float4(viewport.Width, viewport.Height, 1.0f / viewport.Width, 1.0f / viewport.Height);
}
// Bind constants

View File

@@ -187,7 +187,7 @@ Variant MaterialParameter::GetValue() const
case MaterialParameterType::Vector3:
return _asVector3;
case MaterialParameterType::Vector4:
return *(Vector4*)&AsData;
return *(Float4*)&AsData;
case MaterialParameterType::Color:
return _asColor;
case MaterialParameterType::Matrix:
@@ -225,13 +225,13 @@ void MaterialParameter::SetValue(const Variant& value)
_asFloat = (float)value;
break;
case MaterialParameterType::Vector2:
_asVector2 = (Vector2)value;
_asVector2 = (Float2)value;
break;
case MaterialParameterType::Vector3:
_asVector3 = (Vector3)value;
_asVector3 = (Float3)value;
break;
case MaterialParameterType::Vector4:
*(Vector4*)&AsData = (Vector4)value;
*(Float4*)&AsData = (Float4)value;
break;
case MaterialParameterType::Color:
_asColor = (Color)value;
@@ -335,19 +335,19 @@ void MaterialParameter::Bind(BindMeta& meta) const
*((float*)(meta.Constants.Get() + _offset)) = _asFloat;
break;
case MaterialParameterType::Vector2:
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector2));
*((Vector2*)(meta.Constants.Get() + _offset)) = _asVector2;
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Float2));
*((Float2*)(meta.Constants.Get() + _offset)) = _asVector2;
break;
case MaterialParameterType::Vector3:
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector3));
*((Vector3*)(meta.Constants.Get() + _offset)) = _asVector3;
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Float3));
*((Float3*)(meta.Constants.Get() + _offset)) = _asVector3;
break;
case MaterialParameterType::Vector4:
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector4));
*((Vector4*)(meta.Constants.Get() + _offset)) = *(Vector4*)&AsData;
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Float4));
*((Float4*)(meta.Constants.Get() + _offset)) = *(Float4*)&AsData;
break;
case MaterialParameterType::Color:
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector4));
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Float4));
*((Color*)(meta.Constants.Get() + _offset)) = _asColor;
break;
case MaterialParameterType::Matrix:
@@ -436,7 +436,7 @@ void MaterialParameter::Bind(BindMeta& meta) const
}
case MaterialParameterType::ChannelMask:
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(int32));
*((Vector4*)(meta.Constants.Get() + _offset)) = Vector4(_asInteger == 0, _asInteger == 1, _asInteger == 2, _asInteger == 3);
*((Float4*)(meta.Constants.Get() + _offset)) = Float4(_asInteger == 0, _asInteger == 1, _asInteger == 2, _asInteger == 3);
break;
case MaterialParameterType::GameplayGlobal:
if (_asAsset)
@@ -462,18 +462,30 @@ void MaterialParameter::Bind(BindMeta& meta) const
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(float));
*((float*)(meta.Constants.Get() + _offset)) = e->Value.AsFloat;
break;
case VariantType::Vector2:
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector2));
*((Vector2*)(meta.Constants.Get() + _offset)) = e->Value.AsVector2();
case VariantType::Float2:
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Float2));
*((Float2*)(meta.Constants.Get() + _offset)) = e->Value.AsFloat2();
break;
case VariantType::Vector3:
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector3));
*((Vector3*)(meta.Constants.Get() + _offset)) = e->Value.AsVector3();
case VariantType::Float3:
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Float3));
*((Float3*)(meta.Constants.Get() + _offset)) = e->Value.AsFloat3();
break;
case VariantType::Vector4:
case VariantType::Float4:
case VariantType::Color:
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector4));
*((Vector4*)(meta.Constants.Get() + _offset)) = e->Value.AsVector4();
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Float4));
*((Float4*)(meta.Constants.Get() + _offset)) = e->Value.AsFloat4();
break;
case VariantType::Double2:
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Float2));
*((Float2*)(meta.Constants.Get() + _offset)) = (Float2)e->Value.AsDouble2();
break;
case VariantType::Double3:
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Float3));
*((Float3*)(meta.Constants.Get() + _offset)) = (Float3)e->Value.AsDouble3();
break;
case VariantType::Double4:
ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Float4));
*((Float4*)(meta.Constants.Get() + _offset)) = (Float4)e->Value.AsDouble4();
break;
default: ;
}
@@ -535,7 +547,7 @@ void MaterialParameter::clone(const MaterialParameter* param)
_asVector3 = param->_asVector3;
break;
case MaterialParameterType::Vector4:
*(Vector4*)&AsData = *(Vector4*)&param->AsData;
*(Float4*)&AsData = *(Float4*)&param->AsData;
break;
case MaterialParameterType::Color:
_asColor = param->_asColor;
@@ -715,7 +727,7 @@ bool MaterialParams::Load(ReadStream* stream)
stream->Read(&param->_asVector3);
break;
case MaterialParameterType::Vector4:
stream->Read((Vector4*)&param->AsData);
stream->Read((Float4*)&param->AsData);
break;
case MaterialParameterType::Color:
stream->Read(&param->_asColor);
@@ -789,7 +801,7 @@ bool MaterialParams::Load(ReadStream* stream)
stream->Read(&param->_asVector3);
break;
case MaterialParameterType::Vector4:
stream->Read((Vector4*)&param->AsData);
stream->Read((Float4*)&param->AsData);
break;
case MaterialParameterType::Color:
stream->Read(&param->_asColor);
@@ -864,7 +876,7 @@ bool MaterialParams::Load(ReadStream* stream)
stream->Read(&param->_asVector3);
break;
case MaterialParameterType::Vector4:
stream->Read((Vector4*)&param->AsData);
stream->Read((Float4*)&param->AsData);
break;
case MaterialParameterType::Color:
stream->Read(&param->_asColor);
@@ -957,7 +969,7 @@ void MaterialParams::Save(WriteStream* stream)
stream->Write(&param->_asVector3);
break;
case MaterialParameterType::Vector4:
stream->Write((Vector4*)&param->AsData);
stream->Write((Float4*)&param->AsData);
break;
case MaterialParameterType::Color:
stream->Write(&param->_asColor);
@@ -1026,13 +1038,13 @@ void MaterialParams::Save(WriteStream* stream, const Array<SerializedMaterialPar
stream->WriteFloat(param.AsFloat);
break;
case MaterialParameterType::Vector2:
stream->Write(&param.AsVector2);
stream->Write(&param.AsFloat2);
break;
case MaterialParameterType::Vector3:
stream->Write(&param.AsVector3);
stream->Write(&param.AsFloat3);
break;
case MaterialParameterType::Vector4:
stream->Write((Vector4*)&param.AsData);
stream->Write((Float4*)&param.AsData);
break;
case MaterialParameterType::Color:
stream->Write(&param.AsColor);

View File

@@ -154,8 +154,8 @@ struct SerializedMaterialParam
bool AsBool;
int32 AsInteger;
float AsFloat;
Vector2 AsVector2;
Vector3 AsVector3;
Float2 AsFloat2;
Float3 AsFloat3;
Color AsColor;
Guid AsGuid;
byte AsData[16 * 4];
@@ -191,8 +191,8 @@ private:
bool _asBool;
int32 _asInteger;
float _asFloat;
Vector2 _asVector2;
Vector3 _asVector3;
Float2 _asVector2;
Float3 _asVector3;
Color _asColor;
byte AsData[16 * 4];
};

View File

@@ -10,7 +10,7 @@
/// <summary>
/// Current materials shader version.
/// </summary>
#define MATERIAL_GRAPH_VERSION 151
#define MATERIAL_GRAPH_VERSION 152
class Material;
class GPUShader;

View File

@@ -54,7 +54,7 @@ void ForwardShadingFeature::Bind(MaterialShader::BindParameters& params, Span<by
}
else
{
data.DirectionalLight.Color = Vector3::Zero;
data.DirectionalLight.Color = Float3::Zero;
data.DirectionalLight.CastShadows = 0.0f;
context->UnBindSR(dirLightShaderRegisterIndex);
}
@@ -93,7 +93,7 @@ void ForwardShadingFeature::Bind(MaterialShader::BindParameters& params, Span<by
}
else
{
data.EnvironmentProbe.Data1 = Vector4::Zero;
data.EnvironmentProbe.Data1 = Float4::Zero;
context->UnBindSR(envProbeShaderRegisterIndex);
}

View File

@@ -31,7 +31,7 @@ struct ForwardShadingFeature : MaterialShaderFeature
LightData SkyLight;
ProbeData EnvironmentProbe;
ExponentialHeightFogData ExponentialHeightFog;
Vector3 Dummy2;
Float3 Dummy2;
uint32 LocalLightsCount;
LightData LocalLights[MaxLocalLights];
});

View File

@@ -18,12 +18,12 @@ PACK_STRUCT(struct ParticleMaterialShaderData {
Matrix ViewProjectionMatrix;
Matrix WorldMatrix;
Matrix ViewMatrix;
Vector3 ViewPos;
Float3 ViewPos;
float ViewFar;
Vector3 ViewDir;
Float3 ViewDir;
float TimeParam;
Vector4 ViewInfo;
Vector4 ScreenSize;
Float4 ViewInfo;
Float4 ScreenSize;
uint32 SortedIndicesOffset;
float PerInstanceRandom;
int32 ParticleStride;
@@ -36,8 +36,8 @@ PACK_STRUCT(struct ParticleMaterialShaderData {
int32 ScaleOffset;
int32 ModelFacingModeOffset;
float RibbonUVTilingDistance;
Vector2 RibbonUVScale;
Vector2 RibbonUVOffset;
Float2 RibbonUVScale;
Float2 RibbonUVOffset;
int32 RibbonWidthOffset;
int32 RibbonTwistOffset;
int32 RibbonFacingVectorOffset;
@@ -119,13 +119,13 @@ void ParticleMaterialShader::Bind(BindParameters& params)
materialData->SortedIndicesOffset = drawCall.Particle.Particles->GPU.SortedIndices && params.RenderContext.View.Pass != DrawPass::Depth ? sortedIndicesOffset : 0xFFFFFFFF;
materialData->PerInstanceRandom = drawCall.PerInstanceRandom;
materialData->ParticleStride = drawCall.Particle.Particles->Stride;
materialData->PositionOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticlePosition, ParticleAttribute::ValueTypes::Vector3);
materialData->SpriteSizeOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleSpriteSize, ParticleAttribute::ValueTypes::Vector2);
materialData->PositionOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticlePosition, ParticleAttribute::ValueTypes::Float3);
materialData->SpriteSizeOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleSpriteSize, ParticleAttribute::ValueTypes::Float2);
materialData->SpriteFacingModeOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleSpriteFacingMode, ParticleAttribute::ValueTypes::Int, -1);
materialData->SpriteFacingVectorOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleSpriteFacingVector, ParticleAttribute::ValueTypes::Vector3);
materialData->VelocityOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleVelocityOffset, ParticleAttribute::ValueTypes::Vector3);
materialData->RotationOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleRotationOffset, ParticleAttribute::ValueTypes::Vector3, -1);
materialData->ScaleOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleScaleOffset, ParticleAttribute::ValueTypes::Vector3, -1);
materialData->SpriteFacingVectorOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleSpriteFacingVector, ParticleAttribute::ValueTypes::Float3);
materialData->VelocityOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleVelocityOffset, ParticleAttribute::ValueTypes::Float3);
materialData->RotationOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleRotationOffset, ParticleAttribute::ValueTypes::Float3, -1);
materialData->ScaleOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleScaleOffset, ParticleAttribute::ValueTypes::Float3, -1);
materialData->ModelFacingModeOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleModelFacingModeOffset, ParticleAttribute::ValueTypes::Int, -1);
Matrix::Invert(drawCall.World, materialData->WorldMatrixInverseTransposed);
}
@@ -159,7 +159,7 @@ void ParticleMaterialShader::Bind(BindParameters& params)
materialData->RibbonWidthOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleRibbonWidth, ParticleAttribute::ValueTypes::Float, -1);
materialData->RibbonTwistOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleRibbonTwist, ParticleAttribute::ValueTypes::Float, -1);
materialData->RibbonFacingVectorOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleRibbonFacingVector, ParticleAttribute::ValueTypes::Vector3, -1);
materialData->RibbonFacingVectorOffset = drawCall.Particle.Particles->Layout->FindAttributeOffset(ParticleRibbonFacingVector, ParticleAttribute::ValueTypes::Float3, -1);
materialData->RibbonUVTilingDistance = drawCall.Particle.Ribbon.UVTilingDistance;
materialData->RibbonUVScale.X = drawCall.Particle.Ribbon.UVScaleX;

View File

@@ -11,13 +11,13 @@
PACK_STRUCT(struct PostFxMaterialShaderData {
Matrix ViewMatrix;
Vector3 ViewPos;
Float3 ViewPos;
float ViewFar;
Vector3 ViewDir;
Float3 ViewDir;
float TimeParam;
Vector4 ViewInfo;
Vector4 ScreenSize;
Vector4 TemporalAAJitter;
Float4 ViewInfo;
Float4 ScreenSize;
Float4 TemporalAAJitter;
});
void PostFxMaterialShader::Bind(BindParameters& params)

View File

@@ -19,22 +19,22 @@ PACK_STRUCT(struct TerrainMaterialShaderData {
Matrix ViewProjectionMatrix;
Matrix WorldMatrix;
Matrix ViewMatrix;
Vector3 ViewPos;
Float3 ViewPos;
float ViewFar;
Vector3 ViewDir;
Float3 ViewDir;
float TimeParam;
Vector4 ViewInfo;
Vector4 ScreenSize;
Vector3 WorldInvScale;
Float4 ViewInfo;
Float4 ScreenSize;
Float3 WorldInvScale;
float WorldDeterminantSign;
float PerInstanceRandom;
float CurrentLOD; // Index of the current LOD
float ChunkSizeNextLOD; // ChunkSize for the next current LOD (after applying LOD down-scaling)
float TerrainChunkSizeLOD0; // Size of the terrain chunk in world units of the top-most LOD0
Vector4 HeightmapUVScaleBias; // xy-scale, zw-offset for chunk geometry UVs into heightmap UVs (as single MAD instruction)
Vector4 NeighborLOD; // Per component LOD index for chunk neighbors ordered: top, left, right, bottom
Vector2 OffsetUV; // Offset applied to the texture coordinates (used to implement seamless UVs based on chunk location relative to terrain root)
Vector2 Dummy0;
Float4 HeightmapUVScaleBias; // xy-scale, zw-offset for chunk geometry UVs into heightmap UVs (as single MAD instruction)
Float4 NeighborLOD; // Per component LOD index for chunk neighbors ordered: top, left, right, bottom
Float2 OffsetUV; // Offset applied to the texture coordinates (used to implement seamless UVs based on chunk location relative to terrain root)
Float2 Dummy0;
});
DrawPass TerrainMaterialShader::GetDrawModes() const
@@ -83,10 +83,10 @@ void TerrainMaterialShader::Bind(BindParameters& params)
materialData->TimeParam = params.TimeParam;
materialData->ViewInfo = view.ViewInfo;
materialData->ScreenSize = view.ScreenSize;
const float scaleX = Vector3(drawCall.World.M11, drawCall.World.M12, drawCall.World.M13).Length();
const float scaleY = Vector3(drawCall.World.M21, drawCall.World.M22, drawCall.World.M23).Length();
const float scaleZ = Vector3(drawCall.World.M31, drawCall.World.M32, drawCall.World.M33).Length();
materialData->WorldInvScale = Vector3(
const float scaleX = Float3(drawCall.World.M11, drawCall.World.M12, drawCall.World.M13).Length();
const float scaleY = Float3(drawCall.World.M21, drawCall.World.M22, drawCall.World.M23).Length();
const float scaleZ = Float3(drawCall.World.M31, drawCall.World.M32, drawCall.World.M33).Length();
materialData->WorldInvScale = Float3(
scaleX > 0.00001f ? 1.0f / scaleX : 0.0f,
scaleY > 0.00001f ? 1.0f / scaleY : 0.0f,
scaleZ > 0.00001f ? 1.0f / scaleZ : 0.0f);

View File

@@ -20,18 +20,18 @@ PACK_STRUCT(struct VolumeParticleMaterialShaderData {
Matrix ViewMatrix;
Matrix WorldMatrix;
Matrix WorldMatrixInverseTransposed;
Vector3 ViewPos;
Float3 ViewPos;
float ViewFar;
Vector3 ViewDir;
Float3 ViewDir;
float TimeParam;
Vector4 ViewInfo;
Vector4 ScreenSize;
Vector3 GridSize;
Float4 ViewInfo;
Float4 ScreenSize;
Float3 GridSize;
float PerInstanceRandom;
float Dummy0;
float VolumetricFogMaxDistance;
int ParticleStride;
int ParticleIndex;
int32 ParticleStride;
int32 ParticleIndex;
});
DrawPass VolumeParticleMaterialShader::GetDrawModes() const