Skip to content

Book Texture Inconsistencies (#243 Revisited) #269

@patmauro

Description

@patmauro

Intro

I opened #243 last year to mirror a change I pushed to MOULa, which attempts to make some improvements to the way book textures are handled in the game by making them all more internally consistent - but I think I bit off a little more than we could chew with this one: not only is this a difficult one to review, due to changing 22 PRPs at once, but the other big problem is that I came to you with a solution already in mind, without having given any time to actually discuss the problem in the abstract and then come up with a strategy that would make sense for this repo prior to submitting a PR. This is absolutely my bad, and I want to try this a different way this time.

By opening this up as an Issue, I want to give us a space where I can go over my findings here a little more thoroughly and give an opportunity for some brainstorming here so we have an opportunity to settle on a strategy that would make sense for this Repo before I come back with some PRs that would replace #243.

The Issues

  1. Book textures are internally inconsistent for the same model across Ages. Specifically: "islmDniBook_side" and "islmDniBook_page" variants are wildly inconsistent across the game's PRPs; ideally, these should all match.
  2. "islmDniBook_side" mostly uses a comically undersized 8x64 variant which looks awful in-game, even for 2003. I genuinely think this stands out like a sore thumb compared to the rest of the game, to an extent I actually find somewhat embarrassing, and this undersized texture really deserves to be axed from the game & improved. Several Ages already utilize the full-size 64x512 texture and a few use a medium-sized 32x256 texture.
  3. "islmDniBook_page" has several ugly yellow splotches, and in general is undersized as well, but this is less of an issue here. Newer iterations have solved this either by using the texture xbooknewpage*0#0.hsm which is a "fixed" version of islmDniBook_Page, or by replacing islmDniBook_Page with a texture that is essentially the same thing as xbooknewpage.

IslmDniBook_Side

Again, this is my highest priority issue here - the 8x64 texture is unacceptable and the most noticeable issue here.

5 (soon to be 6) Ages already use the full-size 64x512 texture for this - it makes a big difference and I'd argue this should probably just be the standard. The 256 variant is acceptable, but is still inconsistent since many Ages already use 512 (and this number usually increases when new Ages are converted through Korman).

64 Texture (rotated)
image
64 Example
image

256 Texture (rotated)
image
256 Example
image

512 Texture (rotated)
image
512 Example
image

Strategies: Of the two pieces of this puzzle, this is the much simpler piece. My original proposal (and what went into MOULa) involved switching all Ages to 512 for consistency - but since there are texture budget concerns, I think we could re-think this; I could settle for abandoning the idea of making these "consistent" and just bumping the smallest ones up to 256. I could also see this being an entirely separate PR from the "Page" issue I outline below, as this gets a little more complicated.

Age Side Texture Name Current Size Original Proposal from #243: Notes
Ahnonay islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)
AhnonayCathedral islmDniBook_side.dds 64x512 (Full) No Change May have benefitted from a prior Korman conversion which cleaned this up.
BaronCityOffice islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)
City islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)
Dereno islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)
EderDelin islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)
EderTsogal islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)
Ercana islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)
ErcanaCitySilo islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)
Garden islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)
Garrison islmdnibook_side*0#0.hsm 64x512 (Full) No Change Makes sense that this is used here due to the Maintainer's Nexus.
Gira islmdnibook_side*0#0.hsm 64x512 (Full) No Change
GreatTreePub islmDniBook_side.dds 64x512 (Full) No Change May have benefitted from a prior Korman conversion which cleaned this up.
GreatZero islmdnibook_side*0#0.hsm 32x256 (Medium) 64x512 (Full)
Kadish islmdnibook_side*0#0.hsm 32x256 (Medium) 64x512 (Full)
Kveer islmdnibook_side_0_0.dds 8x64 (Smallest) 64x512 (Full)
Myst N/A N/A No Change NOTE: Myst does have a hidden book model, but it does not use islmdnibook_side and thus is not in scope here.
Negilahn islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)
Neighborhood islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)
Neighborhood02 islmdnibook_side*0#0.hsm 8x64 (Smallest) Superseded by #250 #250 replaces this with a texture named "islmdnibook_side.dds" which is the full size. Thus, no change needed if merged.
Nexus islmdnibook_side*0#0.hsm 64x512 (Full) No Change Makes sense for full size to be used here since the spine goes close to player's face.
Payiferen islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)
Personal islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)
PhilRelto islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full) This is for the hidden books in the hydrants. May not be strictly necessary, but would be good for consistency.
Spyoom islmdnibook_side_0_0.dds 8x64 (Smallest) 64x512 (Full)
Teledahn islmdnibook_side*0#0.hsm 32x256 (Medium) 64x512 (Full)
Tetsonot islmdnibook_side*0#0.hsm 8x64 (Smallest) 64x512 (Full)

