Skip to content

Commit

Permalink
interior offset
Browse files Browse the repository at this point in the history
  • Loading branch information
turanszkij committed Jan 25, 2025
1 parent 1b30fe9 commit 9b1bc16
Show file tree
Hide file tree
Showing 10 changed files with 102 additions and 17 deletions.
Binary file added Content/models/interior_mapping.wiscene
Binary file not shown.
75 changes: 72 additions & 3 deletions Editor/MaterialWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -789,6 +789,48 @@ void MaterialWindow::Create(EditorComponent* _editor)
});
AddWidget(&interiorScaleZSlider);

interiorOffsetXSlider.Create(-10, 10, 0, 2000, "Interior Offset X: ");
interiorOffsetXSlider.SetTooltip("Set the cubemap offset for the interior mapping (if material uses interior mapping shader)");
interiorOffsetXSlider.OnSlide([&](wi::gui::EventArgs args) {
wi::scene::Scene& scene = editor->GetCurrentScene();
for (auto& x : editor->translator.selected)
{
MaterialComponent* material = get_material(scene, x);
if (material == nullptr)
continue;
material->SetInteriorMappingOffset(XMFLOAT3(args.fValue, material->interiorMappingOffset.y, material->interiorMappingOffset.z));
}
});
AddWidget(&interiorOffsetXSlider);

interiorOffsetYSlider.Create(-10, 10, 0, 2000, "Interior Offset Y: ");
interiorOffsetYSlider.SetTooltip("Set the cubemap offset for the interior mapping (if material uses interior mapping shader)");
interiorOffsetYSlider.OnSlide([&](wi::gui::EventArgs args) {
wi::scene::Scene& scene = editor->GetCurrentScene();
for (auto& x : editor->translator.selected)
{
MaterialComponent* material = get_material(scene, x);
if (material == nullptr)
continue;
material->SetInteriorMappingOffset(XMFLOAT3(material->interiorMappingOffset.x, args.fValue, material->interiorMappingOffset.z));
}
});
AddWidget(&interiorOffsetYSlider);

interiorOffsetZSlider.Create(-10, 10, 0, 2000, "Interior Offset Z: ");
interiorOffsetZSlider.SetTooltip("Set the cubemap offset for the interior mapping (if material uses interior mapping shader)");
interiorOffsetZSlider.OnSlide([&](wi::gui::EventArgs args) {
wi::scene::Scene& scene = editor->GetCurrentScene();
for (auto& x : editor->translator.selected)
{
MaterialComponent* material = get_material(scene, x);
if (material == nullptr)
continue;
material->SetInteriorMappingOffset(XMFLOAT3(material->interiorMappingOffset.x, material->interiorMappingOffset.y, args.fValue));
}
});
AddWidget(&interiorOffsetZSlider);


//
hei = 20;
Expand Down Expand Up @@ -1231,6 +1273,9 @@ void MaterialWindow::SetEntity(Entity entity)
interiorScaleXSlider.SetValue(material->interiorMappingScale.x);
interiorScaleYSlider.SetValue(material->interiorMappingScale.y);
interiorScaleZSlider.SetValue(material->interiorMappingScale.z);
interiorOffsetXSlider.SetValue(material->interiorMappingOffset.x);
interiorOffsetYSlider.SetValue(material->interiorMappingOffset.y);
interiorOffsetZSlider.SetValue(material->interiorMappingOffset.z);

shadingRateComboBox.SetEnabled(wi::graphics::GetDevice()->CheckCapability(GraphicsDeviceCapability::VARIABLE_RATE_SHADING));

Expand Down Expand Up @@ -1301,6 +1346,9 @@ void MaterialWindow::ResizeLayout()
y += padding;
};

Scene& scene = editor->GetCurrentScene();
MaterialComponent* material = scene.materials.GetComponent(entity);

add_fullwidth(materialNameField);
add_right(shadowReceiveCheckBox);
add_right(shadowCasterCheckBox);
Expand Down Expand Up @@ -1343,9 +1391,30 @@ void MaterialWindow::ResizeLayout()
add(clearcoatSlider);
add(clearcoatRoughnessSlider);
add(blendTerrainSlider);
add(interiorScaleXSlider);
add(interiorScaleYSlider);
add(interiorScaleZSlider);
if (material != nullptr && material->shaderType == MaterialComponent::SHADERTYPE_INTERIORMAPPING)
{
interiorScaleXSlider.SetVisible(true);
interiorScaleYSlider.SetVisible(true);
interiorScaleZSlider.SetVisible(true);
interiorOffsetXSlider.SetVisible(true);
interiorOffsetYSlider.SetVisible(true);
interiorOffsetZSlider.SetVisible(true);
add(interiorScaleXSlider);
add(interiorScaleYSlider);
add(interiorScaleZSlider);
add(interiorOffsetXSlider);
add(interiorOffsetYSlider);
add(interiorOffsetZSlider);
}
else
{
interiorScaleXSlider.SetVisible(false);
interiorScaleYSlider.SetVisible(false);
interiorScaleZSlider.SetVisible(false);
interiorOffsetXSlider.SetVisible(false);
interiorOffsetYSlider.SetVisible(false);
interiorOffsetZSlider.SetVisible(false);
}
add(colorComboBox);
add_fullwidth(colorPicker);
add(textureSlotComboBox);
Expand Down
3 changes: 3 additions & 0 deletions Editor/MaterialWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ class MaterialWindow : public wi::gui::Window
wi::gui::Slider interiorScaleXSlider;
wi::gui::Slider interiorScaleYSlider;
wi::gui::Slider interiorScaleZSlider;
wi::gui::Slider interiorOffsetXSlider;
wi::gui::Slider interiorOffsetYSlider;
wi::gui::Slider interiorOffsetZSlider;

wi::gui::ComboBox colorComboBox;
wi::gui::ColorPicker colorPicker;
Expand Down
7 changes: 4 additions & 3 deletions WickedEngine/shaders/ShaderInterop_Renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,7 @@ struct alignas(16) ShaderMaterial
uint2 aniso_anisosin_anisocos_terrainblend;

uint2 interiorscale;
uint2 padding;
uint2 interioroffset;

int sampler_descriptor;
uint options_stencilref;
Expand Down Expand Up @@ -405,8 +405,8 @@ struct alignas(16) ShaderMaterial
transmission_sheenroughness_clearcoat_clearcoatroughness = uint2(0, 0);
aniso_anisosin_anisocos_terrainblend = uint2(0, 0);

interiorscale = uint2(0, 0); // packed half3 + unused half
padding = uint2(0, 0);
interiorscale = uint2(0, 0);
interioroffset = uint2(0, 0);

sampler_descriptor = -1;
options_stencilref = 0;
Expand Down Expand Up @@ -448,6 +448,7 @@ struct alignas(16) ShaderMaterial
inline half GetAnisotropyCos() { return unpack_half4(aniso_anisosin_anisocos_terrainblend).z; }
inline half GetTerrainBlendRcp() { return unpack_half4(aniso_anisosin_anisocos_terrainblend).w; }
inline half3 GetInteriorScale() { return unpack_half3(interiorscale); }
inline half3 GetInteriorOffset() { return unpack_half3(interioroffset); }
inline uint GetStencilRef() { return options_stencilref >> 24u; }
#endif // __cplusplus

Expand Down
2 changes: 1 addition & 1 deletion WickedEngine/shaders/objectHF.hlsli
Original file line number Diff line number Diff line change
Expand Up @@ -1068,7 +1068,7 @@ float4 main(PixelInput input, in bool is_frontface : SV_IsFrontFace) : SV_Target
#endif // UNLIT

#ifdef INTERIORMAPPING
color = surface.baseColor * InteriorMapping(surface, material, meshinstance);
color = surface.baseColor * InteriorMapping(surface.P, surface.N, surface.V, material, meshinstance);
#endif // INTERIORMAPPING


Expand Down
19 changes: 10 additions & 9 deletions WickedEngine/shaders/shadingHF.hlsli
Original file line number Diff line number Diff line change
Expand Up @@ -668,7 +668,7 @@ inline uint AlphaToCoverage(half alpha, half alphaTest, float4 svposition)
return 0;
}

half4 InteriorMapping(in Surface surface, in ShaderMaterial material, in ShaderMeshInstance meshinstance)
half4 InteriorMapping(in float3 P, in float3 N, in float3 V, in ShaderMaterial material, in ShaderMeshInstance meshinstance)
{
[branch]
if (!material.textures[BASECOLORMAP].IsValid())
Expand All @@ -680,26 +680,27 @@ half4 InteriorMapping(in Surface surface, in ShaderMaterial material, in ShaderM
// to not increase common structure sizes for single shader that would require these things!

half3 scale = material.GetInteriorScale();
float4x4 scaleMatrix = float4x4(
scale.x, 0, 0, 0,
0, scale.y, 0, 0,
0, 0, scale.z, 0,
half3 offset = material.GetInteriorOffset();
float4x4 modMatrix = float4x4(
scale.x, 0, 0, offset.x,
0, scale.y, 0, offset.y,
0, 0, scale.z, offset.z,
0, 0, 0, 1
);
float4x4 interiorTransform = mul(meshinstance.transformRaw.GetMatrix(), scaleMatrix);
float4x4 interiorTransform = mul(meshinstance.transformRaw.GetMatrix(), modMatrix);
float4x4 interiorProjection = inverse(interiorTransform);
const half3 clipSpacePos = mul(interiorProjection, float4(surface.P, 1)).xyz;
const half3 clipSpacePos = mul(interiorProjection, float4(P, 1)).xyz;

// We can handle distortion by normals with refract:
half3 R = refract(-surface.V, surface.N, 1 - material.GetRefraction());
half3 R = refract(-V, N, 1 - material.GetRefraction());

// This part is exactly like the local environment probes parallax correction:
half3 RayLS = mul((half3x3)interiorProjection, R);
half3 FirstPlaneIntersect = (1 - clipSpacePos) / RayLS;
half3 SecondPlaneIntersect = (-1 - clipSpacePos) / RayLS;
half3 FurthestPlane = max(FirstPlaneIntersect, SecondPlaneIntersect);
half Distance = min(FurthestPlane.x, min(FurthestPlane.y, FurthestPlane.z));
half3 R_parallaxCorrected = surface.P - meshinstance.center + R * Distance;
half3 R_parallaxCorrected = P - meshinstance.center + R * Distance;

// By rotating the sampling vector I fix the cube projection to the object's rotation:
float3 t, s;
Expand Down
2 changes: 1 addition & 1 deletion WickedEngine/shaders/visibility_surfaceCS.hlsl
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ void main(uint Gid : SV_GroupID, uint groupIndex : SV_GroupIndex)
}

#ifdef INTERIORMAPPING
surface.baseColor *= InteriorMapping(surface, surface.material, surface.inst);
surface.baseColor *= InteriorMapping(surface.P, surface.N, surface.V, surface.material, surface.inst);
#endif // INTERIORMAPPING

#if defined(UNLIT) || defined(INTERIORMAPPING)
Expand Down
1 change: 1 addition & 0 deletions WickedEngine/wiScene_Components.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ namespace wi::scene
}
material.aniso_anisosin_anisocos_terrainblend = pack_half4(_anisotropy_strength, _anisotropy_rotation_sin, _anisotropy_rotation_cos, _blend_with_terrain_height_rcp);
material.interiorscale = pack_half3(interiorMappingScale);
material.interioroffset = pack_half3(interiorMappingOffset);
material.shaderType = (uint)shaderType;
material.userdata = userdata;

Expand Down
8 changes: 8 additions & 0 deletions WickedEngine/wiScene_Components.h
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ namespace wi::scene
float texAnimElapsedTime = 0.0f;

XMFLOAT3 interiorMappingScale = XMFLOAT3(1, 1, 1);
XMFLOAT3 interiorMappingOffset = XMFLOAT3(0, 0, 0);

enum TEXTURESLOT
{
Expand Down Expand Up @@ -351,6 +352,13 @@ namespace wi::scene
interiorMappingScale.y = value.y;
interiorMappingScale.z = value.z;
}
inline void SetInteriorMappingOffset(XMFLOAT3 value)
{
SetDirty();
interiorMappingOffset.x = value.x;
interiorMappingOffset.y = value.y;
interiorMappingOffset.z = value.z;
}

// The MaterialComponent will be written to ShaderMaterial (a struct that is optimized for GPU use)
void WriteShaderMaterial(ShaderMaterial* dest) const;
Expand Down
2 changes: 2 additions & 0 deletions WickedEngine/wiScene_Serializers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,7 @@ namespace wi::scene
if (seri.GetVersion() >= 9)
{
archive >> interiorMappingScale;
archive >> interiorMappingOffset;
}

for (auto& x : textures)
Expand Down Expand Up @@ -428,6 +429,7 @@ namespace wi::scene
if (seri.GetVersion() >= 9)
{
archive << interiorMappingScale;
archive << interiorMappingOffset;
}
}
}
Expand Down

0 comments on commit 9b1bc16

Please sign in to comment.