374 lines
15 KiB
C++
374 lines
15 KiB
C++
/*
|
|
** Command & Conquer Generals Zero Hour(tm)
|
|
** Copyright 2025 Electronic Arts Inc.
|
|
**
|
|
** This program is free software: you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation, either version 3 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** This program is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
** GNU General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License
|
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/* $Header: /Commando/Code/Tools/max2w3d/gamemtl.h 38 8/22/01 7:56a Greg_h $ */
|
|
/***********************************************************************************************
|
|
*** Confidential - Westwood Studios ***
|
|
***********************************************************************************************
|
|
* *
|
|
* Project Name : Commando / G 3D engine *
|
|
* *
|
|
* File Name : GAMEMTL.H *
|
|
* *
|
|
* Programmer : Greg Hjelstrom *
|
|
* *
|
|
* Start Date : 06/26/97 *
|
|
* *
|
|
* Last Update : June 26, 1997 [GH] *
|
|
* *
|
|
*---------------------------------------------------------------------------------------------*
|
|
* Functions: *
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
|
|
|
|
#ifndef GAMEMTL_H
|
|
#define GAMEMTL_H
|
|
|
|
#include <Max.h>
|
|
#include "w3dmtl.h"
|
|
#include "w3d_file.h"
|
|
|
|
|
|
// GameMtl flags values
|
|
#define GAMEMTL_CONVERTED_TO_NOLOD (1<<0) // this material has been converted to use the NO_LOD flag on textures
|
|
|
|
#define GAMEMTL_DISPLACEMENT_ROLLUP_OPEN (1<<25)
|
|
#define GAMEMTL_SURFACE_ROLLUP_OPEN (1<<26)
|
|
#define GAMEMTL_PASSCOUNT_ROLLUP_OPEN (1<<27)
|
|
#define GAMEMTL_PASS0_ROLLUP_OPEN (1<<28)
|
|
#define GAMEMTL_PASS1_ROLLUP_OPEN (1<<29)
|
|
#define GAMEMTL_PASS2_ROLLUP_OPEN (1<<30)
|
|
#define GAMEMTL_PASS3_ROLLUP_OPEN (1<<31)
|
|
|
|
#define GAMEMTL_ROLLUP_FLAGS ( GAMEMTL_SURFACE_ROLLUP_OPEN | \
|
|
GAMEMTL_DISPLACEMENT_ROLLUP_OPEN | \
|
|
GAMEMTL_PASSCOUNT_ROLLUP_OPEN | \
|
|
GAMEMTL_PASS0_ROLLUP_OPEN | \
|
|
GAMEMTL_PASS1_ROLLUP_OPEN | \
|
|
GAMEMTL_PASS2_ROLLUP_OPEN | \
|
|
GAMEMTL_PASS3_ROLLUP_OPEN )
|
|
|
|
#define GAMEMTL_ID_PARTA 0x29397211
|
|
#define GAMEMTL_ID_PARTB 0x28c016c2
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Mapping types
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////
|
|
#define GAMEMTL_MAPPING_UV 0
|
|
#define GAMEMTL_MAPPING_ENV 1
|
|
#define GAMEMTL_MAPPING_CHEAP_ENV 2
|
|
#define GAMEMTL_MAPPING_SCREEN 3
|
|
#define GAMEMTL_MAPPING_LINEAR_OFFSET 4
|
|
#define GAMEMTL_MAPPING_SILHOUETTE 5
|
|
#define GAMEMTL_MAPPING_SCALE 6
|
|
#define GAMEMTL_MAPPING_GRID 7
|
|
#define GAMEMTL_MAPPING_ROTATE 8
|
|
#define GAMEMTL_MAPPING_SINE_LINEAR_OFFSET 9
|
|
#define GAMEMTL_MAPPING_STEP_LINEAR_OFFSET 10
|
|
#define GAMEMTL_MAPPING_ZIGZAG_LINEAR_OFFSET 11
|
|
#define GAMEMTL_MAPPING_WS_CLASSIC_ENV 12
|
|
#define GAMEMTL_MAPPING_WS_ENVIRONMENT 13
|
|
#define GAMEMTL_MAPPING_GRID_CLASSIC_ENV 14
|
|
#define GAMEMTL_MAPPING_GRID_ENVIRONMENT 15
|
|
#define GAMEMTL_MAPPING_RANDOM 16
|
|
#define GAMEMTL_MAPPING_EDGE 17
|
|
#define GAMEMTL_MAPPING_BUMPENV 18
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PSX Translucency Type
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////
|
|
#define GAMEMTL_PSX_TRANS_NONE 0
|
|
#define GAMEMTL_PSX_TRANS_100 1
|
|
#define GAMEMTL_PSX_TRANS_50 2
|
|
#define GAMEMTL_PSX_TRANS_25 3
|
|
#define GAMEMTL_PSX_TRANS_MINUS_100 4
|
|
|
|
class GameMtlDlg;
|
|
class GameMapsClass;
|
|
|
|
extern Class_ID GameMaterialClassID;
|
|
extern ClassDesc * Get_Game_Material_Desc();
|
|
|
|
// MLL
|
|
// For Playstation 2 materials.
|
|
extern Class_ID PS2GameMaterialClassID;
|
|
extern ClassDesc * Get_PS2_Game_Material_Desc();
|
|
|
|
extern Class_ID PCToPS2MaterialClassID;
|
|
extern ClassDesc * Get_PS2_Material_Conversion();
|
|
|
|
///////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Game Material
|
|
// This is a plugin-material which attempts to emulate the material
|
|
// used in our in-game 3D engine. It has varying degrees of success
|
|
// at making Max render things like our game but it gives us the
|
|
// ability to have control over all parameters in our material.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////
|
|
class GameMtl: public Mtl
|
|
{
|
|
|
|
public:
|
|
|
|
enum ShaderTypeEnum
|
|
{
|
|
STE_PC_SHADER,
|
|
STE_PS2_SHADER,
|
|
};
|
|
|
|
GameMtl(BOOL loading = FALSE);
|
|
~GameMtl(void);
|
|
|
|
Class_ID ClassID();
|
|
SClass_ID SuperClassID();
|
|
|
|
// From Animatable
|
|
void GetClassName(TSTR& s);
|
|
void DeleteThis() { delete this; }
|
|
int NumSubs();
|
|
Animatable * SubAnim(int i);
|
|
TSTR SubAnimName(int i);
|
|
|
|
// References
|
|
int NumRefs() { return REF_COUNT; }
|
|
RefTargetHandle Clone(RemapDir &remap = NoRemap());
|
|
RefResult NotifyRefChanged(Interval changeInt, RefTargetHandle hTarget, PartID& partID, RefMessage message);
|
|
void SetReference(int i, RefTargetHandle rtarg);
|
|
RefTargetHandle GetReference(int i);
|
|
|
|
// From MtlBase and Mtl
|
|
void SetAmbient(Color c, TimeValue t) { Set_Ambient(0,t,c); }
|
|
void SetDiffuse(Color c, TimeValue t) { Set_Diffuse(0,t,c); }
|
|
void SetSpecular(Color c, TimeValue t) { Set_Specular(0,t,c); }
|
|
void SetShininess(float v, TimeValue t) { Set_Shininess(0,t,v); }
|
|
Color GetAmbient(int mtlNum=0, BOOL backFace=FALSE) { return Get_Ambient(0,0); }
|
|
Color GetDiffuse(int mtlNum=0, BOOL backFace=FALSE) { return Get_Diffuse(0,0); }
|
|
Color GetSpecular(int mtlNum=0, BOOL backFace=FALSE) { return Get_Specular(0,0); }
|
|
float GetXParency(int mtlNum=0, BOOL backFace=FALSE) { return 0.0f; }
|
|
float GetShininess(int mtlNum=0, BOOL backFace=FALSE) { return Get_Shininess(0,0); }
|
|
float GetShinStr(int mtlNum=0, BOOL backFace=FALSE) { return 1.0f; }
|
|
void Reset(void);
|
|
void Update(TimeValue t, Interval& validr);
|
|
Interval Validity(TimeValue t);
|
|
|
|
int NumSubTexmaps(void);
|
|
void SetSubTexmap(int i, Texmap * m);
|
|
Texmap * GetSubTexmap(int i);
|
|
|
|
float EvalDisplacement(ShadeContext& sc);
|
|
Interval DisplacementValidity(TimeValue t);
|
|
|
|
// Rendering
|
|
void Shade(ShadeContext& sc);
|
|
ULONG Requirements(int subMtlNum);
|
|
//ULONG LocalRequirements(int subMtlNum);
|
|
|
|
// Material editor
|
|
void SetParamDlg(GameMtlDlg * pd) { MaterialDialog = pd; }
|
|
ParamDlg* CreateParamDlg(HWND hwMtlEdit, IMtlParams *imp);
|
|
|
|
// IO stuff
|
|
IOResult Save(ISave* iSave);
|
|
IOResult Load(ILoad* iLoad);
|
|
|
|
// Accessors...
|
|
void Set_Flag(ULONG f, ULONG val) { if (val) Flags|=f; else Flags &= ~f; }
|
|
int Get_Flag(ULONG f) { return ((Flags&f) ? 1 : 0); }
|
|
|
|
void Set_Surface_Type(unsigned int type) { SurfaceType = type; }
|
|
unsigned int Get_Surface_Type(void) const { return SurfaceType; }
|
|
|
|
void Set_Sort_Level(int level) { SortLevel = level; }
|
|
int Get_Sort_Level(void) const { return SortLevel; }
|
|
|
|
void Set_Pass_Count(int passcount);
|
|
int Get_Pass_Count(void);
|
|
|
|
IParamBlock * Get_Parameter_Block(int pass);
|
|
int Get_Current_Page(int pass) { return CurPage[pass]; }
|
|
Color Get_Ambient(int pass,TimeValue t);
|
|
Color Get_Diffuse(int pass,TimeValue t);
|
|
Color Get_Specular(int pass,TimeValue t);
|
|
Color Get_Emissive(int pass,TimeValue t);
|
|
float Get_Shininess(int pass,TimeValue t);
|
|
float Get_Opacity(int pass,TimeValue t);
|
|
float Get_Translucency(int pass,TimeValue t);
|
|
int Get_Copy_Specular_To_Diffuse(int pass);
|
|
int Get_Mapping_Type(int pass, int stage=0);
|
|
int Get_PSX_Translucency(int pass);
|
|
int Get_PSX_Lighting(int pass);
|
|
|
|
int Get_Depth_Compare(int pass);
|
|
int Get_Depth_Mask(int pass);
|
|
int Get_Alpha_Test(int pass);
|
|
int Get_Dest_Blend(int pass);
|
|
int Get_Pri_Gradient(int pass);
|
|
int Get_Sec_Gradient(int pass);
|
|
int Get_Src_Blend(int pass);
|
|
int Get_Detail_Color_Func(int pass);
|
|
int Get_Detail_Alpha_Func(int pass);
|
|
int Get_PS2_Shader_Param_A(int pass);
|
|
int Get_PS2_Shader_Param_B(int pass);
|
|
int Get_PS2_Shader_Param_C(int pass);
|
|
int Get_PS2_Shader_Param_D(int pass);
|
|
|
|
int Get_Texture_Enable(int pass,int stage);
|
|
int Get_Texture_Publish(int pass,int stage);
|
|
int Get_Texture_Resize(int pass,int stage); // NOTE: obsolete, replaced by Get_Texture_No_LOD
|
|
int Get_Texture_No_Mipmap(int pass,int stage); // NOTE: obsolete, replaced by Get_Texture_No_LOD
|
|
int Get_Texture_Clamp_U(int pass,int stage);
|
|
int Get_Texture_Clamp_V(int pass,int stage);
|
|
int Get_Texture_No_LOD(int pass,int stage);
|
|
int Get_Texture_Alpha_Bitmap(int pass,int stage);
|
|
int Get_Texture_Hint(int pass,int stage);
|
|
int Get_Texture_Display(int pass,int stage);
|
|
float Get_Texture_Frame_Rate(int pass,int stage);
|
|
int Get_Texture_Frame_Count(int pass,int stage);
|
|
int Get_Texture_Anim_Type(int pass,int stage);
|
|
Texmap * Get_Texture(int pass,int stage);
|
|
Texmap * Get_Displacement_Map(void) const { return DisplacementMap; }
|
|
float Get_Displacement_Amount(void) const { return DisplacementAmt; }
|
|
int Get_Displacement_Map_Index(void) const;
|
|
int Get_Map_Channel(int pass,int stage);
|
|
|
|
void Set_Current_Page(int pass,int page) { CurPage[pass] = page; }
|
|
void Set_Ambient(int pass,TimeValue t,Color color);
|
|
void Set_Diffuse(int pass,TimeValue t,Color color);
|
|
void Set_Specular(int pass,TimeValue t,Color color);
|
|
void Set_Emissive(int pass,TimeValue t,Color color);
|
|
void Set_Shininess(int pass,TimeValue t,float val);
|
|
void Set_Opacity(int pass,TimeValue t,float val);
|
|
void Set_Translucency(int pass,TimeValue t,float val);
|
|
void Set_Copy_Specular_To_Diffuse(int pass,bool val);
|
|
void Set_Mapping_Type(int pass,int stage,int val);
|
|
void Set_PSX_Translucency(int pass,int val);
|
|
void Set_PSX_Lighting(int pass,bool val);
|
|
|
|
void Set_Depth_Compare(int pass,int val);
|
|
void Set_Depth_Mask(int pass,int val);
|
|
void Set_Alpha_Test(int pass,int val);
|
|
void Set_Dest_Blend(int pass,int val);
|
|
void Set_Pri_Gradient(int pass,int val);
|
|
void Set_Sec_Gradient(int pass,int val);
|
|
void Set_Src_Blend(int pass,int val);
|
|
void Set_Detail_Color_Func(int pass,int val);
|
|
void Set_Detail_Alpha_Func(int pass,int val);
|
|
void Set_PS2_Shader_Param_A(int pass,int val);
|
|
void Set_PS2_Shader_Param_B(int pass,int val);
|
|
void Set_PS2_Shader_Param_C(int pass,int val);
|
|
void Set_PS2_Shader_Param_D(int pass,int val);
|
|
|
|
void Set_Texture_Enable(int pass,int stage,bool val);
|
|
void Set_Texture_Publish(int pass,int stage,bool val);
|
|
void Set_Texture_Resize(int pass,int stage,bool val); // NOTE: obsolete: replaced by Set_Texture_No_LOD
|
|
void Set_Texture_No_Mipmap(int pass,int stage,bool val); // NOTE: obsolete: replaced by Set_Texture_No_LOD
|
|
void Set_Texture_Clamp_U(int pass,int stage,bool val);
|
|
void Set_Texture_Clamp_V(int pass,int stage,bool val);
|
|
void Set_Texture_No_LOD(int pass,int stage,bool val);
|
|
void Set_Texture_Alpha_Bitmap(int pass,int stage,bool val);
|
|
void Set_Texture_Hint(int pass,int stage,int val);
|
|
void Set_Texture_Display(int pass,int stage,bool val);
|
|
void Set_Texture_Frame_Rate(int pass,int stage,float val);
|
|
void Set_Texture_Frame_Count(int pass,int stage,int val);
|
|
void Set_Texture_Anim_Type(int pass,int stage,int val);
|
|
void Set_Texture(int pass,int stage,Texmap * tex);
|
|
void Set_Displacement_Amount(float amount) { DisplacementAmt = amount; Notify_Changed (); }
|
|
|
|
void Set_Map_Channel(int pass,int stage,int channel);
|
|
|
|
void Notify_Changed(void);
|
|
|
|
// This returns the mapping args string buffer for that pass after
|
|
// assuring that it is at least of length 'len'.
|
|
char * Get_Mapping_Arg_Buffer(int pass, int stage=0, unsigned int len = 0U);
|
|
|
|
int pass_stage_to_texmap_index(int pass,int stage);
|
|
void texmap_index_to_pass_stage(int index,int * set_pass,int * set_stage);
|
|
|
|
// Set and get the type of shader, PC or PS2.
|
|
// MLL
|
|
int Get_Shader_Type() {return (ShaderType);}
|
|
void Set_Shader_Type(int shadertype) {ShaderType = shadertype;}
|
|
|
|
// Approximate the PS2 shader on the PC.
|
|
int Compute_PC_Shader_From_PS2_Shader(int pass);
|
|
int Compute_PS2_Shader_From_PC_Shader(int pass);
|
|
|
|
// IML: Get/set substitute material.
|
|
Mtl* Substitute_Material() {return (SubstituteMaterial);}
|
|
void Set_Substitute_Material (Mtl *m) {SubstituteMaterial = m;}
|
|
|
|
private:
|
|
|
|
int texture_ref_index(int pass,int stage) { return REF_TEXTURE + pass*W3dMaterialClass::MAX_STAGES + stage; }
|
|
int pass_ref_index(int pass) { return REF_PASS_PARAMETERS + pass; }
|
|
|
|
void update_viewport_display();
|
|
|
|
// Do the shade functions specific to the Playstation 2.
|
|
void ps2_shade(ShadeContext& sc);
|
|
|
|
|
|
unsigned int SurfaceType;
|
|
int SortLevel;
|
|
|
|
Interval Ivalid; // Valid interval
|
|
GameMtlDlg * MaterialDialog; // Dialog
|
|
ULONG Flags; // Flags
|
|
int RollScroll; // Rollup scroll position
|
|
int CurPage[W3dMaterialClass::MAX_PASSES]; // which page was last open for each pass
|
|
|
|
GameMapsClass * Maps; // ref 0 (obsolete...)
|
|
IParamBlock * MainParameterBlock;
|
|
IParamBlock * PassParameterBlock[W3dMaterialClass::MAX_PASSES];
|
|
Texmap * Texture[W3dMaterialClass::MAX_PASSES][W3dMaterialClass::MAX_STAGES];
|
|
char * MapperArg[W3dMaterialClass::MAX_PASSES][W3dMaterialClass::MAX_STAGES];
|
|
unsigned int MapperArgLen[W3dMaterialClass::MAX_PASSES][W3dMaterialClass::MAX_STAGES];
|
|
Texmap * DisplacementMap;
|
|
float DisplacementAmt;
|
|
|
|
// MLL
|
|
int ShaderType;
|
|
enum
|
|
{
|
|
REF_MAPS = 0, // obsolete, gamemaps object
|
|
REF_MAIN = 1, // main parameter block is ref 1
|
|
REF_PASS_PARAMETERS = 2, // pass parameter blocks are refs 2,3,4,5
|
|
REF_TEXTURE = 6, // textures are refs 6,7,8,9,10,11,12,13,14 (14 is the displacement map)
|
|
REF_COUNT = 15
|
|
};
|
|
|
|
Mtl *SubstituteMaterial; // IML: Temporary material used during game to standard material conversion and vice-versa.
|
|
|
|
friend class GameMtlDlg;
|
|
friend class GameMtlPostLoad;
|
|
};
|
|
|
|
Mtl * CreateGameMtl();
|
|
|
|
#endif
|
|
|
|
|
|
|