IslmDniBook_Page & IslmDniBook_Page1

This is where it gets a little more complicated as there are several sub-factors involved here beyond just size.

First: The difference between "Page" & "Page1" - This is an interesting case, because if you check the source files, you will see the source image is actually the same for both of these, despite being 2 different assets. This is because at full size, these "collapse" into the same image, but at smaller sizes, these diverge and become two separate images - one grainier, and one smoother, as though 2 separate compression mechanisms were used. In game this seems to be used to provide a little visual diversity between how the pages look, however many Ages simply collapse these down into one asset, or better yet, replace both of these with "xbooknewpage" outright, which is always full-size.

Second: In all sizes and variants, there is a series of ugly yellow splotches on the page. This is corrected in the texture xBookNewPage, which many newer Ages either use instead, or have replaced their IslmDniBook_Page instance with a texture that essentially looks the same as xBookNewPage.

Third: In many cases, due to new content being added over time, etc, there is sometimes a duplicate asset for one of the Page textures at a smaller size. There's really no reason these should be two separate assets, and in these cases, ideally the smaller one should be removed in favor of the larger version of this texture already in use in the PRP. But this would probably require a re-export of the PRP that is outside my current ability. This may be due to a relto page in the Age using the higher-quality page texture as the baseline for the relto page rather than the book.

Note: Unlike IslmDniBook_Size, these textures all use a naming convention that DIRECTLY corresponds to their image size (#0 indicates original size, #2 indicates medium size, #3 indicates smallest size). It's one of many reasons I'd be open to not changing the sizes here if we can come up with new textures that address the splotches.

Page & Page1 at 64:
image image

64 Page1 (left) and Page (right) In-Game:
image

Page & Page1 at 128:
image image

128 Page1 (left) and Page (right) In-Game:
image

Page & Page1 at 512 (same image):
image

512 Page1 (left) and Page (right) In-Game:
image

Page at 512 with yellow smudges corrected:
image

Splotchless 512 Page1 (left) and Page (right) In-Game:
image

Strategies: My original proposal (and what went into MOULa) makes all Page textures consistently full sized and splotchless - but this one especially can probably be handled a little smarter. In an ideal world, we would remove all duplicates and size up all textures to the full size. But even in this ideal case, it still poses a small problem, where Page and Page1 are no longer "unique" assets, since at 512 they "become" the same image. Again, in my original solution I just sized everything up to the 512 splotchless variant - but to be frank, I'm less concerned about the size here and more concerned about removing the splotches. Bear in mind, though - keeping the smaller sizes and removing the splotches wouldn't really be possible without introducing image loss, since we don't have the "resized" variants in Sources. So to go this route, we'd have to use xBookNewPage as a starting point and then figure out how to size this down in two different ways, so we can re-create both the "grainy" and "smooth" compression styles respectively. That being said - bumping to at least 128 is still probably warranted in this case. Alternatively: we could go full-size, but merge down all instances of the page texture to a single asset, similar to how Cathedral, Watchers' & Kirel have been handled.

Age Page Texture Name(s) Current Size Has Splotches Original Proposal from #243: Notes
Ahnonay islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Ahnonay islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Ahnonay yeeshabookinside*0#2.hsm (OOS) N/A N/A N/A Note: Seems to be using this to replace the page textures outright instead of the proper Yeesha stamp (but this is out of scope)
AhnonayCathedral islmDniBook_page1.dds 512x512 (Full) No No Change May have benefitted from a prior Korman conversion which cleaned this up.
BaronCityOffice islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
City islmdnibook_page*0#0.hsm 512x512 (Full) Yes 512x512 Splotchless
City islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512 Splotchless (but remove if possible) Hypothetically, this is a duplicate asset and ideally could be removed in favor of the larger texture in this same PRP.
City islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Dereno islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Dereno islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
EderDelin islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
EderDelin islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
EderTsogal islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
EderTsogal islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Ercana islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
ErcanaCitySilo islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
ErcanaCitySilo islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Garden islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Garrison N/A N/A N/A N/A xbookpage is used instead. this still has the splotches, but is out of scope for this change.
Gira islmdnibook_page*0#0.hsm 512x512 (Full) Yes 512x512 Splotchless
Gira islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512 Splotchless (but remove if possible) Hypothetically, this is a duplicate asset and ideally could be removed in favor of the larger texture in this same PRP.
Gira islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
GreatTreePub islmDniBook_page1.dds 512x512 (Full) No No Change May have benefitted from a prior Korman conversion which cleaned this up.
GreatZero islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
GreatZero islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Kadish islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Kadish islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Kveer islmdnibook_page_0_3.dds 64x64 (Smallest) Yes 512x512 Splotchless
Kveer islmdnibook_page1_0_3.dds 64x64 (Smallest) Yes 512x512 Splotchless
Negilahn islmdnibook_page*0#0.hsm 512x512 (Full) Yes 512x512 Splotchless
Negilahn islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512 Splotchless (but remove if possible) Hypothetically, this is a duplicate asset and ideally could be removed in favor of the larger texture in this same PRP.
Negilahn islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Neighborhood islmdnibook_page*0#2.hsm 128x128 (Medium) Yes 512x512 Splotchless
Neighborhood islmdnibook_page1*0#2.hsm 128x128 (Medium) Yes 512x512 Splotchless
Neighborhood islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512 Splotchless (but remove if possible) Hypothetically, this is a duplicate asset and ideally could be removed in favor of the larger texture in this same PRP.
Neighborhood02 islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes Superseded by #250 #250 collapses this and "page1" down to a single texture, xbooknewpage, which is full size and splotchless. Thus, no change needed if merged.
Neighborhood02 islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes Superseded by #250 #250 collapses this and "page" down to a single texture, xbooknewpage, which is full size and splotchless. Thus, no change needed if merged.
Nexus N/A N/A N/A N/A xbooknewpage is used instead, which is full size and does not have the splotches.
Payiferen islmdnibook_page*0#0.hsm 512x512 (Full) Yes 512x512 Splotchless
Payiferen islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512 Splotchless (but remove if possible) Hypothetically, this is a duplicate asset and ideally could be removed in favor of the larger texture in this same PRP.
Payiferen islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Personal islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
PhilRelto islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless Not sure why Personal only uses Page1 but PhilRelto uses Page and Page1.
PhilRelto islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Spyroom islmdnibook_page_0_3.dds 64x64 (Smallest) Yes 512x512 Splotchless
Spyroom islmdnibook_page1_0_3.dds 64x64 (Smallest) Yes 512x512 Splotchless
Teledahn islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Teledahn islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless
Tetsonot islmdnibook_page*0#0.hsm 512x512 (Full) Yes 512x512 Splotchless
Tetsonot islmdnibook_page*0#3.hsm 64x64 (Smallest) Yes 512 Splotchless (but remove if possible) Hypothetically, this is a duplicate asset and ideally could be removed in favor of the larger texture in this same PRP.
Tetsonot islmdnibook_page1*0#3.hsm 64x64 (Smallest) Yes 512x512 Splotchless

Conclusion

Based on the info I've provided here, my hope is we can brainstorm together and come up with a strategy to address this that will be more agreeable than my previous attempt and what I originally submitted to MOULa. I'm not looking for a quick solution here - I wanna give this some time to cook - but whatever we land on, I'll want to try to mirror this back to MOULa as well, to prevent the PRPs from diverging too much.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions