From bccfec9f14973948cccdd2c1a4f11b4c12ca9f20 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Wed, 22 Oct 2025 16:33:14 -0500 Subject: [PATCH] feat(component): implement CCharacterComponent::Paste --- src/component/CCharacterComponent.cpp | 97 ++++++++++++++++++++++++++- src/component/CCharacterComponent.hpp | 5 ++ 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/src/component/CCharacterComponent.cpp b/src/component/CCharacterComponent.cpp index db42ed7..fd9d671 100644 --- a/src/component/CCharacterComponent.cpp +++ b/src/component/CCharacterComponent.cpp @@ -117,8 +117,85 @@ void CCharacterComponent::InitDbData() { // TODO CountFacialFeatures(varArrayLength, &CCharacterComponent::s_characterFacialHairStylesList); } -void CCharacterComponent::Paste(void* srcTexture, MipBits* dstMips, const C2iVector& a3, const C2iVector& a4, const C2iVector& a5, TCTEXTUREINFO& srcInfo, int32_t srcMipLevel) { - // TODO +void CCharacterComponent::Paste(void* srcTexture, MipBits* dstMips, const C2iVector& dstPos, const C2iVector& srcPos, const C2iVector& srcSize, TCTEXTUREINFO& srcInfo, int32_t srcMipLevel) { + uint32_t dstStride = CCharacterComponent::s_textureSize * 4; + auto srcPal = TextureCacheGetPal(srcTexture); + + if (!srcPal) { + // TODO fill in with crappy green (0x00FF00FF) + + return; + } + + switch (srcInfo.alphaSize) { + case 0: + CCharacterComponent::PasteOpaque( + srcTexture, + srcPal, + dstMips, + dstPos, + dstStride, + srcPos, + srcSize, + srcInfo, + srcMipLevel, + -srcMipLevel + ); + + break; + + case 1: + CCharacterComponent::PasteTransparent1Bit( + srcTexture, + srcPal, + dstMips, + dstPos, + dstStride, + srcPos, + srcSize, + srcInfo, + srcMipLevel, + -srcMipLevel + ); + + break; + + case 4: + CCharacterComponent::PasteTransparent4Bit( + srcTexture, + srcPal, + dstMips, + dstPos, + dstStride, + srcPos, + srcSize, + srcInfo, + srcMipLevel, + -srcMipLevel + ); + + break; + + case 8: + CCharacterComponent::PasteTransparent8Bit( + srcTexture, + srcPal, + dstMips, + dstPos, + dstStride, + srcPos, + srcSize, + srcInfo, + srcMipLevel, + -srcMipLevel + ); + + break; + + default: + // Do nothing + break; + } } void CCharacterComponent::PasteFromSkin(COMPONENT_SECTIONS section, void* srcTexture, MipBits* dstMips) { @@ -149,10 +226,26 @@ void CCharacterComponent::PasteFromSkin(COMPONENT_SECTIONS section, void* srcTex } } +void CCharacterComponent::PasteOpaque(void* srcTexture, const BlpPalPixel* srcPal, MipBits* dstMips, const C2iVector& dstPos, uint32_t dstStride, const C2iVector& srcPos, const C2iVector& srcSize, TCTEXTUREINFO& srcInfo, int32_t srcMipLevel, int32_t dstMipLevelOfs) { + // TODO +} + void CCharacterComponent::PasteScale(void* srcTexture, MipBits* dstMips, const C2iVector& a3, const C2iVector& a4, const C2iVector& a5, TCTEXTUREINFO& srcInfo) { // TODO } +void CCharacterComponent::PasteTransparent1Bit(void* srcTexture, const BlpPalPixel* srcPal, MipBits* dstMips, const C2iVector& dstPos, uint32_t dstStride, const C2iVector& srcPos, const C2iVector& srcSize, TCTEXTUREINFO& srcInfo, int32_t srcMipLevel, int32_t dstMipLevelOfs) { + // TODO +} + +void CCharacterComponent::PasteTransparent4Bit(void* srcTexture, const BlpPalPixel* srcPal, MipBits* dstMips, const C2iVector& dstPos, uint32_t dstStride, const C2iVector& srcPos, const C2iVector& srcSize, TCTEXTUREINFO& srcInfo, int32_t srcMipLevel, int32_t dstMipLevelOfs) { + // TODO +} + +void CCharacterComponent::PasteTransparent8Bit(void* srcTexture, const BlpPalPixel* srcPal, MipBits* dstMips, const C2iVector& dstPos, uint32_t dstStride, const C2iVector& srcPos, const C2iVector& srcSize, TCTEXTUREINFO& srcInfo, int32_t srcMipLevel, int32_t dstMipLevelOfs) { + // TODO +} + void CCharacterComponent::RenderPrepAL(CCharacterComponent* component) { auto skin = component->m_texture[TEXTURE_INDEX(VARIATION_SKIN, 0)]; CCharacterComponent::PasteFromSkin(SECTION_ARM_LOWER, skin, CCharacterComponent::s_textureBuffer); diff --git a/src/component/CCharacterComponent.hpp b/src/component/CCharacterComponent.hpp index 0a09c84..a34627a 100644 --- a/src/component/CCharacterComponent.hpp +++ b/src/component/CCharacterComponent.hpp @@ -11,6 +11,7 @@ class CCharacterComponent; class CharSectionsRec; class CM2Model; +struct BlpPalPixel; struct MipBits; struct st_race; struct TCTEXTUREINFO; @@ -89,7 +90,11 @@ class CCharacterComponent { static void RenderPrepTU(CCharacterComponent* component); static void Paste(void* srcTexture, MipBits* dstMips, const C2iVector& a3, const C2iVector& a4, const C2iVector& a5, TCTEXTUREINFO& srcInfo, int32_t srcMipLevel); static void PasteFromSkin(COMPONENT_SECTIONS section, void* srcTexture, MipBits* dstMips); + static void PasteOpaque(void* srcTexture, const BlpPalPixel* srcPal, MipBits* dstMips, const C2iVector& dstPos, uint32_t dstStride, const C2iVector& srcPos, const C2iVector& srcSize, TCTEXTUREINFO& srcInfo, int32_t srcMipLevel, int32_t dstMipLevelOfs); static void PasteScale(void* srcTexture, MipBits* dstMips, const C2iVector& a3, const C2iVector& a4, const C2iVector& a5, TCTEXTUREINFO& srcInfo); + static void PasteTransparent1Bit(void* srcTexture, const BlpPalPixel* srcPal, MipBits* dstMips, const C2iVector& dstPos, uint32_t dstStride, const C2iVector& srcPos, const C2iVector& srcSize, TCTEXTUREINFO& srcInfo, int32_t srcMipLevel, int32_t dstMipLevelOfs); + static void PasteTransparent4Bit(void* srcTexture, const BlpPalPixel* srcPal, MipBits* dstMips, const C2iVector& dstPos, uint32_t dstStride, const C2iVector& srcPos, const C2iVector& srcSize, TCTEXTUREINFO& srcInfo, int32_t srcMipLevel, int32_t dstMipLevelOfs); + static void PasteTransparent8Bit(void* srcTexture, const BlpPalPixel* srcPal, MipBits* dstMips, const C2iVector& dstPos, uint32_t dstStride, const C2iVector& srcPos, const C2iVector& srcSize, TCTEXTUREINFO& srcInfo, int32_t srcMipLevel, int32_t dstMipLevelOfs); static void UpdateBaseTexture(EGxTexCommand cmd, uint32_t width, uint32_t height, uint32_t depth, uint32_t mipLevel, void* userArg, uint32_t& texelStrideInBytes, const void*& texels); // Member variables