Files
2026-06-01 12:46:52 +02:00

180 lines
4.4 KiB
C++

#include "stdafx.h"
#include "_TextureMode.h"
K3DTexture * _spSpecular[8]={NULL,};
STRUCT_TEXTURE_MODE g_pTextureMode[MAX_TEXTURE_MODE] =
{
#include "TextureMode.txt"
};
#ifdef _DEV
STRUCT_TEXTURE_MODE_FILE g_pTextureModeFile[MAX_TEXTURE_MODE] =
{
#include "TextureModeFile.txt"
};
void _TextureModeBuild(void)
{
// if (g_pTextureMode[0].nHash1) return;
memset(g_pTextureMode,0,sizeof(g_pTextureMode));
FILE * fp = fopen("TextureMode.txt","wt");
for (int i=0;i<MAX_TEXTURE_MODE;i++)
{
char *pfile =g_pTextureModeFile[i].pFile;
if (pfile[0]==0) break;
int nhash1 = 0;
int nhash2 = 0;
_TextureModeEncode(pfile,&nhash1,&nhash2);
// 기존 테이블에 중복된 값이 있는지 검사
for (int j=0;j<i;j++)
{
if (g_pTextureMode[i].nHash1 == nhash1 && g_pTextureMode[i].nHash2 == nhash2 )
{ MessageBox(NULL,pfile,"error: same hash key",MB_OK);
}
}
int mode =g_pTextureModeFile[i].nMode;
g_pTextureMode[i].nHash1 = nhash1;
g_pTextureMode[i].nHash2 = nhash2;
g_pTextureMode[i].nMode = mode;
fprintf(fp,"%d,%d,%d,\n", nhash1,nhash2,mode);
}
fclose(fp);
};
void _TextureModeReload(void)
{
FILE * fp = fopen("TextureModeFile.txt","rt");
if (fp==NULL) return;
memset(g_pTextureModeFile,0,sizeof(g_pTextureModeFile));
for (int i=0;i<MAX_TEXTURE_MODE;i++)
{
while(TRUE)
{ char buf[256];
char * ret = fgets(buf,255,fp);
if (ret<=0) break;
int len = strlen(buf);
for (int j=0;j<len;j++)
{ if (buf[j]=='\"' || buf[j]==',' || buf[j]<' ') buf[j]=' ';
}
char token[2][256];
sscanf(buf,"%s %s",token[0],token[1]);
if (token[0][0] =='/') continue;
int mode = atoi(token[1]);
if (mode<=0) continue;
strcpy(g_pTextureModeFile[i].pFile,token[0]);
g_pTextureModeFile[i].nMode = mode;
break;
};
}
fclose(fp);
}
#endif
void _TextureModeEncode(char * name,int * nhash1,int * nhash2)
{
*nhash1=0;
*nhash2=0;
int len = strlen (name);
int count = 0;
for (int i=0;i<len;i++)
{
if (name[i]=='\\') // 경로와 함께 name이 오면 경로부분은 제거
{
*nhash1 = 0;
*nhash2 = 0;
count = 0;
continue;
}
if (name[i]=='.') break; // 확장자는 포함하지 않는다.
if (count&0x1)
{ *nhash1 += ((name[i]-'0') << (count>>1));
} else
{ *nhash2 += ((name[i]-'0') << (count>>1));
}
count++;
}
}
int _TextureModeGet(char *name)
{
int nhash1 = 0;
int nhash2 = 0;
_TextureModeEncode(name,&nhash1,&nhash2);
for (int i=0;i<MAX_TEXTURE_MODE;i++)
{ if (g_pTextureMode[i].nHash1 == nhash1 && g_pTextureMode[i].nHash2 == nhash2 )
{ return g_pTextureMode[i].nMode;
}
}
// 리스트에 없는경우
//_npc
//_face
//_foot
//가 있을경우
///*
int mode = 1;
int len = strlen(name);
int nPathPos = 0;
for (int i=0;i<len;i++)
{
if (name[i]=='\\') // 경로와 함께 name이 오면 경로부분 위치를 저장
{
nPathPos = i+1;
continue;
}
if (name[i]=='.') break; // 확장자는 포함하지 않는다.
}
if (len>7 && name[0]=='n' && name[1]=='p' && name[2]=='c') mode = 22;
else
{
for (int i=nPathPos;i<len-4;i++)
{
if (name[i]=='f' && name[i+1]=='x' && name[i+2]=='_') {mode= 21;break;}
if (name[i]=='b' && name[i+1]=='e' && name[i+2]=='a' && name[i+3]=='s' && name[i+4]=='t') {mode= 23;break;}
if (name[i]=='a' && name[i+1]=='i' && name[i+2]=='n' && name[i+3]=='_' ) {mode= 23;break;}
if (name[i]=='_')
{
if (name[i+1]=='h' && name[i+2]=='a' && name[i+3]=='i' && name[i+4]=='r') {mode= 21;break;}
if (name[i+1]=='m' && name[i+2]=='a' && name[i+3]=='n' && name[i+4]=='t') {mode= 21;break;}
if (name[i+1]=='n' && name[i+2]=='p' && name[i+3]=='c') {mode= 22;break;}
if (name[i+1]=='b' && name[i+2]=='o' && name[i+3]=='d' && name[i+4]=='y') {mode= 22;break;}
if (name[i+1]=='w' && name[i+2]=='a' && name[i+3]=='r' && name[i+4]=='r') {mode= 22;break;}
if (name[i+1]=='s' && name[i+2]=='u' && name[i+3]=='m' && name[i+4]=='m') {mode= 22;break;}
if (name[i+1]=='p' && name[i+2]=='r' && name[i+3]=='i' && name[i+4]=='e') {mode= 22;break;}
if (name[i+1]=='a' && name[i+2]=='r' && name[i+3]=='c' && name[i+4]=='h') {mode= 22;break;}
if (name[i+1]=='f' && name[i+2]=='o' && name[i+3]=='o' && name[i+4]=='t') {mode= 22;break;}
if (name[i+1]=='h' && name[i+2]=='a' && name[i+3]=='n' && name[i+4]=='d') {mode= 22;break;}
if (name[i+1]=='f' && name[i+2]=='a' && name[i+3]=='c' && name[i+4]=='e') {mode= 23;break;}
}
}
}
return mode;
}