📄 m2chartexture.cpp
字号:
//--------------------------------------------------
// Desc: M2 Character Texture Compose
// From: WOW Model Viewer
// I just coding in my own ways!
//--------------------------------------------------
#include <algorithm>
#include "M2CharTexture.h"
#include "Common.h"
TextureComponent::TextureComponent()
{
memset(m_FileName, 0, sizeof(m_FileName));
m_Index = 0;
m_Region = 0;
m_Layer = 0;
}
void TextureGroup::AddTexture(const char *filename, int index, int region, int layer)
{
if(filename==NULL || filename[0]==0)
return;
TextureComponent texturecom;
strcpy(texturecom.m_FileName, filename);
texturecom.m_Index = index;
texturecom.m_Region = region;
texturecom.m_Layer = layer;
m_Components.push_back(texturecom);
}
//--------------------------------------------------
// 根据纹理组排序合成最终纹理(256*256 ARGB)
//--------------------------------------------------
unsigned long TextureGroup::Compose(unsigned long oldtexhandle)
{
ReleaseTexture(oldtexhandle);
if(m_Components.size()==1)
{
return g_pTextureManager->LoadTexture(m_Components[0].m_FileName, MM_KEEPINMEMORY, 0);
}
std::sort(m_Components.begin(), m_Components.end());
unsigned char pDestbuf[256*256*4];
memset(pDestbuf, 0, 256*256*4);
for(std::vector<TextureComponent>::iterator itor=m_Components.begin(); itor!=m_Components.end(); itor++)
{
TextureComponent &comp = *itor;
const Region &coord = g_Region[comp.m_Region];
CTexture Texture;
_strlwr(comp.m_FileName);
size_t FileLen = strlen(comp.m_FileName);
if(FileLen<3) return INVALID_HANDLE;
if(strcmp(&comp.m_FileName[FileLen-3], "amf")==0)
Texture.LoadAMFTexture(comp.m_FileName, comp.m_Index, 1);
else
Texture.LoadTexture(comp.m_FileName, 1);
DWORD Width = Texture.GetWidth();
DWORD Height = Texture.GetHeight();
LPDIRECT3DTEXTURE9 pTexture = Texture.GetTexture();
if(pTexture == NULL) return INVALID_HANDLE;
D3DLOCKED_RECT d3dlr;
pTexture->LockRect(0, &d3dlr, 0, 0);
unsigned char *pSrc = (unsigned char*)(d3dlr.pBits);
if(Width==coord.xsize && Height==coord.ysize)
{
for(unsigned y=0, dy=coord.ypos; y<Height; y++,dy++)
{
for(unsigned x=0, dx=coord.xpos; x<Width; x++,dx++)
{
unsigned char *src = pSrc + y*Width*4 + x*4;
unsigned char *dest = pDestbuf + dy*256*4 + dx*4;
float r = src[3] / 255.0f;
float ir = 1.0f - r;
dest[3] = 255;
dest[0] = (unsigned char)(dest[0]*ir + src[0]*r);
dest[1] = (unsigned char)(dest[1]*ir + src[1]*r);
dest[2] = (unsigned char)(dest[2]*ir + src[2]*r);
}
}
}
pTexture->UnlockRect(0);
Texture.Release();
}
return g_pTextureManager->LoadTextureFromMem(256, 256, (DWORD*)pDestbuf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -