⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m2chartexture.cpp

📁 3D游戏展示程序
💻 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 + -