| 42 | } |
| 43 | |
| 44 | void TerrainMaterialShader::Bind(BindParameters& params) |
| 45 | { |
| 46 | // Prepare |
| 47 | auto context = params.GPUContext; |
| 48 | auto& view = params.RenderContext.View; |
| 49 | auto& drawCall = *params.DrawCall; |
| 50 | Span<byte> cb(_cbData.Get(), _cbData.Count()); |
| 51 | ASSERT_LOW_LAYER(cb.Length() >= sizeof(TerrainMaterialShaderData)); |
| 52 | auto materialData = reinterpret_cast<TerrainMaterialShaderData*>(cb.Get()); |
| 53 | cb = cb.Slice(sizeof(TerrainMaterialShaderData)); |
| 54 | int32 srv = 3; |
| 55 | |
| 56 | // Setup features |
| 57 | const bool useLightmap = LightmapFeature::Bind(params, cb, srv); |
| 58 | |
| 59 | // Setup parameters |
| 60 | MaterialParameter::BindMeta bindMeta; |
| 61 | bindMeta.Context = context; |
| 62 | bindMeta.Constants = cb; |
| 63 | bindMeta.Input = nullptr; |
| 64 | bindMeta.Buffers = params.RenderContext.Buffers; |
| 65 | bindMeta.CanSampleDepth = false; |
| 66 | bindMeta.CanSampleGBuffer = false; |
| 67 | MaterialParams::Bind(params.ParamsLink, bindMeta); |
| 68 | |
| 69 | // Setup material constants |
| 70 | { |
| 71 | materialData->WorldMatrix.SetMatrixTranspose(drawCall.World); |
| 72 | const float scaleX = Float3(drawCall.World.M11, drawCall.World.M12, drawCall.World.M13).Length(); |
| 73 | const float scaleY = Float3(drawCall.World.M21, drawCall.World.M22, drawCall.World.M23).Length(); |
| 74 | const float scaleZ = Float3(drawCall.World.M31, drawCall.World.M32, drawCall.World.M33).Length(); |
| 75 | materialData->WorldInvScale = Float3( |
| 76 | scaleX > 0.00001f ? 1.0f / scaleX : 0.0f, |
| 77 | scaleY > 0.00001f ? 1.0f / scaleY : 0.0f, |
| 78 | scaleZ > 0.00001f ? 1.0f / scaleZ : 0.0f); |
| 79 | materialData->WorldDeterminantSign = drawCall.WorldDeterminant ? -1.0f : 1.0f; |
| 80 | materialData->PerInstanceRandom = drawCall.PerInstanceRandom; |
| 81 | materialData->CurrentLOD = drawCall.Terrain.CurrentLOD; |
| 82 | materialData->ChunkSizeNextLOD = drawCall.Terrain.ChunkSizeNextLOD; |
| 83 | materialData->TerrainChunkSizeLOD0 = drawCall.Terrain.TerrainChunkSizeLOD0; |
| 84 | materialData->HeightmapUVScaleBias = drawCall.Terrain.HeightmapUVScaleBias; |
| 85 | materialData->NeighborLOD = drawCall.Terrain.NeighborLOD; |
| 86 | materialData->OffsetUV = drawCall.Terrain.OffsetUV; |
| 87 | materialData->LightmapArea = *(Float4*)&drawCall.Terrain.LightmapUVsArea; |
| 88 | } |
| 89 | |
| 90 | // Bind terrain textures |
| 91 | GPUTexture* heightmap, *splatmap0, *splatmap1; |
| 92 | drawCall.Terrain.Patch->GetTextures(heightmap, splatmap0, splatmap1); |
| 93 | context->BindSR(0, heightmap); |
| 94 | context->BindSR(1, splatmap0); |
| 95 | context->BindSR(2, splatmap1); |
| 96 | |
| 97 | // Bind constants |
| 98 | if (_cb) |
| 99 | { |
| 100 | context->UpdateCB(_cb, _cbData.Get()); |
| 101 | context->BindCB(0, _cb); |
nothing calls this directly
no test coverage detected