render: never adopt a material's own surface map as streamed ad art
This commit is contained in:
parent
a6efbc9553
commit
5e52ef82e4
1 changed files with 20 additions and 1 deletions
|
|
@ -2430,7 +2430,26 @@ void AdoptDrawFetchOverrides(uint8_t* base, DrawItem& item) {
|
|||
phys_base(slot3[1]) == phys_base(lm_w1);
|
||||
// Dimension floor: never adopt a placeholder-sized s4 (an idle ad
|
||||
// rotation slot) over whatever the channel resolves to.
|
||||
if (main_pass && (art_w >= 32 || art_h >= 32)) {
|
||||
//
|
||||
// Own-channel guard: on families whose s4 carries a surface map
|
||||
// rather than art (environment.default binds its detail normal map
|
||||
// there), the stub gate alone is not enough. A material demoted by
|
||||
// the streamer has a stub-sized diffuse too, and adopting s4 then
|
||||
// serves the material's OWN detail/spec/normal map as the diffuse
|
||||
// (distant demoted tree trunks rendered as their flat blue normal
|
||||
// map). Real event-ad art is never one of the material's own channel
|
||||
// textures, so any s4 that matches one is a normal binding, not a
|
||||
// rebind worth adopting.
|
||||
const auto s4_is_own_channel = [&](uint32_t chan_tex) {
|
||||
uint32_t own_w1 = 0;
|
||||
return chan_tex != 0 &&
|
||||
GuestTryLoadU32(base, chan_tex + 8 * 4, &own_w1) &&
|
||||
phys_base(slot4[1]) == phys_base(own_w1);
|
||||
};
|
||||
const bool s4_is_own = s4_is_own_channel(item.detail_tex) ||
|
||||
s4_is_own_channel(item.spec_tex) ||
|
||||
s4_is_own_channel(item.water_normal);
|
||||
if (main_pass && !s4_is_own && (art_w >= 32 || art_h >= 32)) {
|
||||
if (item.env_family == 3) {
|
||||
uint32_t da_w1 = 0;
|
||||
if (item.decal_art != 0 &&
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue