Tuple <IRenderableTexture, float> IAlphaTexturesProvider.GetTexture(IDeviceContextHolder contextHolder, uint materialId) { if (!_cache.TryGetValue(materialId, out var result)) { if (_texturesProvider == null) { _texturesProvider = new Kn5TexturesProvider(_kn5, false); } result = new Tuple <IRenderableTexture, float>[] { null }; var material = _kn5.GetMaterial(materialId); if (material != null && (material.BlendMode != Kn5MaterialBlendMode.Opaque || material.AlphaTested)) { var shader = material.ShaderName; var normalsAlpha = shader == "ksPerPixelNM" || shader == "ksPerPixelNM_UV2" || shader.Contains("_AT") || shader == "ksSkinnedMesh"; if (normalsAlpha || !shader.Contains("MultiMap") && shader != "ksTyres" && shader != "ksBrakeDisc") { var textureName = material.GetMappingByName(normalsAlpha ? "txNormal" : "txDiffuse")?.Texture; var alphaRef = material.GetPropertyValueAByName("ksAlphaRef"); if (textureName != null && !shader.Contains("damage")) { result = new[] { Tuple.Create(_texturesProvider.GetTexture(contextHolder, textureName), alphaRef) }; } } } _cache[materialId] = result; } return(result[0]); }
Tuple <IRenderableTexture, float> INormalsNormalTexturesProvider.GetTexture(IDeviceContextHolder contextHolder, uint materialId) { if (!_cache.TryGetValue(materialId, out var result)) { if (_texturesProvider == null) { _texturesProvider = new Kn5TexturesProvider(_kn5, false); } var material = _kn5.GetMaterial(materialId); var textureName = material?.GetMappingByName("txNormal")?.Texture; if (textureName != null && !material.ShaderName.Contains("damage")) { var texture = _texturesProvider.GetTexture(contextHolder, textureName); result = new[] { Tuple.Create(texture, material.GetPropertyValueAByName("normalMult") + 1f) }; } else { result = new Tuple <IRenderableTexture, float>[] { null }; } _cache[materialId] = result; } return(result[0]); }