47 wc.
R = (c.r * 255.0f);
48 wc.
G = (c.g * 255.0f);
49 wc.
B = (c.b * 255.0f);
100 char name[_MAX_FNAME];
101 char exten[_MAX_EXT];
102 char fname[_MAX_FNAME+_MAX_EXT+2];
104 _splitpath(fullpath,
NULL,
NULL,name,exten);
105 _makepath(fname,
NULL,
NULL,name,exten);
154 for (
int pass = 0; pass <
MAX_PASSES; pass++) {
157 for (
int stage = 0; stage <
MAX_STAGES; stage++) {
172 for (
int pass = 0; pass <
MAX_PASSES; pass++) {
179 for (
int stage = 0; stage <
MAX_STAGES; stage++) {
200 for (
int stage=0; stage <
MAX_STAGES; stage++) {
247 int len = strlen(args_buffer);
341 bool ps2_mat =
false;
357 tmap = mtl->GetSubTexmap(ID_RL);
358 if (tmap && tmap->ClassID() == Class_ID(BMTEX_CLASS_ID,0)) {
374 Color diffuse = mtl->GetDiffuse();
380 Color specular = mtl->GetSpecular();
386 mat.
Opacity = 1.0f - mtl->GetXParency();
389 tmap = mtl->GetSubTexmap(ID_DI);
390 if (tmap && tmap->ClassID() == Class_ID(BMTEX_CLASS_ID,0)) {
392 char * tname = ((BitmapTex *)tmap)->GetMapName();
401 if (materialColorTexture && !mtl->GetSubTexmap(ID_DI) && !mtl->GetSubTexmap(ID_RL))
453 tmap = mtl->GetSubTexmap(ID_RL);
454 if (tmap && tmap->ClassID() == Class_ID(BMTEX_CLASS_ID,0)) {
456 char * tname = ((BitmapTex *)tmap)->GetMapName();
586 BitmapTex * tex =
NULL;
588 for (
int stage=0; stage <
MAX_STAGES; stage++) {
595 tex = (BitmapTex *)gamemtl->
Get_Texture(pass,stage);
596 assert(tex->GetMapName());
601 memset(&texinfo,0,
sizeof(texinfo));
647 if (materialColorTexture)
679W3dMaterialDescClass::VertMatClass::VertMatClass(
void) :
689W3dMaterialDescClass::VertMatClass::~VertMatClass(
void)
691 if (Name) free(Name);
694 if (MapperArgs[stage]) {
695 delete [] (MapperArgs[stage]);
696 MapperArgs[stage] =
NULL;
701W3dMaterialDescClass::VertMatClass &
702W3dMaterialDescClass::VertMatClass::operator = (
const VertMatClass & that)
706 PassIndex = that.PassIndex;
710 Set_Mapper_Args(that.MapperArgs[stage], stage);
716bool W3dMaterialDescClass::VertMatClass::operator != (
const VertMatClass & that)
718 return !(*
this == that);
721bool W3dMaterialDescClass::VertMatClass::operator == (
const VertMatClass & that)
723 assert(0);
return false;
726void W3dMaterialDescClass::VertMatClass::Set_Name(
const char * name)
728 if (Name) free(Name);
737void W3dMaterialDescClass::VertMatClass::Set_Mapper_Args(
const char * args,
int stage)
739 if (MapperArgs[stage]) {
740 delete [] (MapperArgs[stage]);
741 MapperArgs[stage] =
NULL;
745 int len = strlen(args);
746 MapperArgs[stage] =
new char [len + 1];
747 strcpy(MapperArgs[stage], args);
749 MapperArgs[stage] =
NULL;
761W3dMaterialDescClass::MaterialRemapClass::MaterialRemapClass(
void)
765 VertexMaterialIdx[pass] = -1;
766 ShaderIdx[pass] = -1;
768 TextureIdx[pass][stage] = -1;
773bool W3dMaterialDescClass::MaterialRemapClass::operator != (
const MaterialRemapClass & that)
775 return !(*
this == that);
778bool W3dMaterialDescClass::MaterialRemapClass::operator == (
const MaterialRemapClass & that)
782 if (VertexMaterialIdx[pass] != that.VertexMaterialIdx[pass])
return false;
783 if (ShaderIdx[pass] != that.ShaderIdx[pass])
return false;
787 if (TextureIdx[pass][stage] != that.TextureIdx[pass][stage])
return false;
808 MaterialRemaps.Clear();
810 VertexMaterials.Clear();
820 if (PassCount == -1) {
827 if (SortLevel == -1) {
841 sprintf(
msg,
"Enable Multipass-Transparency?");
842 HWND window=GetForegroundWindow();
843 if (IDYES!=MessageBox(window,
msg,
"Confirmation",MB_YESNO|MB_ICONINFORMATION|MB_TASKMODAL))
858 MaterialRemapClass remap;
860 for (
int pass=0; pass<PassCount; pass++) {
862 remap.VertexMaterialIdx[pass] = Add_Vertex_Material(
865 remap.ShaderIdx[pass] = Add_Shader(mat.
Get_Shader(pass),pass);
869 remap.TextureIdx[pass][stage] = Add_Texture(mat.
Get_Texture(pass,stage),pass,stage);
875 MaterialRemaps.Add(remap);
882 return MaterialRemaps.Count();
892 return VertexMaterials.Count();
897 return Shaders.Count();
902 return Textures.Count();
912 assert(vmat_index >= 0);
913 assert(vmat_index < VertexMaterials.Count());
914 return &(VertexMaterials[vmat_index].Material);
919 assert(vmat_index >= 0);
920 assert(vmat_index < VertexMaterials.Count());
923 return VertexMaterials[vmat_index].MapperArgs[stage];
928 assert(shader_index >= 0);
929 assert(shader_index < Shaders.Count());
930 return &(Shaders[shader_index].Shader);
935 assert(texture_index >= 0);
936 assert(texture_index < Textures.Count());
937 return &(Textures[texture_index].Map);
942 assert(mat_index >= 0);
943 assert(mat_index < MaterialRemaps.Count());
945 assert(pass < PassCount);
946 return MaterialRemaps[mat_index].VertexMaterialIdx[pass];
951 assert(mat_index >= 0);
952 assert(mat_index < MaterialRemaps.Count());
954 assert(pass < PassCount);
955 return MaterialRemaps[mat_index].ShaderIdx[pass];
960 assert(mat_index >= 0);
961 assert(mat_index < MaterialRemaps.Count());
963 assert(pass < PassCount);
966 return MaterialRemaps[mat_index].TextureIdx[pass][stage];
1011 return MaterialRemaps[mat_index].MapChannel[pass][stage];
1020 return VertexMaterials[index].Name;
1026 return VertexMaterials[vmat_index].Name;
1031 for (
int mi=0; mi<MaterialRemaps.Count();mi++) {
1055 int max_alpha_pass = -1;
1058 max_alpha_pass = pi;
1061 return (max_alpha_pass == pass);
1067 for (
int mi=0; mi<MaterialRemaps.Count(); mi++) {
1088 const char *mapper_args0,
const char *mapper_args1,
int pass,
const char * name)
1094 int crc = Compute_Crc(*vmat, mapper_args0, mapper_args1);
1095 for (
int vi=0; vi<VertexMaterials.Count(); vi++) {
1096 if ((crc == VertexMaterials[vi].Crc) && (pass == VertexMaterials[vi].PassIndex)) {
1101 if (vi == VertexMaterials.Count()) {
1103 vm.Material = *vmat;
1105 vm.PassIndex = pass;
1107 vm.Set_Mapper_Args(mapper_args0, 0);
1108 vm.Set_Mapper_Args(mapper_args1, 1);
1109 VertexMaterials.Add(vm);
1115int W3dMaterialDescClass::Add_Shader(
const W3dShaderStruct & shader,
int pass)
1117 int crc = Compute_Crc(shader);
1118 for (
int si=0; si<Shaders.Count(); si++) {
1119 if (crc == Shaders[si].Crc)
break;
1122 if (si == Shaders.Count()) {
1132int W3dMaterialDescClass::Add_Texture(W3dMapClass * map,
int pass,
int stage)
1138 int crc = Compute_Crc(*map);
1139 for (
int ti=0; ti<Textures.Count(); ti++) {
1140 if (crc == Textures[ti].Crc) {
1145 if (ti == Textures.Count()) {
1155unsigned long W3dMaterialDescClass::Compute_Crc(
const W3dVertexMaterialStruct & vmat,
1156 const char *mapper_args0,
1157 const char *mapper_args1)
1159 unsigned long crc = 0;
1172 crc = Add_String_To_Crc(mapper_args0, crc);
1173 crc = Add_String_To_Crc(mapper_args1, crc);
1178unsigned long W3dMaterialDescClass::Compute_Crc(
const W3dShaderStruct & shader)
1180 unsigned long crc = 0;
1181 crc =
CRC_Memory((
const unsigned char *)&shader,
sizeof(shader),crc);
1185unsigned long W3dMaterialDescClass::Compute_Crc(
const W3dMapClass & map)
1187 unsigned long crc = 0;
1198unsigned long W3dMaterialDescClass::Add_String_To_Crc(
const char *str,
unsigned long in_crc)
1200 unsigned long out_crc = in_crc;
1202 int len = strlen(str);
1203 char *temp =
new char[len + 1];
1204 const char *p_in = str;
1207 for (; *p_in ==
' ' || *p_in ==
'\t' || *p_in ==
'\r' || *p_in ==
'\n'; p_in++);
1210 char * p_out = temp;
1212 for (; *p_in; p_in++) {
1213 for (; *p_in ==
' ' || *p_in ==
'\t'; p_in++);
1214 if (!(*p_in))
break;
1227 for (; *p_out ==
'\r' || *p_out ==
'\n'; p_out--) {
1233 out_crc =
CRC_Memory((
const unsigned char *)temp,count,in_crc);
#define W3DVERTMAT_STAGE1_MAPPING_ZIGZAG_LINEAR_OFFSET
#define W3DTEXTURE_HINT_MASK
#define W3DVERTMAT_STAGE1_MAPPING_WS_CLASSIC_ENV
#define W3DVERTMAT_STAGE1_MAPPING_WS_ENVIRONMENT
#define W3DVERTMAT_STAGE0_MAPPING_ENVIRONMENT
void W3d_Shader_Reset(W3dShaderStruct *s)
#define W3DVERTMAT_STAGE0_MAPPING_CHEAP_ENVIRONMENT
#define W3DVERTMAT_STAGE1_MAPPING_SINE_LINEAR_OFFSET
#define W3DVERTMAT_STAGE1_MAPPING_SCALE
int W3d_Shader_Get_Src_Blend_Func(const W3dShaderStruct *s)
#define W3DTEXTURE_CLAMP_U
#define W3DVERTMAT_STAGE1_MAPPING_SCREEN
#define W3DVERTMAT_STAGE0_MAPPING_BUMPENV
int W3d_Shader_Get_Detail_Alpha_Func(const W3dShaderStruct *s)
#define W3DTEXTURE_HINT_SHIFT
void W3d_Shader_Set_Dest_Blend_Func(W3dShaderStruct *s, int val)
#define W3DVERTMAT_STAGE0_MAPPING_UV
@ W3DSHADER_DETAILCOLORFUNC_DISABLE
@ W3DSHADER_DESTBLENDFUNC_SRC_ALPHA
@ W3DSHADER_PRIGRADIENT_MODULATE
@ W3DSHADER_PRIGRADIENT_BUMPENVMAP
@ W3DSHADER_SRCBLENDFUNC_ONE_MINUS_SRC_ALPHA
@ W3DSHADER_DEPTHMASK_WRITE_DISABLE
@ W3DSHADER_DESTBLENDFUNC_ZERO
@ W3DSHADER_DESTBLENDFUNC_ONE
@ W3DSHADER_SRCBLENDFUNC_SRC_ALPHA
@ W3DSHADER_SECGRADIENT_DISABLE
@ W3DSHADER_SRCBLENDFUNC_ONE
@ W3DSHADER_TEXTURING_DISABLE
@ W3DSHADER_DETAILALPHAFUNC_DISABLE
@ W3DSHADER_DESTBLENDFUNC_ONE_MINUS_SRC_ALPHA
@ W3DSHADER_TEXTURING_ENABLE
#define W3DVERTMAT_STAGE1_MAPPING_ROTATE
#define W3DVERTMAT_PSX_NO_RT_LIGHTING
#define W3DVERTMAT_STAGE1_MAPPING_STEP_LINEAR_OFFSET
#define W3DVERTMAT_STAGE0_MAPPING_ZIGZAG_LINEAR_OFFSET
#define W3DVERTMAT_STAGE0_MAPPING_LINEAR_OFFSET
#define W3DVERTMAT_PSX_TRANS_NONE
#define W3DVERTMAT_STAGE0_MAPPING_SCALE
#define W3DVERTMAT_STAGE0_MAPPING_STEP_LINEAR_OFFSET
#define W3DVERTMAT_STAGE0_MAPPING_SINE_LINEAR_OFFSET
void W3d_Shader_Set_Texturing(W3dShaderStruct *s, int val)
#define W3DVERTMAT_STAGE1_MAPPING_EDGE
#define W3DVERTMAT_STAGE0_MAPPING_SILHOUETTE
#define W3DVERTMAT_STAGE0_MAPPING_SCREEN
void W3d_Shader_Set_Depth_Mask(W3dShaderStruct *s, int val)
#define W3DTEXTURE_CLAMP_V
int W3d_Shader_Get_Detail_Color_Func(const W3dShaderStruct *s)
#define W3DTEXTURE_TYPE_BUMPMAP
#define W3DTEXTURE_PUBLISH
void W3d_Shader_Set_PS2_Param_B(W3dShaderStruct *s, int val)
#define W3DVERTMAT_STAGE0_MAPPING_EDGE
void W3d_Shader_Set_Pri_Gradient(W3dShaderStruct *s, int val)
void W3d_Shader_Set_Src_Blend_Func(W3dShaderStruct *s, int val)
#define W3DVERTMAT_STAGE1_MAPPING_UV
#define W3DVERTMAT_COPY_SPECULAR_TO_DIFFUSE
#define W3DVERTMAT_PSX_TRANS_100
#define W3DVERTMAT_STAGE1_MAPPING_GRID_ENVIRONMENT
#define W3DVERTMAT_STAGE0_MAPPING_WS_CLASSIC_ENV
#define W3DTEXTURE_NO_LOD
#define W3DVERTMAT_STAGE1_MAPPING_SILHOUETTE
#define W3DVERTMAT_STAGE0_MAPPING_ROTATE
#define W3DVERTMAT_STAGE1_MAPPING_BUMPENV
void W3d_Shader_Set_PS2_Param_D(W3dShaderStruct *s, int val)
void W3d_Shader_Set_PS2_Param_C(W3dShaderStruct *s, int val)
#define W3DVERTMAT_STAGE0_MAPPING_GRID
#define W3DVERTMAT_PSX_TRANS_MINUS_100
#define W3DVERTMAT_STAGE0_MAPPING_MASK
#define W3DVERTMAT_STAGE0_MAPPING_GRID_ENVIRONMENT
#define W3DVERTMAT_STAGE0_MAPPING_GRID_CLASSIC_ENV
#define W3DVERTMAT_STAGE1_MAPPING_CHEAP_ENVIRONMENT
#define W3DVERTMAT_STAGE1_MAPPING_GRID_CLASSIC_ENV
#define W3DVERTMAT_STAGE1_MAPPING_LINEAR_OFFSET
int W3d_Shader_Get_Alpha_Test(const W3dPS2ShaderStruct *s)
#define W3DVERTMAT_STAGE0_MAPPING_WS_ENVIRONMENT
#define W3DVERTMAT_STAGE1_MAPPING_RANDOM
#define W3DVERTMAT_STAGE0_MAPPING_RANDOM
#define W3DTEXTURE_ALPHA_BITMAP
void W3d_Vertex_Material_Reset(W3dVertexMaterialStruct *vmat)
#define W3DVERTMAT_PSX_TRANS_25
#define W3DVERTMAT_PSX_TRANS_50
@ PSS_PRIGRADIENT_MODULATE
void W3d_Shader_Set_PS2_Param_A(W3dShaderStruct *s, int val)
#define W3DVERTMAT_STAGE1_MAPPING_GRID
int W3d_Shader_Get_Dest_Blend_Func(const W3dShaderStruct *s)
int W3d_Shader_Get_Texturing(const W3dPS2ShaderStruct *s)
#define W3DVERTMAT_STAGE1_MAPPING_ENVIRONMENT
void W3d_Shader_Set_Sec_Gradient(W3dShaderStruct *s, int val)
unsigned long CRC_Memory(const unsigned char *data, unsigned long length, unsigned long crc)
unsigned long CRC_Stringi(const char *string, unsigned long crc)
Color Get_Specular(int pass, TimeValue t)
float Get_Translucency(int pass, TimeValue t)
int Get_Texture_Anim_Type(int pass, int stage)
int Get_PS2_Shader_Param_A(int pass)
int Get_Detail_Alpha_Func(int pass)
int Get_Texture_Clamp_U(int pass, int stage)
int Get_Src_Blend(int pass)
float Get_Shininess(int pass, TimeValue t)
int Get_Texture_Frame_Count(int pass, int stage)
int Get_PS2_Shader_Param_D(int pass)
Color Get_Emissive(int pass, TimeValue t)
int Get_Sec_Gradient(int pass)
int Get_Pri_Gradient(int pass)
int Get_Texture_Enable(int pass, int stage)
int Get_PSX_Lighting(int pass)
int Get_Map_Channel(int pass, int stage)
float Get_Opacity(int pass, TimeValue t)
int Get_Depth_Mask(int pass)
int Get_Detail_Color_Func(int pass)
int Get_Sort_Level(void) const
Color Get_Ambient(int pass, TimeValue t)
int Get_PS2_Shader_Param_C(int pass)
int Get_Alpha_Test(int pass)
int Get_Texture_Hint(int pass, int stage)
Texmap * Get_Texture(int pass, int stage)
unsigned int Get_Surface_Type(void) const
int Get_Texture_Publish(int pass, int stage)
int Get_Texture_Clamp_V(int pass, int stage)
int Get_Dest_Blend(int pass)
int Get_Depth_Compare(int pass)
int Get_Copy_Specular_To_Diffuse(int pass)
float Get_Texture_Frame_Rate(int pass, int stage)
int Get_Texture_Alpha_Bitmap(int pass, int stage)
Color Get_Diffuse(int pass, TimeValue t)
char * Get_Mapping_Arg_Buffer(int pass, int stage=0, unsigned int len=0U)
int Get_Texture_No_LOD(int pass, int stage)
int Get_Mapping_Type(int pass, int stage=0)
int Get_PSX_Translucency(int pass)
int Get_PS2_Shader_Param_B(int pass)
void Set_Anim_Info(const W3dTextureInfoStruct *info)
void Set_Filename(const char *name)
W3dMapClass & operator=(const W3dMapClass &that)
W3dTextureInfoStruct * AnimInfo
void Set_Vertex_Material(const W3dVertexMaterialStruct &vmat, int pass=0)
void Set_Sort_Level(int level)
char * MapperArgs[MAX_PASSES][MAX_STAGES]
int Get_Sort_Level(void) const
const char * Get_Mapper_Args(int pass, int stage) const
W3dMapClass * Textures[MAX_PASSES][MAX_STAGES]
void Set_Shader(const W3dShaderStruct &shader, int pass=0)
void Set_Map_Channel(int pass, int stage, int channel)
int Get_Pass_Count(void) const
W3dVertexMaterialStruct * Materials[MAX_PASSES]
W3dMapClass * Get_Texture(int pass=0, int stage=0) const
int Get_Map_Channel(int pass=0, int stage=0) const
W3dVertexMaterialStruct * Get_Vertex_Material(int pass=0) const
int MapChannel[MAX_PASSES][MAX_STAGES]
void Set_Pass_Count(int count)
bool Is_Multi_Pass_Transparent(void) const
unsigned int Get_Surface_Type(void) const
void Set_Mapper_Args(const char *args_buffer, int pass=0, int stage=0)
W3dShaderStruct Shaders[MAX_PASSES]
void Init(Mtl *mtl, char *materialColorTexture=NULL)
W3dShaderStruct Get_Shader(int pass=0) const
void Set_Surface_Type(unsigned int type)
void Set_Texture(const W3dMapClass &map, int pass=0, int stage=0)
@ INCONSISTENT_SORT_LEVEL
W3dMapClass * Get_Texture(int texture_index)
W3dMaterialDescClass(void)
bool Pass_Uses_Vertex_Alpha(int pass)
const char * Get_Vertex_Material_Name(int mat_index, int pass)
int Vertex_Material_Count(void)
~W3dMaterialDescClass(void)
int Get_Vertex_Material_Index(int mat_index, int pass)
ErrorType Add_Material(const W3dMaterialClass &mat, const char *name=NULL)
W3dShaderStruct * Get_Shader(int shader_index)
bool Stage_Needs_Texture_Coordinates(int pass, int stage)
int Get_Shader_Index(int mat_index, int pass)
const char * Get_Mapper_Args(int vmat_index, int stage)
W3dVertexMaterialStruct * Get_Vertex_Material(int vmat_index)
int Get_Texture_Index(int mat_index, int pass, int stage)
int Get_Map_Channel(int mat_index, int pass, int stage)
bool Pass_Uses_Alpha(int pass)
#define GAMEMTL_PSX_TRANS_NONE
#define GAMEMTL_MAPPING_RANDOM
#define GAMEMTL_PSX_TRANS_MINUS_100
#define GAMEMTL_PSX_TRANS_100
#define GAMEMTL_MAPPING_SCREEN
#define GAMEMTL_MAPPING_CHEAP_ENV
#define GAMEMTL_MAPPING_BUMPENV
#define GAMEMTL_MAPPING_WS_CLASSIC_ENV
#define GAMEMTL_MAPPING_SILHOUETTE
#define GAMEMTL_PSX_TRANS_25
#define GAMEMTL_PSX_TRANS_50
#define GAMEMTL_MAPPING_SCALE
#define GAMEMTL_MAPPING_GRID
#define GAMEMTL_MAPPING_ZIGZAG_LINEAR_OFFSET
Class_ID PS2GameMaterialClassID
#define GAMEMTL_MAPPING_GRID_CLASSIC_ENV
#define GAMEMTL_MAPPING_EDGE
#define GAMEMTL_MAPPING_SINE_LINEAR_OFFSET
#define GAMEMTL_MAPPING_GRID_ENVIRONMENT
#define GAMEMTL_MAPPING_UV
#define GAMEMTL_MAPPING_ROTATE
#define GAMEMTL_MAPPING_ENV
#define GAMEMTL_MAPPING_STEP_LINEAR_OFFSET
#define GAMEMTL_MAPPING_WS_ENVIRONMENT
Class_ID GameMaterialClassID
#define GAMEMTL_MAPPING_LINEAR_OFFSET
uint8 PostDetailAlphaFunc
uint8 PostDetailColorFunc