From 2a5c77f43ff1d69e78f12f13435a38c5eb2ed854 Mon Sep 17 00:00:00 2001 From: Pokechu22 Date: Wed, 13 Apr 2022 22:03:34 -0700 Subject: VideoCommon: Handle emboss texgen with only a single normal Fixes a large number of effects in Rogue Squadron 2 and 3. --- Source/Core/VideoCommon/VertexLoader_Normal.cpp | 30 ++++++++++++++++--------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'Source/Core/VideoCommon/VertexLoader_Normal.cpp') diff --git a/Source/Core/VideoCommon/VertexLoader_Normal.cpp b/Source/Core/VideoCommon/VertexLoader_Normal.cpp index 254bcacff3..db955639d7 100644 --- a/Source/Core/VideoCommon/VertexLoader_Normal.cpp +++ b/Source/Core/VideoCommon/VertexLoader_Normal.cpp @@ -40,14 +40,22 @@ constexpr float FracAdjust(float val) } template -void ReadIndirect(const T* data) +void ReadIndirect(VertexLoader* loader, const T* data) { static_assert(3 == N || 9 == N, "N is only sane as 3 or 9!"); DataReader dst(g_vertex_manager_write_ptr, nullptr); for (u32 i = 0; i < N; ++i) { - dst.Write(FracAdjust(Common::FromBigEndian(data[i]))); + const float value = FracAdjust(Common::FromBigEndian(data[i])); + if (loader->m_remaining == 0) + { + if (i >= 3 && i < 6) + VertexLoaderManager::tangent_cache[i - 3] = value; + else if (i >= 6 && i < 9) + VertexLoaderManager::binormal_cache[i - 6] = value; + } + dst.Write(value); } g_vertex_manager_write_ptr = dst.GetPointer(); @@ -57,10 +65,10 @@ void ReadIndirect(const T* data) template struct Normal_Direct { - static void function([[maybe_unused]] VertexLoader* loader) + static void function(VertexLoader* loader) { const auto source = reinterpret_cast(DataGetPosition()); - ReadIndirect(source); + ReadIndirect(loader, source); DataSkip(); } @@ -68,7 +76,7 @@ struct Normal_Direct }; template -void Normal_Index_Offset() +void Normal_Index_Offset(VertexLoader* loader) { static_assert(std::is_unsigned_v, "Only unsigned I is sane!"); @@ -76,24 +84,24 @@ void Normal_Index_Offset() const auto data = reinterpret_cast( VertexLoaderManager::cached_arraybases[CPArray::Normal] + (index * g_main_cp_state.array_strides[CPArray::Normal]) + sizeof(T) * 3 * Offset); - ReadIndirect(data); + ReadIndirect(loader, data); } template struct Normal_Index { - static void function([[maybe_unused]] VertexLoader* loader) { Normal_Index_Offset(); } + static void function(VertexLoader* loader) { Normal_Index_Offset(loader); } static constexpr u32 size = sizeof(I); }; template struct Normal_Index_Indices3 { - static void function([[maybe_unused]] VertexLoader* loader) + static void function(VertexLoader* loader) { - Normal_Index_Offset(); - Normal_Index_Offset(); - Normal_Index_Offset(); + Normal_Index_Offset(loader); + Normal_Index_Offset(loader); + Normal_Index_Offset(loader); } static constexpr u32 size = sizeof(I) * 3; -- cgit v1.2.3