GameMtl.cpp 126 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459
  1. /*
  2. ** Command & Conquer Renegade(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /* $Header: /Commando/Code/Tools/max2w3d/GameMtl.cpp 65 4/08/02 4:20p Greg_h $ */
  19. /***********************************************************************************************
  20. *** Confidential - Westwood Studios ***
  21. ***********************************************************************************************
  22. * *
  23. * Project Name : Commando / G 3D engine *
  24. * *
  25. * File Name : GAMEMTL.CPP *
  26. * *
  27. * Programmer : Greg Hjelstrom *
  28. * *
  29. * Start Date : 06/26/97 *
  30. * *
  31. * Last Update : 10/26/1999997 [GH] *
  32. * *
  33. *---------------------------------------------------------------------------------------------*
  34. * Functions: *
  35. * GameMtl::GameMtl -- constructor *
  36. * GameMtl::~GameMtl -- destructor *
  37. * GameMtl::ClassID -- returns the max ClassID of the material plugin *
  38. * GameMtl::SuperClassID -- returns the super class ID *
  39. * GameMtl::GetClassName -- returns the name of this plugin clas *
  40. * GameMtl::NumSubs -- returns the number of sub animations *
  41. * GameMtl::SubAnimName -- returns the name of the i'th sub animation *
  42. * GameMtl::SubAnim -- returns the i'th sub-anim *
  43. * GameMtl::Clone -- clones this material *
  44. * GameMtl::NotifyRefChanged -- NotifyRefChanged handler *
  45. * GameMtl::SetReference -- set the i'th reference *
  46. * GameMtl::GetReference -- returnst the i'th reference *
  47. * GameMtl::NumSubTexmaps -- returns the number of texture maps in this material *
  48. * GameMtl::SetSubTexmap -- set the i'th texture map *
  49. * GameMtl::GetSubTexmap -- returns the i'th texture map *
  50. * GameMtl::CreateParamDlg -- creates the material editor dialog box *
  51. * GameMtl::Notify_Changed -- someone has changed this material *
  52. * GameMtl::Reset -- reset this material to default settings *
  53. * GameMtl::Update -- time has changed *
  54. * GameMtl::Validity -- return the validity of the material at time t *
  55. * GameMtl::Requirements -- what requirements does this material have? *
  56. * GameMtl::Load -- loading from a MAX file *
  57. * GameMtl::Save -- Saving into a MAX file *
  58. * GameMtl::Shade -- evaluate the material for the renderer. *
  59. * GameMtl::ps2_shade -- Emulate the PS2 shader. *
  60. * GameMtl::Compute_PC_Shader_From_PS2_Shader -- Determine if a PC shader can be created. *
  61. * GameMtl::Compute_PS2_Shader_From_PC_Shader -- Change a W3D material to a PS2 W3D material.*
  62. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  63. #include "gamemtl.h"
  64. #include <Max.h>
  65. #include <gport.h>
  66. #include <hsv.h>
  67. #include "GMaxMtlDlg.h"
  68. #include "GameMtlDlg.h"
  69. #include "dllmain.h"
  70. #include "resource.h"
  71. #include "util.h"
  72. #include "meshsave.h"
  73. #include "gamemaps.h"
  74. #include "gameMtlForm.h"
  75. #include "notify.h"
  76. /*****************************************************************
  77. *
  78. * GameMtl Class Descriptor
  79. *
  80. *****************************************************************/
  81. Class_ID GameMaterialClassID(GAMEMTL_ID_PARTA, GAMEMTL_ID_PARTB);
  82. class GameMaterialClassDesc:public ClassDesc {
  83. #if defined W3D_GMAXDEV
  84. protected:
  85. GameMtl* TheMtl;
  86. GameMtlActionCB* Game_mtl_actionCB;
  87. public:
  88. int NumActionTables() { return 1; }
  89. ActionTable* GetActionTable(int action_index);
  90. void *Create(BOOL loading) {
  91. TheMtl = new GameMtl(loading); //Do not call createNew GameMtl() since the system should take care of the
  92. //additionla stuff in that function
  93. Game_mtl_actionCB = new GameMtlActionCB (TheMtl);
  94. IActionManager* am = GetCOREInterface()->GetActionManager();
  95. am->ActivateActionTable(Game_mtl_actionCB, kGameMtlActions);
  96. return TheMtl;
  97. }
  98. #else
  99. public:
  100. void * Create(BOOL loading) { return new GameMtl(loading);}
  101. #endif
  102. int IsPublic() { return 1; }
  103. const TCHAR * ClassName() { return Get_String(IDS_GAMEMTL); }
  104. SClass_ID SuperClassID() { return MATERIAL_CLASS_ID; }
  105. Class_ID ClassID() { return GameMaterialClassID; }
  106. const TCHAR* Category() { return _T(""); }
  107. };
  108. static GameMaterialClassDesc _GameMaterialCD;
  109. ClassDesc * Get_Game_Material_Desc() { return &_GameMaterialCD; }
  110. /******************************************************************************
  111. *
  112. * PostLoadCallback for GameMtl
  113. *
  114. ******************************************************************************/
  115. class GameMtlPostLoad : public PostLoadCallback
  116. {
  117. public:
  118. GameMtl *m;
  119. GameMtlPostLoad(GameMtl *b) { m=b; IsOld = false;}
  120. void proc(ILoad *iload);
  121. /*
  122. ** Data from the previous version of GameMtl
  123. */
  124. bool IsOld;
  125. ULONG Attributes;
  126. Color Diffuse;
  127. Color Specular;
  128. Color AmbientCoeff;
  129. Color DiffuseCoeff;
  130. Color SpecularCoeff;
  131. Color EmissiveCoeff;
  132. float FogCoeff;
  133. int DCTFrames;
  134. int DITFrames;
  135. int SCTFrames;
  136. int SITFrames;
  137. float DCTFrameRate;
  138. float DITFrameRate;
  139. float SCTFrameRate;
  140. float SITFrameRate;
  141. int DCTMappingType;
  142. int DITMappingType;
  143. int SCTMappingType;
  144. int SITMappingType;
  145. float Opacity;
  146. float Translucency;
  147. float Shininess;
  148. };
  149. /******************************************************************************
  150. *
  151. * GameMtl
  152. *
  153. * Notes:
  154. * Prior to Nov, 1998 I was storing everything about the material in custom
  155. * chunks. As part of the upgrade to surrender 1.4x, I'm going to use
  156. * a parameter block for each pass (combination of shader and vertex material)
  157. *
  158. ******************************************************************************/
  159. #define MTL_HDR_CHUNK 0x4000
  160. /*
  161. ** Custom Chunk IDs
  162. */
  163. #define GAMEMTL_FLAGS_CHUNK 0x0000
  164. #define GAMEMTL_GAMEFLAGS_CHUNK 0x0001 // OBSOLETE!
  165. #define GAMEMTL_COLORS_CHUNK 0x0002 // OBSOLETE!
  166. #define GAMEMTL_TEXTURE_FRAMES_CHUNK 0x0003
  167. #define GAMEMTL_ENVMAP_FRAMES_CHUNK 0x0004
  168. #define GAMEMTL_DCT_FRAMES_CHUNK GAMEMTL_TEXTURE_FRAMES_CHUNK
  169. #define GAMEMTL_DIT_FRAMES_CHUNK GAMEMTL_ENVMAP_FRAMES_CHUNK
  170. #define GAMEMTL_SCT_FRAMES_CHUNK 0x0005
  171. #define GAMEMTL_SIT_FRAMES_CHUNK 0x0006
  172. #define GAMEMTL_DCT_FRAME_RATE_CHUNK 0x0010
  173. #define GAMEMTL_DIT_FRAME_RATE_CHUNK 0x0011
  174. #define GAMEMTL_SCT_FRAME_RATE_CHUNK 0x0012
  175. #define GAMEMTL_SIT_FRAME_RATE_CHUNK 0x0013
  176. #define GAMEMTL_DCT_MAPPING_CHUNK 0x0020
  177. #define GAMEMTL_DIT_MAPPING_CHUNK 0x0021
  178. #define GAMEMTL_SCT_MAPPING_CHUNK 0x0022
  179. #define GAMEMTL_SIT_MAPPING_CHUNK 0x0023
  180. #define GAMEMTL_ATTRIBUTES_CHUNK 0x0030
  181. #define GAMEMTL_DIFFUSE_COLOR_CHUNK 0x0031
  182. #define GAMEMTL_SPECULAR_COLOR_CHUNK 0x0032
  183. #define GAMEMTL_AMBIENT_COEFF_CHUNK 0x0040
  184. #define GAMEMTL_DIFFUSE_COEFF_CHUNK 0x0041
  185. #define GAMEMTL_SPECULAR_COEFF_CHUNK 0x0042
  186. #define GAMEMTL_EMISSIVE_COEFF_CHUNK 0x0043
  187. #define GAMEMTL_OPACITY_CHUNK 0x0050
  188. #define GAMEMTL_TRANSLUCENCY_CHUNK 0x0051
  189. #define GAMEMTL_SHININESS_CHUNK 0x0052
  190. #define GAMEMTL_FOG_CHUNK 0x0053
  191. #define GAMEMTL_PASS0_CUR_PAGE 0x0060
  192. #define GAMEMTL_PASS1_CUR_PAGE 0x0061
  193. #define GAMEMTL_PASS2_CUR_PAGE 0x0062
  194. #define GAMEMTL_PASS3_CUR_PAGE 0x0064
  195. #define GAMEMTL_PASS0_STAGE0_MAPPER_ARGS 0x0070
  196. #define GAMEMTL_PASS1_STAGE0_MAPPER_ARGS 0x0071
  197. #define GAMEMTL_PASS2_STAGE0_MAPPER_ARGS 0x0072
  198. #define GAMEMTL_PASS3_STAGE0_MAPPER_ARGS 0x0073
  199. #define GAMEMTL_SURFACE_TYPE_CHUNK 0x0080
  200. #define GAMEMTL_SORT_LEVEL_CHUNK 0x0090
  201. #define GAMEMTL_PASS0_STAGE1_MAPPER_ARGS 0x0100
  202. #define GAMEMTL_PASS1_STAGE1_MAPPER_ARGS 0x0101
  203. #define GAMEMTL_PASS2_STAGE1_MAPPER_ARGS 0x0102
  204. #define GAMEMTL_PASS3_STAGE1_MAPPER_ARGS 0x0103
  205. /*
  206. ** Main Parameter Block Definition
  207. */
  208. static ParamBlockDescID MainParameterBlockDesc[] =
  209. {
  210. { TYPE_INT, NULL, FALSE, 0 }, // Pass Count
  211. };
  212. /*
  213. ** ID numbers for parameter block entries. As of version 4 of the
  214. ** parameter block definitions, these enums should be used directly
  215. ** in the pblock defs to avoid accidental ID mismatches.
  216. **
  217. ** Note: You should DO NOTHING TO CHANGE THE VALUES OF THE ENUM
  218. ** (except adding at the end of course). Following these constraints
  219. ** will preserve backwards compatibility with all pblock versions.
  220. **
  221. ** Since this enum is now just a series of ID numbers, we must
  222. ** manually keep the PASS_PARAMBLOCK_LENGTH up to date. Believe it
  223. ** or not, but this is less error-prone than the previous way of
  224. ** doing things.
  225. **
  226. ** (gth) Aug 6, 2000
  227. ** IMPORTANT -PLEASE READ-
  228. ** The following enums are basically the index into the array of
  229. ** ParamBlockDescID's that we are using. It is critical that this
  230. ** enumeration does not skip indexes and that the value for each
  231. ** symbol in this list matches the position in the param block
  232. ** for that variable. This enumeration is does not define the
  233. ** id for the new variable, only its position in the array.
  234. **
  235. ** When you add a new variable to the parameter block, you should
  236. ** find an id for it higher than any existing id (look through the
  237. ** rest of the entries in the parameter block). That id will not
  238. ** usually be able to be the same as its array index due to the
  239. ** evolution of this structure. The id I'm referring to is the
  240. ** number in the 4th element of each of the ParamBlockDescIDs.
  241. **
  242. ** If you remove an entry from our array of ParamBlockDescIDs you
  243. ** will need to update all of the PB_xxx enumeration below so that
  244. ** they match their position in the array again.
  245. */
  246. enum
  247. {
  248. PB_AMBIENT = 0,
  249. PB_DIFFUSE = 1,
  250. PB_SPECULAR = 2,
  251. PB_EMISSIVE = 3,
  252. PB_SHININESS = 4,
  253. PB_OPACITY = 5,
  254. PB_TRANSLUCENCY = 6,
  255. PB_COPY_SPECULAR_TO_DIFFUSE = 7,
  256. PB_STAGE0_MAPPING_TYPE = 8,
  257. PB_PSX_TRANSLUCENCY = 9,
  258. PB_PSX_LIGHTING = 10,
  259. PB_DEPTH_COMPARE = 11,
  260. PB_DEPTH_MASK = 12,
  261. PB_COLOR_MASK = 13, // obsolete (ignored)
  262. PB_DEST_BLEND = 14,
  263. PB_FOG_FUNC = 15, // obsolete (ignored)
  264. PB_PRI_GRADIENT = 16,
  265. PB_SEC_GRADIENT = 17,
  266. PB_SRC_BLEND = 18,
  267. PB_DETAIL_COLOR_FUNC = 19,
  268. PB_DETAIL_ALPHA_FUNC = 20,
  269. PB_STAGE0_TEXTURE_ENABLE = 21,
  270. PB_STAGE0_TEXTURE_PUBLISH = 22,
  271. PB_STAGE0_TEXTURE_RESIZE = 23, // obsolete (ignored)
  272. PB_STAGE0_TEXTURE_NO_MIPMAP = 24, // obsolete (ignored)
  273. PB_STAGE0_TEXTURE_CLAMP_U = 25,
  274. PB_STAGE0_TEXTURE_CLAMP_V = 26,
  275. PB_STAGE0_TEXTURE_HINT = 27,
  276. PB_STAGE0_TEXTURE_DISPLAY = 28,
  277. PB_STAGE0_TEXTURE_FRAME_RATE = 29,
  278. PB_STAGE0_TEXTURE_FRAME_COUNT = 30,
  279. PB_STAGE0_TEXTURE_ANIM_TYPE = 31,
  280. PB_STAGE1_TEXTURE_ENABLE = 32,
  281. PB_STAGE1_TEXTURE_PUBLISH = 33,
  282. PB_STAGE1_TEXTURE_RESIZE = 34, // obsolete (ignored)
  283. PB_STAGE1_TEXTURE_NO_MIPMAP = 35, // obsolete (ignored)
  284. PB_STAGE1_TEXTURE_CLAMP_U = 36,
  285. PB_STAGE1_TEXTURE_CLAMP_V = 37,
  286. PB_STAGE1_TEXTURE_HINT = 38,
  287. PB_STAGE1_TEXTURE_DISPLAY = 39,
  288. PB_STAGE1_TEXTURE_FRAME_RATE = 40,
  289. PB_STAGE1_TEXTURE_FRAME_COUNT = 41,
  290. PB_STAGE1_TEXTURE_ANIM_TYPE = 42,
  291. PB_STAGE0_TEXTURE_ALPHA_BITMAP = 43,
  292. PB_STAGE1_TEXTURE_ALPHA_BITMAP = 44,
  293. PB_ALPHA_TEST = 45,
  294. PB_SHADER_PRESET = 46, // obsolete (ignored)
  295. // For the Playstation 2.
  296. PB_PS2_SHADER_PARAM_A = 47,
  297. PB_PS2_SHADER_PARAM_B = 48,
  298. PB_PS2_SHADER_PARAM_C = 49,
  299. PB_PS2_SHADER_PARAM_D = 50,
  300. // UV Channel selection
  301. PB_STAGE0_MAP_CHANNEL = 51,
  302. PB_STAGE1_MAP_CHANNEL = 52,
  303. PB_STAGE1_MAPPING_TYPE = 53, // (gth) this can't be 55, it is used as an array index // = 55, // yes, 55
  304. // textures can now disable LOD
  305. PB_STAGE0_TEXTURE_NO_LOD = 54,
  306. PB_STAGE1_TEXTURE_NO_LOD = 55,
  307. };
  308. /*
  309. ** Per-Pass Parameter Block Definition
  310. */
  311. // Version 0 (old version)
  312. static ParamBlockDescID PassParameterBlockDescVer0[] =
  313. {
  314. { TYPE_POINT3, NULL, TRUE, 0 }, // Ambient
  315. { TYPE_POINT3, NULL, TRUE, 1 }, // Diffuse
  316. { TYPE_POINT3, NULL, TRUE, 2 }, // Specular
  317. { TYPE_POINT3, NULL, TRUE, 3 }, // Emissive
  318. { TYPE_FLOAT, NULL, TRUE, 4 }, // Shininess
  319. { TYPE_FLOAT, NULL, TRUE, 5 }, // Opacity
  320. { TYPE_FLOAT, NULL, TRUE, 6 }, // Translucency
  321. { TYPE_INT, NULL, FALSE, 7 }, // Mapping Type
  322. { TYPE_INT, NULL, FALSE, 8 }, // PSX Translucency Type
  323. { TYPE_BOOL, NULL, FALSE, 9 }, // PSX Lighting Flag
  324. { TYPE_INT, NULL, FALSE, 10}, // Depth Compare
  325. { TYPE_INT, NULL, FALSE, 11}, // Depth Mask
  326. { TYPE_INT, NULL, FALSE, 12}, // Color Mask
  327. { TYPE_INT, NULL, FALSE, 13}, // Dest Blend
  328. { TYPE_INT, NULL, FALSE, 14}, // FogFunc
  329. { TYPE_INT, NULL, FALSE, 15}, // PriGradient
  330. { TYPE_INT, NULL, FALSE, 16}, // SecGradient
  331. { TYPE_INT, NULL, FALSE, 17}, // SrcBlend
  332. { TYPE_INT, NULL, FALSE, 18}, // DetailColorFunc
  333. { TYPE_INT, NULL, FALSE, 19}, // DetailAlphaFunc
  334. { TYPE_INT, NULL, FALSE, 20}, // DitherMask
  335. { TYPE_INT, NULL, FALSE, 21}, // Shade Model
  336. { TYPE_BOOL, NULL, FALSE, 22}, // Stage0 Texture Enable
  337. { TYPE_BOOL, NULL, FALSE, 23}, // Stage0 Texture Publish
  338. { TYPE_BOOL, NULL, FALSE, 24}, // Stage0 Texture Display (in viewport...)
  339. { TYPE_FLOAT, NULL, FALSE, 25}, // Stage0 Frame Rate
  340. { TYPE_INT, NULL, FALSE, 26}, // Stage0 Frame Count
  341. { TYPE_INT, NULL, FALSE, 27}, // Stage0 Animation Type
  342. { TYPE_BOOL, NULL, FALSE, 28}, // Stage1 Texture Enable
  343. { TYPE_BOOL, NULL, FALSE, 29}, // Stage1 Texture Publish
  344. { TYPE_BOOL, NULL, FALSE, 30}, // Stage1 Texture Display (in viewport...)
  345. { TYPE_FLOAT, NULL, FALSE, 31}, // Stage1 Frame Rate
  346. { TYPE_INT, NULL, FALSE, 32}, // Stage1 Frame Count
  347. { TYPE_INT, NULL, FALSE, 33}, // Stage1 Animation Type
  348. };
  349. // Version 1
  350. static ParamBlockDescID PassParameterBlockDescVer1[] =
  351. {
  352. { TYPE_POINT3, NULL, TRUE, 0 }, // Ambient
  353. { TYPE_POINT3, NULL, TRUE, 1 }, // Diffuse
  354. { TYPE_POINT3, NULL, TRUE, 2 }, // Specular
  355. { TYPE_POINT3, NULL, TRUE, 3 }, // Emissive
  356. { TYPE_FLOAT, NULL, TRUE, 4 }, // Shininess
  357. { TYPE_FLOAT, NULL, TRUE, 5 }, // Opacity
  358. { TYPE_FLOAT, NULL, TRUE, 6 }, // Translucency
  359. { TYPE_BOOL, NULL, FALSE, 34}, // Copy specular to diffuse (new to version 1)
  360. { TYPE_INT, NULL, FALSE, 7 }, // Mapping Type
  361. { TYPE_INT, NULL, FALSE, 8 }, // PSX Translucency Type
  362. { TYPE_BOOL, NULL, FALSE, 9 }, // PSX Lighting Flag
  363. { TYPE_INT, NULL, FALSE, 10}, // Depth Compare
  364. { TYPE_INT, NULL, FALSE, 11}, // Depth Mask
  365. { TYPE_INT, NULL, FALSE, 12}, // Color Mask (now obsolete and ignored)
  366. { TYPE_INT, NULL, FALSE, 13}, // Dest Blend
  367. { TYPE_INT, NULL, FALSE, 14}, // FogFunc (now obsolete and ignored)
  368. { TYPE_INT, NULL, FALSE, 15}, // PriGradient
  369. { TYPE_INT, NULL, FALSE, 16}, // SecGradient
  370. { TYPE_INT, NULL, FALSE, 17}, // SrcBlend
  371. { TYPE_INT, NULL, FALSE, 18}, // DetailColorFunc
  372. { TYPE_INT, NULL, FALSE, 19}, // DetailAlphaFunc
  373. { TYPE_BOOL, NULL, FALSE, 22}, // Stage0 Texture Enable
  374. { TYPE_BOOL, NULL, FALSE, 23}, // Stage0 Texture Publish
  375. { TYPE_BOOL, NULL, FALSE, 35}, // Stage0 Texture Resize (new to version 1)
  376. { TYPE_BOOL, NULL, FALSE, 36}, // Stage0 Texture No Mipmap (new to version 1)
  377. { TYPE_BOOL, NULL, FALSE, 37}, // Stage0 Texture Clamp U (new to version 1)
  378. { TYPE_BOOL, NULL, FALSE, 38}, // Stage0 Texture Clamp V (new to version 1)
  379. { TYPE_INT, NULL, FALSE, 39}, // Stage0 Texture Hint (new to version 1)
  380. { TYPE_BOOL, NULL, FALSE, 24}, // Stage0 Texture Display (in viewport...)
  381. { TYPE_FLOAT, NULL, FALSE, 25}, // Stage0 Frame Rate
  382. { TYPE_INT, NULL, FALSE, 26}, // Stage0 Frame Count
  383. { TYPE_INT, NULL, FALSE, 27}, // Stage0 Animation Type
  384. { TYPE_BOOL, NULL, FALSE, 28}, // Stage1 Texture Enable
  385. { TYPE_BOOL, NULL, FALSE, 29}, // Stage1 Texture Publish
  386. { TYPE_BOOL, NULL, FALSE, 40}, // Stage1 Texture Resize (new to version 1)
  387. { TYPE_BOOL, NULL, FALSE, 41}, // Stage1 Texture No Mipmap (new to version 1)
  388. { TYPE_BOOL, NULL, FALSE, 42}, // Stage1 Texture Clamp U (new to version 1)
  389. { TYPE_BOOL, NULL, FALSE, 43}, // Stage1 Texture Clamp V (new to version 1)
  390. { TYPE_INT, NULL, FALSE, 44}, // Stage1 Texture Hint (new to version 1)
  391. { TYPE_BOOL, NULL, FALSE, 30}, // Stage1 Texture Display (in viewport...)
  392. { TYPE_FLOAT, NULL, FALSE, 31}, // Stage1 Frame Rate
  393. { TYPE_INT, NULL, FALSE, 32}, // Stage1 Frame Count
  394. { TYPE_INT, NULL, FALSE, 33}, // Stage1 Animation Type
  395. { TYPE_BOOL, NULL, FALSE, 45}, // Stage0 Texture Alpha Bitmap (new to version 1)
  396. { TYPE_BOOL, NULL, FALSE, 46}, // Stage1 Texture Alpha Bitmap (new to version 1)
  397. { TYPE_BOOL, NULL, FALSE, 47}, // Alpha Test (new to version 1)
  398. { TYPE_INT, NULL, FALSE, 48}, // Shader preset (new to version 1) (now obsolete and ignored)
  399. };
  400. // Version 2 (old version)
  401. static ParamBlockDescID PassParameterBlockDescVer2[] =
  402. {
  403. { TYPE_POINT3, NULL, TRUE, 0 }, // Ambient
  404. { TYPE_POINT3, NULL, TRUE, 1 }, // Diffuse
  405. { TYPE_POINT3, NULL, TRUE, 2 }, // Specular
  406. { TYPE_POINT3, NULL, TRUE, 3 }, // Emissive
  407. { TYPE_FLOAT, NULL, TRUE, 4 }, // Shininess
  408. { TYPE_FLOAT, NULL, TRUE, 5 }, // Opacity
  409. { TYPE_FLOAT, NULL, TRUE, 6 }, // Translucency
  410. { TYPE_BOOL, NULL, FALSE, 34}, // Copy specular to diffuse (new to version 1)
  411. { TYPE_INT, NULL, FALSE, 7 }, // Mapping Type
  412. { TYPE_INT, NULL, FALSE, 8 }, // PSX Translucency Type
  413. { TYPE_BOOL, NULL, FALSE, 9 }, // PSX Lighting Flag
  414. { TYPE_INT, NULL, FALSE, 10}, // Depth Compare
  415. { TYPE_INT, NULL, FALSE, 11}, // Depth Mask
  416. { TYPE_INT, NULL, FALSE, 12}, // Color Mask (now obsolete and ignored)
  417. { TYPE_INT, NULL, FALSE, 13}, // Dest Blend
  418. { TYPE_INT, NULL, FALSE, 14}, // FogFunc (now obsolete and ignored)
  419. { TYPE_INT, NULL, FALSE, 15}, // PriGradient
  420. { TYPE_INT, NULL, FALSE, 16}, // SecGradient
  421. { TYPE_INT, NULL, FALSE, 17}, // SrcBlend
  422. { TYPE_INT, NULL, FALSE, 18}, // DetailColorFunc
  423. { TYPE_INT, NULL, FALSE, 19}, // DetailAlphaFunc
  424. { TYPE_BOOL, NULL, FALSE, 22}, // Stage0 Texture Enable
  425. { TYPE_BOOL, NULL, FALSE, 23}, // Stage0 Texture Publish
  426. { TYPE_BOOL, NULL, FALSE, 35}, // Stage0 Texture Resize (new to version 1)
  427. { TYPE_BOOL, NULL, FALSE, 36}, // Stage0 Texture No Mipmap (new to version 1)
  428. { TYPE_BOOL, NULL, FALSE, 37}, // Stage0 Texture Clamp U (new to version 1)
  429. { TYPE_BOOL, NULL, FALSE, 38}, // Stage0 Texture Clamp V (new to version 1)
  430. { TYPE_INT, NULL, FALSE, 39}, // Stage0 Texture Hint (new to version 1)
  431. { TYPE_BOOL, NULL, FALSE, 24}, // Stage0 Texture Display (in viewport...)
  432. { TYPE_FLOAT, NULL, FALSE, 25}, // Stage0 Frame Rate
  433. { TYPE_INT, NULL, FALSE, 26}, // Stage0 Frame Count
  434. { TYPE_INT, NULL, FALSE, 27}, // Stage0 Animation Type
  435. { TYPE_BOOL, NULL, FALSE, 28}, // Stage1 Texture Enable
  436. { TYPE_BOOL, NULL, FALSE, 29}, // Stage1 Texture Publish
  437. { TYPE_BOOL, NULL, FALSE, 40}, // Stage1 Texture Resize (new to version 1)
  438. { TYPE_BOOL, NULL, FALSE, 41}, // Stage1 Texture No Mipmap (new to version 1)
  439. { TYPE_BOOL, NULL, FALSE, 42}, // Stage1 Texture Clamp U (new to version 1)
  440. { TYPE_BOOL, NULL, FALSE, 43}, // Stage1 Texture Clamp V (new to version 1)
  441. { TYPE_INT, NULL, FALSE, 44}, // Stage1 Texture Hint (new to version 1)
  442. { TYPE_BOOL, NULL, FALSE, 30}, // Stage1 Texture Display (in viewport...)
  443. { TYPE_FLOAT, NULL, FALSE, 31}, // Stage1 Frame Rate
  444. { TYPE_INT, NULL, FALSE, 32}, // Stage1 Frame Count
  445. { TYPE_INT, NULL, FALSE, 33}, // Stage1 Animation Type
  446. { TYPE_BOOL, NULL, FALSE, 45}, // Stage0 Texture Alpha Bitmap (new to version 1)
  447. { TYPE_BOOL, NULL, FALSE, 46}, // Stage1 Texture Alpha Bitmap (new to version 1)
  448. { TYPE_BOOL, NULL, FALSE, 47}, // Alpha Test (new to version 1)
  449. { TYPE_INT, NULL, FALSE, 48}, // Shader preset (new to version 1) (now obsolete and ignored)
  450. { TYPE_INT, NULL, FALSE, 49}, // PS2 Shader Param A
  451. { TYPE_INT, NULL, FALSE, 50}, // PS2 Shader Param B
  452. { TYPE_INT, NULL, FALSE, 51}, // PS2 Shader Param C
  453. { TYPE_INT, NULL, FALSE, 52}, // PS2 Shader Param D
  454. };
  455. // Version 3 (old version)
  456. static ParamBlockDescID PassParameterBlockDescVer3[] =
  457. {
  458. { TYPE_POINT3, NULL, TRUE, 0 }, // Ambient
  459. { TYPE_POINT3, NULL, TRUE, 1 }, // Diffuse
  460. { TYPE_POINT3, NULL, TRUE, 2 }, // Specular
  461. { TYPE_POINT3, NULL, TRUE, 3 }, // Emissive
  462. { TYPE_FLOAT, NULL, TRUE, 4 }, // Shininess
  463. { TYPE_FLOAT, NULL, TRUE, 5 }, // Opacity
  464. { TYPE_FLOAT, NULL, TRUE, 6 }, // Translucency
  465. { TYPE_BOOL, NULL, FALSE, 34}, // Copy specular to diffuse (new to version 1)
  466. { TYPE_INT, NULL, FALSE, 7 }, // Mapping Type
  467. { TYPE_INT, NULL, FALSE, 8 }, // PSX Translucency Type
  468. { TYPE_BOOL, NULL, FALSE, 9 }, // PSX Lighting Flag
  469. { TYPE_INT, NULL, FALSE, 10}, // Depth Compare
  470. { TYPE_INT, NULL, FALSE, 11}, // Depth Mask
  471. { TYPE_INT, NULL, FALSE, 12}, // Color Mask (now obsolete and ignored)
  472. { TYPE_INT, NULL, FALSE, 13}, // Dest Blend
  473. { TYPE_INT, NULL, FALSE, 14}, // FogFunc (now obsolete and ignored)
  474. { TYPE_INT, NULL, FALSE, 15}, // PriGradient
  475. { TYPE_INT, NULL, FALSE, 16}, // SecGradient
  476. { TYPE_INT, NULL, FALSE, 17}, // SrcBlend
  477. { TYPE_INT, NULL, FALSE, 18}, // DetailColorFunc
  478. { TYPE_INT, NULL, FALSE, 19}, // DetailAlphaFunc
  479. { TYPE_BOOL, NULL, FALSE, 22}, // Stage0 Texture Enable
  480. { TYPE_BOOL, NULL, FALSE, 23}, // Stage0 Texture Publish
  481. { TYPE_BOOL, NULL, FALSE, 35}, // Stage0 Texture Resize (new to version 1)
  482. { TYPE_BOOL, NULL, FALSE, 36}, // Stage0 Texture No Mipmap (new to version 1)
  483. { TYPE_BOOL, NULL, FALSE, 37}, // Stage0 Texture Clamp U (new to version 1)
  484. { TYPE_BOOL, NULL, FALSE, 38}, // Stage0 Texture Clamp V (new to version 1)
  485. { TYPE_INT, NULL, FALSE, 39}, // Stage0 Texture Hint (new to version 1)
  486. { TYPE_BOOL, NULL, FALSE, 24}, // Stage0 Texture Display (in viewport...)
  487. { TYPE_FLOAT, NULL, FALSE, 25}, // Stage0 Frame Rate
  488. { TYPE_INT, NULL, FALSE, 26}, // Stage0 Frame Count
  489. { TYPE_INT, NULL, FALSE, 27}, // Stage0 Animation Type
  490. { TYPE_BOOL, NULL, FALSE, 28}, // Stage1 Texture Enable
  491. { TYPE_BOOL, NULL, FALSE, 29}, // Stage1 Texture Publish
  492. { TYPE_BOOL, NULL, FALSE, 40}, // Stage1 Texture Resize (new to version 1)
  493. { TYPE_BOOL, NULL, FALSE, 41}, // Stage1 Texture No Mipmap (new to version 1)
  494. { TYPE_BOOL, NULL, FALSE, 42}, // Stage1 Texture Clamp U (new to version 1)
  495. { TYPE_BOOL, NULL, FALSE, 43}, // Stage1 Texture Clamp V (new to version 1)
  496. { TYPE_INT, NULL, FALSE, 44}, // Stage1 Texture Hint (new to version 1)
  497. { TYPE_BOOL, NULL, FALSE, 30}, // Stage1 Texture Display (in viewport...)
  498. { TYPE_FLOAT, NULL, FALSE, 31}, // Stage1 Frame Rate
  499. { TYPE_INT, NULL, FALSE, 32}, // Stage1 Frame Count
  500. { TYPE_INT, NULL, FALSE, 33}, // Stage1 Animation Type
  501. { TYPE_BOOL, NULL, FALSE, 45}, // Stage0 Texture Alpha Bitmap (new to version 1)
  502. { TYPE_BOOL, NULL, FALSE, 46}, // Stage1 Texture Alpha Bitmap (new to version 1)
  503. { TYPE_BOOL, NULL, FALSE, 47}, // Alpha Test (new to version 1)
  504. { TYPE_INT, NULL, FALSE, 48}, // Shader preset (new to version 1) (now obsolete and ignored)
  505. { TYPE_INT, NULL, FALSE, 49}, // PS2 Shader Param A
  506. { TYPE_INT, NULL, FALSE, 50}, // PS2 Shader Param B
  507. { TYPE_INT, NULL, FALSE, 51}, // PS2 Shader Param C
  508. { TYPE_INT, NULL, FALSE, 52}, // PS2 Shader Param D
  509. { TYPE_INT, NULL, FALSE, 53}, // Stage0 UV Channel
  510. { TYPE_INT, NULL, FALSE, 54}, // Stage1 UV Channel
  511. };
  512. // Version 4 (old version)
  513. static ParamBlockDescID PassParameterBlockDescVer4[] =
  514. {
  515. { TYPE_POINT3, NULL, TRUE, 0 }, // Ambient
  516. { TYPE_POINT3, NULL, TRUE, 1 }, // Diffuse
  517. { TYPE_POINT3, NULL, TRUE, 2 }, // Specular
  518. { TYPE_POINT3, NULL, TRUE, 3 }, // Emissive
  519. { TYPE_FLOAT, NULL, TRUE, 4 }, // Shininess
  520. { TYPE_FLOAT, NULL, TRUE, 5 }, // Opacity
  521. { TYPE_FLOAT, NULL, TRUE, 6 }, // Translucency
  522. { TYPE_BOOL, NULL, FALSE, 34}, // Copy specular to diffuse (new to version 1)
  523. { TYPE_INT, NULL, FALSE, 7 }, // Stage0 Mapping Type
  524. { TYPE_INT, NULL, FALSE, 8 }, // PSX Translucency Type
  525. { TYPE_BOOL, NULL, FALSE, 9 }, // PSX Lighting Flag
  526. { TYPE_INT, NULL, FALSE, 10}, // Depth Compare
  527. { TYPE_INT, NULL, FALSE, 11}, // Depth Mask
  528. { TYPE_INT, NULL, FALSE, 12}, // Color Mask (now obsolete and ignored)
  529. { TYPE_INT, NULL, FALSE, 13}, // Dest Blend
  530. { TYPE_INT, NULL, FALSE, 14}, // FogFunc (now obsolete and ignored)
  531. { TYPE_INT, NULL, FALSE, 15}, // PriGradient
  532. { TYPE_INT, NULL, FALSE, 16}, // SecGradient
  533. { TYPE_INT, NULL, FALSE, 17}, // SrcBlend
  534. { TYPE_INT, NULL, FALSE, 18}, // DetailColorFunc
  535. { TYPE_INT, NULL, FALSE, 19}, // DetailAlphaFunc
  536. { TYPE_BOOL, NULL, FALSE, 22}, // Stage0 Texture Enable
  537. { TYPE_BOOL, NULL, FALSE, 23}, // Stage0 Texture Publish
  538. { TYPE_BOOL, NULL, FALSE, 35}, // Stage0 Texture Resize (new to version 1)
  539. { TYPE_BOOL, NULL, FALSE, 36}, // Stage0 Texture No Mipmap (new to version 1)
  540. { TYPE_BOOL, NULL, FALSE, 37}, // Stage0 Texture Clamp U (new to version 1)
  541. { TYPE_BOOL, NULL, FALSE, 38}, // Stage0 Texture Clamp V (new to version 1)
  542. { TYPE_INT, NULL, FALSE, 39}, // Stage0 Texture Hint (new to version 1)
  543. { TYPE_BOOL, NULL, FALSE, 24}, // Stage0 Texture Display (in viewport...)
  544. { TYPE_FLOAT, NULL, FALSE, 25}, // Stage0 Frame Rate
  545. { TYPE_INT, NULL, FALSE, 26}, // Stage0 Frame Count
  546. { TYPE_INT, NULL, FALSE, 27}, // Stage0 Animation Type
  547. { TYPE_BOOL, NULL, FALSE, 28}, // Stage1 Texture Enable
  548. { TYPE_BOOL, NULL, FALSE, 29}, // Stage1 Texture Publish
  549. { TYPE_BOOL, NULL, FALSE, 40}, // Stage1 Texture Resize (new to version 1)
  550. { TYPE_BOOL, NULL, FALSE, 41}, // Stage1 Texture No Mipmap (new to version 1)
  551. { TYPE_BOOL, NULL, FALSE, 42}, // Stage1 Texture Clamp U (new to version 1)
  552. { TYPE_BOOL, NULL, FALSE, 43}, // Stage1 Texture Clamp V (new to version 1)
  553. { TYPE_INT, NULL, FALSE, 44}, // Stage1 Texture Hint (new to version 1)
  554. { TYPE_BOOL, NULL, FALSE, 30}, // Stage1 Texture Display (in viewport...)
  555. { TYPE_FLOAT, NULL, FALSE, 31}, // Stage1 Frame Rate
  556. { TYPE_INT, NULL, FALSE, 32}, // Stage1 Frame Count
  557. { TYPE_INT, NULL, FALSE, 33}, // Stage1 Animation Type
  558. { TYPE_BOOL, NULL, FALSE, 45}, // Stage0 Texture Alpha Bitmap (new to version 1)
  559. { TYPE_BOOL, NULL, FALSE, 46}, // Stage1 Texture Alpha Bitmap (new to version 1)
  560. { TYPE_BOOL, NULL, FALSE, 47}, // Alpha Test (new to version 1)
  561. { TYPE_INT, NULL, FALSE, 48}, // Shader preset (new to version 1) (now obsolete and ignored)
  562. { TYPE_INT, NULL, FALSE, 49}, // PS2 Shader Param A
  563. { TYPE_INT, NULL, FALSE, 50}, // PS2 Shader Param B
  564. { TYPE_INT, NULL, FALSE, 51}, // PS2 Shader Param C
  565. { TYPE_INT, NULL, FALSE, 52}, // PS2 Shader Param D
  566. { TYPE_INT, NULL, FALSE, 53}, // Stage0 UV Channel
  567. { TYPE_INT, NULL, FALSE, 54}, // Stage1 UV Channel
  568. { TYPE_INT, NULL, FALSE, 9998}, // foo
  569. { TYPE_INT, NULL, FALSE, 9999}, // bar
  570. { TYPE_INT, NULL, FALSE, 55}, // Stage1 Mapping Type (new to version 4)
  571. };
  572. // Version 5 (current version)
  573. static ParamBlockDescID PassParameterBlockDescVer5[] =
  574. {
  575. { TYPE_POINT3, NULL, TRUE, 0 }, // Ambient
  576. { TYPE_POINT3, NULL, TRUE, 1 }, // Diffuse
  577. { TYPE_POINT3, NULL, TRUE, 2 }, // Specular
  578. { TYPE_POINT3, NULL, TRUE, 3 }, // Emissive
  579. { TYPE_FLOAT, NULL, TRUE, 4 }, // Shininess
  580. { TYPE_FLOAT, NULL, TRUE, 5 }, // Opacity
  581. { TYPE_FLOAT, NULL, TRUE, 6 }, // Translucency
  582. { TYPE_BOOL, NULL, FALSE, 34}, // Copy specular to diffuse (new to version 1)
  583. { TYPE_INT, NULL, FALSE, 7 }, // Stage0 Mapping Type
  584. { TYPE_INT, NULL, FALSE, 8 }, // PSX Translucency Type
  585. { TYPE_BOOL, NULL, FALSE, 9 }, // PSX Lighting Flag
  586. { TYPE_INT, NULL, FALSE, 10}, // Depth Compare
  587. { TYPE_INT, NULL, FALSE, 11}, // Depth Mask
  588. { TYPE_INT, NULL, FALSE, 12}, // Color Mask (now obsolete and ignored)
  589. { TYPE_INT, NULL, FALSE, 13}, // Dest Blend
  590. { TYPE_INT, NULL, FALSE, 14}, // FogFunc (now obsolete and ignored)
  591. { TYPE_INT, NULL, FALSE, 15}, // PriGradient
  592. { TYPE_INT, NULL, FALSE, 16}, // SecGradient
  593. { TYPE_INT, NULL, FALSE, 17}, // SrcBlend
  594. { TYPE_INT, NULL, FALSE, 18}, // DetailColorFunc
  595. { TYPE_INT, NULL, FALSE, 19}, // DetailAlphaFunc
  596. { TYPE_BOOL, NULL, FALSE, 22}, // Stage0 Texture Enable
  597. { TYPE_BOOL, NULL, FALSE, 23}, // Stage0 Texture Publish
  598. { TYPE_BOOL, NULL, FALSE, 35}, // Stage0 Texture Resize (new to version 1) OBSOLETE!
  599. { TYPE_BOOL, NULL, FALSE, 36}, // Stage0 Texture No Mipmap (new to version 1) OBSOLETE!
  600. { TYPE_BOOL, NULL, FALSE, 37}, // Stage0 Texture Clamp U (new to version 1)
  601. { TYPE_BOOL, NULL, FALSE, 38}, // Stage0 Texture Clamp V (new to version 1)
  602. { TYPE_INT, NULL, FALSE, 39}, // Stage0 Texture Hint (new to version 1)
  603. { TYPE_BOOL, NULL, FALSE, 24}, // Stage0 Texture Display (in viewport...)
  604. { TYPE_FLOAT, NULL, FALSE, 25}, // Stage0 Frame Rate
  605. { TYPE_INT, NULL, FALSE, 26}, // Stage0 Frame Count
  606. { TYPE_INT, NULL, FALSE, 27}, // Stage0 Animation Type
  607. { TYPE_BOOL, NULL, FALSE, 28}, // Stage1 Texture Enable
  608. { TYPE_BOOL, NULL, FALSE, 29}, // Stage1 Texture Publish
  609. { TYPE_BOOL, NULL, FALSE, 40}, // Stage1 Texture Resize (new to version 1) OBSOLETE!
  610. { TYPE_BOOL, NULL, FALSE, 41}, // Stage1 Texture No Mipmap (new to version 1) OBSOLETE!
  611. { TYPE_BOOL, NULL, FALSE, 42}, // Stage1 Texture Clamp U (new to version 1)
  612. { TYPE_BOOL, NULL, FALSE, 43}, // Stage1 Texture Clamp V (new to version 1)
  613. { TYPE_INT, NULL, FALSE, 44}, // Stage1 Texture Hint (new to version 1)
  614. { TYPE_BOOL, NULL, FALSE, 30}, // Stage1 Texture Display (in viewport...)
  615. { TYPE_FLOAT, NULL, FALSE, 31}, // Stage1 Frame Rate
  616. { TYPE_INT, NULL, FALSE, 32}, // Stage1 Frame Count
  617. { TYPE_INT, NULL, FALSE, 33}, // Stage1 Animation Type
  618. { TYPE_BOOL, NULL, FALSE, 45}, // Stage0 Texture Alpha Bitmap (new to version 1)
  619. { TYPE_BOOL, NULL, FALSE, 46}, // Stage1 Texture Alpha Bitmap (new to version 1)
  620. { TYPE_BOOL, NULL, FALSE, 47}, // Alpha Test (new to version 1)
  621. { TYPE_INT, NULL, FALSE, 48}, // Shader preset (new to version 1) (now obsolete and ignored)
  622. { TYPE_INT, NULL, FALSE, 49}, // PS2 Shader Param A
  623. { TYPE_INT, NULL, FALSE, 50}, // PS2 Shader Param B
  624. { TYPE_INT, NULL, FALSE, 51}, // PS2 Shader Param C
  625. { TYPE_INT, NULL, FALSE, 52}, // PS2 Shader Param D
  626. { TYPE_INT, NULL, FALSE, 53}, // Stage0 UV Channel
  627. { TYPE_INT, NULL, FALSE, 54}, // Stage1 UV Channel
  628. { TYPE_INT, NULL, FALSE, 55 }, // Stage1 Mapping Type (new to version 4)
  629. { TYPE_BOOL, NULL, FALSE, 56 }, // Stage0 no texture reduction (new to version 5)
  630. { TYPE_BOOL, NULL, FALSE, 57 }, // Stage0 no texture reduction (new to version 5)
  631. };
  632. // Array of old pass parameter block versions (for backwards compatibility)
  633. const int NUM_OLDVERSIONS = 5;
  634. static ParamVersionDesc PassParameterBlockVersions[] = {
  635. ParamVersionDesc(PassParameterBlockDescVer0, 34, 0),
  636. ParamVersionDesc(PassParameterBlockDescVer1, 47, 1),
  637. ParamVersionDesc(PassParameterBlockDescVer2, 51, 2),
  638. ParamVersionDesc(PassParameterBlockDescVer3, 53, 3),
  639. ParamVersionDesc(PassParameterBlockDescVer4, 56, 4)
  640. };
  641. // Current pass parameter block version
  642. const int CURRENT_VERSION = 5;
  643. static ParamVersionDesc CurrentPassParameterBlockVersion(
  644. PassParameterBlockDescVer5,
  645. sizeof(PassParameterBlockDescVer5) / sizeof(ParamBlockDescID),
  646. CURRENT_VERSION);
  647. const int DISPLACEMENT_INDEX = (W3dMaterialClass::MAX_PASSES * W3dMaterialClass::MAX_STAGES);
  648. Color scale(const Color& a, const Color& b)
  649. {
  650. return Color(a.r * b.r, a.g * b.g, a.b * b.b);
  651. }
  652. /***********************************************************************************************
  653. * GameMtl::GameMtl -- constructor *
  654. * *
  655. * INPUT: *
  656. * *
  657. * OUTPUT: *
  658. * *
  659. * WARNINGS: *
  660. * *
  661. * HISTORY: *
  662. * 11/23/98 GTH : Created. *
  663. *=============================================================================================*/
  664. GameMtl::GameMtl(BOOL loading)
  665. {
  666. MaterialDialog = NULL;
  667. SurfaceType = SURFACE_TYPE_DEFAULT;
  668. SortLevel = SORT_LEVEL_NONE;
  669. Ivalid.SetEmpty();
  670. RollScroll = 0;
  671. Flags = 0;
  672. Flags |= GAMEMTL_PASSCOUNT_ROLLUP_OPEN;
  673. Set_Flag(GAMEMTL_CONVERTED_TO_NOLOD,true);
  674. DisplacementMap = NULL;
  675. DisplacementAmt = 0.0F;
  676. Maps = NULL;
  677. MainParameterBlock = NULL;
  678. for (int pass=0; pass<W3dMaterialClass::MAX_PASSES; pass++) {
  679. for (int stage=0; stage<W3dMaterialClass::MAX_STAGES; stage++) {
  680. Texture[pass][stage] = NULL;
  681. MapperArg[pass][stage] = NULL;
  682. MapperArgLen[pass][stage] = 0;
  683. }
  684. PassParameterBlock[pass] = NULL;
  685. CurPage[pass] = 0;
  686. }
  687. ShaderType = STE_PC_SHADER;
  688. SubstituteMaterial = NULL;
  689. if (!loading) {
  690. Reset();
  691. }
  692. }
  693. /***********************************************************************************************
  694. * GameMtl::~GameMtl -- destructor *
  695. * *
  696. * INPUT: *
  697. * *
  698. * OUTPUT: *
  699. * *
  700. * WARNINGS: *
  701. * *
  702. * HISTORY: *
  703. *=============================================================================================*/
  704. GameMtl::~GameMtl(void)
  705. {
  706. for (int pass=0; pass<W3dMaterialClass::MAX_PASSES; ++pass) {
  707. for (int stage=0; stage<W3dMaterialClass::MAX_STAGES; ++stage) {
  708. if (MapperArg[pass][stage]) {
  709. delete [] (MapperArg[pass][stage]);
  710. MapperArg[pass][stage] = NULL;
  711. }
  712. }
  713. }
  714. }
  715. /***********************************************************************************************
  716. * GameMtl::ClassID -- returns the max ClassID of the material plugin *
  717. * *
  718. * INPUT: *
  719. * *
  720. * OUTPUT: *
  721. * *
  722. * WARNINGS: *
  723. * *
  724. * HISTORY: *
  725. * 11/23/98 GTH : Created. *
  726. *=============================================================================================*/
  727. Class_ID GameMtl::ClassID()
  728. {
  729. if (ShaderType == STE_PC_SHADER) {
  730. return GameMaterialClassID;
  731. } else {
  732. return PS2GameMaterialClassID;
  733. }
  734. }
  735. /***********************************************************************************************
  736. * GameMtl::SuperClassID -- returns the super class ID *
  737. * *
  738. * INPUT: *
  739. * *
  740. * OUTPUT: *
  741. * *
  742. * WARNINGS: *
  743. * *
  744. * HISTORY: *
  745. * 11/23/98 GTH : Created. *
  746. *=============================================================================================*/
  747. SClass_ID GameMtl::SuperClassID()
  748. {
  749. return MATERIAL_CLASS_ID;
  750. }
  751. /***********************************************************************************************
  752. * GameMtl::GetClassName -- returns the name of this plugin clas *
  753. * *
  754. * INPUT: *
  755. * *
  756. * OUTPUT: *
  757. * *
  758. * WARNINGS: *
  759. * *
  760. * HISTORY: *
  761. * 11/23/98 GTH : Created. *
  762. *=============================================================================================*/
  763. void GameMtl::GetClassName(TSTR& s)
  764. {
  765. if (ShaderType == STE_PC_SHADER) {
  766. s = Get_String(IDS_GAMEMTL);
  767. }
  768. else {
  769. s = Get_String(IDS_PS2_GAMEMTL);
  770. }
  771. }
  772. /***********************************************************************************************
  773. * GameMtl::NumSubs -- returns the number of sub animations *
  774. * *
  775. * INPUT: *
  776. * *
  777. * OUTPUT: *
  778. * *
  779. * WARNINGS: *
  780. * *
  781. * HISTORY: *
  782. * 11/23/98 GTH : Created. *
  783. *=============================================================================================*/
  784. int GameMtl::NumSubs()
  785. {
  786. return 0;
  787. }
  788. /***********************************************************************************************
  789. * GameMtl::SubAnimName -- returns the name of the i'th sub animation *
  790. * *
  791. * INPUT: *
  792. * *
  793. * OUTPUT: *
  794. * *
  795. * WARNINGS: *
  796. * *
  797. * HISTORY: *
  798. * 11/23/98 GTH : Created. *
  799. *=============================================================================================*/
  800. TSTR GameMtl::SubAnimName(int i)
  801. {
  802. return _T("");
  803. }
  804. /***********************************************************************************************
  805. * GameMtl::SubAnim -- returns the i'th sub-anim *
  806. * *
  807. * INPUT: *
  808. * *
  809. * OUTPUT: *
  810. * *
  811. * WARNINGS: *
  812. * *
  813. * HISTORY: *
  814. * 11/23/98 GTH : Created. *
  815. *=============================================================================================*/
  816. Animatable* GameMtl::SubAnim(int i)
  817. {
  818. return NULL;
  819. }
  820. /***********************************************************************************************
  821. * GameMtl::Clone -- clones this material *
  822. * *
  823. * INPUT: *
  824. * *
  825. * OUTPUT: *
  826. * *
  827. * WARNINGS: *
  828. * *
  829. * HISTORY: *
  830. * 11/23/98 GTH : Created. *
  831. *=============================================================================================*/
  832. RefTargetHandle GameMtl::Clone(RemapDir &remap)
  833. {
  834. DebugPrint("GameMtl::Clone\n");
  835. GameMtl *mnew = new GameMtl(FALSE);
  836. *((MtlBase*)mnew) = *((MtlBase*)this); // copy superclass stuff
  837. // replace the main parameter block
  838. mnew->ReplaceReference(REF_MAIN,remap.CloneRef(MainParameterBlock));
  839. // Clone the displacment map's settings
  840. mnew->ReplaceReference (REF_TEXTURE + DISPLACEMENT_INDEX, DisplacementMap);
  841. mnew->DisplacementAmt = DisplacementAmt;
  842. // Maintain the shader type.
  843. mnew->Set_Shader_Type(ShaderType);
  844. // replace each pass's parameter block and the textures
  845. for (int pass=0; pass < W3dMaterialClass::MAX_PASSES; pass++) {
  846. IParamBlock * pblock = NULL;
  847. if (PassParameterBlock[pass]) {
  848. pblock = (IParamBlock *)remap.CloneRef(PassParameterBlock[pass]);
  849. }
  850. mnew->ReplaceReference(pass_ref_index(pass), pblock);
  851. mnew->PassParameterBlock[pass] = pblock;
  852. for (int stage=0; stage < W3dMaterialClass::MAX_STAGES; stage++) {
  853. if (Texture[pass][stage]) {
  854. mnew->ReplaceReference(texture_ref_index(pass,stage),Texture[pass][stage]->Clone());
  855. } else {
  856. mnew->ReplaceReference(texture_ref_index(pass,stage),NULL);
  857. }
  858. // Copy mapper arg strings and lengths
  859. if (MapperArgLen[pass][stage] > 0) {
  860. char *temp = new char[MapperArgLen[pass][stage] + 1];
  861. assert(strlen(MapperArg[pass][stage]) <= MapperArgLen[pass][stage]);
  862. strcpy(temp, MapperArg[pass][stage]);
  863. mnew->MapperArg[pass][stage] = temp;
  864. mnew->MapperArgLen[pass][stage] = MapperArgLen[pass][stage];
  865. }
  866. }
  867. }
  868. mnew->Ivalid = Ivalid;
  869. return mnew;
  870. }
  871. /***********************************************************************************************
  872. * GameMtl::NotifyRefChanged -- NotifyRefChanged handler *
  873. * *
  874. * INPUT: *
  875. * *
  876. * OUTPUT: *
  877. * *
  878. * WARNINGS: *
  879. * *
  880. * HISTORY: *
  881. * 11/23/98 GTH : Created. *
  882. *=============================================================================================*/
  883. RefResult GameMtl::NotifyRefChanged
  884. (
  885. Interval changeInt,
  886. RefTargetHandle hTarget,
  887. PartID & partID,
  888. RefMessage message
  889. )
  890. {
  891. switch (message) {
  892. case REFMSG_CHANGE:
  893. {
  894. Ivalid.SetEmpty(); // if any refs changed, clear the validity
  895. if (MaterialDialog && (MaterialDialog->TheMtl == this)) {
  896. MaterialDialog->Invalidate(); // if the dialog is up, refresh it
  897. }
  898. break;
  899. }
  900. case REFMSG_GET_PARAM_DIM:
  901. {
  902. GetParamDim *gpd = (GetParamDim*)partID;
  903. gpd->dim = defaultDim;
  904. return REF_STOP;
  905. }
  906. case REFMSG_GET_PARAM_NAME:
  907. {
  908. GetParamName *gpn = (GetParamName*)partID;
  909. bool pass_parameter = false;
  910. for(int pass = 0; pass < Get_Pass_Count(); pass++) {
  911. if(hTarget == (RefTargetHandle)PassParameterBlock[pass]) pass_parameter = true;
  912. }
  913. if (pass_parameter) {
  914. switch (gpn->index)
  915. {
  916. case PB_AMBIENT: gpn->name = _T("Ambient"); break;
  917. case PB_DIFFUSE: gpn->name = _T("Diffuse"); break;
  918. case PB_SPECULAR: gpn->name = _T("Specular"); break;
  919. case PB_EMISSIVE: gpn->name = _T("Emissive"); break;
  920. case PB_SHININESS: gpn->name = _T("Shininess"); break;
  921. case PB_OPACITY: gpn->name = _T("Opacity"); break;
  922. case PB_TRANSLUCENCY: gpn->name = _T("Translucency"); break;
  923. default: gpn->name = _T(""); break;
  924. }
  925. }
  926. return REF_STOP;
  927. }
  928. }
  929. return(REF_SUCCEED);
  930. }
  931. /***********************************************************************************************
  932. * GameMtl::SetReference -- set the i'th reference *
  933. * *
  934. * INPUT: *
  935. * *
  936. * OUTPUT: *
  937. * *
  938. * WARNINGS: *
  939. * *
  940. * HISTORY: *
  941. * 11/23/98 GTH : Created. *
  942. *=============================================================================================*/
  943. void GameMtl::SetReference(int i, RefTargetHandle rtarg)
  944. {
  945. assert(i < REF_COUNT);
  946. if (i == REF_MAPS) {
  947. Maps = (GameMapsClass *)rtarg;
  948. return;
  949. }
  950. if (i == REF_MAIN) {
  951. MainParameterBlock = (IParamBlock*)rtarg;
  952. return;
  953. }
  954. if ((i >= REF_PASS_PARAMETERS) && (i < REF_PASS_PARAMETERS + W3dMaterialClass::MAX_PASSES)) {
  955. PassParameterBlock[i - REF_PASS_PARAMETERS] = (IParamBlock*)rtarg;
  956. return;
  957. }
  958. if ((i >= REF_TEXTURE) && (i < REF_TEXTURE + 9)) {
  959. if (i == REF_TEXTURE + DISPLACEMENT_INDEX) {
  960. DisplacementMap = (Texmap *)rtarg;
  961. } else {
  962. int offset = i - REF_TEXTURE;
  963. int pass = offset / 2;
  964. int stage = offset % 2;
  965. Texture[pass][stage] = (Texmap *)rtarg;
  966. }
  967. return;
  968. }
  969. }
  970. /***********************************************************************************************
  971. * GameMtl::GetReference -- returnst the i'th reference *
  972. * *
  973. * INPUT: *
  974. * *
  975. * OUTPUT: *
  976. * *
  977. * WARNINGS: *
  978. * *
  979. * HISTORY: *
  980. * 11/23/98 GTH : Created. *
  981. *=============================================================================================*/
  982. RefTargetHandle GameMtl::GetReference(int i)
  983. {
  984. if (i == REF_MAPS) {
  985. return Maps;
  986. }
  987. if (i == REF_MAIN) {
  988. return MainParameterBlock;
  989. }
  990. if ((i >= REF_PASS_PARAMETERS) && (i < REF_PASS_PARAMETERS + W3dMaterialClass::MAX_PASSES)) {
  991. return PassParameterBlock[i - REF_PASS_PARAMETERS];
  992. }
  993. if ((i >= REF_TEXTURE) && (i < REF_TEXTURE + 9)) {
  994. if (i == REF_TEXTURE + DISPLACEMENT_INDEX) {
  995. return DisplacementMap;
  996. } else {
  997. int offset = i - REF_TEXTURE;
  998. int pass = offset / 2;
  999. int stage = offset % 2;
  1000. return Texture[pass][stage];
  1001. }
  1002. }
  1003. return NULL;
  1004. }
  1005. /***********************************************************************************************
  1006. * GameMtl::NumSubTexmaps -- returns the number of texture maps in this material *
  1007. * *
  1008. * INPUT: *
  1009. * *
  1010. * OUTPUT: *
  1011. * *
  1012. * WARNINGS: *
  1013. * *
  1014. * HISTORY: *
  1015. * 11/23/98 GTH : Created. *
  1016. *=============================================================================================*/
  1017. int GameMtl::NumSubTexmaps(void)
  1018. {
  1019. return (W3dMaterialClass::MAX_PASSES * W3dMaterialClass::MAX_STAGES) + 1;
  1020. }
  1021. /***********************************************************************************************
  1022. * GameMtl::Get_Displacement_Map_Index -- returns the Sub-texmap index for the displacement map.
  1023. * *
  1024. * INPUT: *
  1025. * *
  1026. * OUTPUT: *
  1027. * *
  1028. * WARNINGS: *
  1029. * *
  1030. * HISTORY: *
  1031. * 7/01/99 PDS : Created. *
  1032. *=============================================================================================*/
  1033. int GameMtl::Get_Displacement_Map_Index(void) const
  1034. {
  1035. return DISPLACEMENT_INDEX;
  1036. }
  1037. /***********************************************************************************************
  1038. * GameMtl::SetSubTexmap -- set the i'th texture map *
  1039. * *
  1040. * INPUT: *
  1041. * *
  1042. * OUTPUT: *
  1043. * *
  1044. * WARNINGS: *
  1045. * *
  1046. * HISTORY: *
  1047. * 11/23/98 GTH : Created. *
  1048. *=============================================================================================*/
  1049. void GameMtl::SetSubTexmap(int i, Texmap * m)
  1050. {
  1051. ReplaceReference(REF_TEXTURE + i, m);
  1052. int pass,stage;
  1053. texmap_index_to_pass_stage(i,&pass,&stage);
  1054. if (Texture[pass][stage] != NULL) {
  1055. UVGen * uvgen = Texture[pass][stage]->GetTheUVGen();
  1056. if (uvgen != NULL) {
  1057. uvgen->SetMapChannel(Get_Map_Channel(pass,stage));
  1058. }
  1059. }
  1060. NotifyDependents(FOREVER, PART_ALL, REFMSG_CHANGE);
  1061. }
  1062. /***********************************************************************************************
  1063. * GameMtl::GetSubTexmap -- returns the i'th texture map *
  1064. * *
  1065. * INPUT: *
  1066. * *
  1067. * OUTPUT: *
  1068. * *
  1069. * WARNINGS: *
  1070. * *
  1071. * HISTORY: *
  1072. * 11/23/98 GTH : Created. *
  1073. *=============================================================================================*/
  1074. Texmap * GameMtl::GetSubTexmap(int i)
  1075. {
  1076. if (i == DISPLACEMENT_INDEX) {
  1077. return DisplacementMap;
  1078. }
  1079. int pass;
  1080. int stage;
  1081. texmap_index_to_pass_stage(i,&pass,&stage);
  1082. return Texture[pass][stage];
  1083. }
  1084. /***********************************************************************************************
  1085. * GameMtl::CreateParamDlg -- creates the material editor dialog box *
  1086. * *
  1087. * INPUT: *
  1088. * *
  1089. * OUTPUT: *
  1090. * *
  1091. * WARNINGS: *
  1092. * *
  1093. * HISTORY: *
  1094. * 11/23/98 GTH : Created. *
  1095. *=============================================================================================*/
  1096. ParamDlg * GameMtl::CreateParamDlg(HWND hwnd_mtl_edit, IMtlParams *imp)
  1097. {
  1098. #if defined W3D_GMAXDEV
  1099. GMaxMtlDlg *dlg = new GMaxMtlDlg(hwnd_mtl_edit, imp, this);
  1100. #else
  1101. GameMtlDlg *dlg = new GameMtlDlg(hwnd_mtl_edit, imp, this);
  1102. #endif
  1103. SetParamDlg(dlg);
  1104. return dlg;
  1105. }
  1106. /***********************************************************************************************
  1107. * GameMtl::Notify_Changed -- someone has changed this material *
  1108. * *
  1109. * INPUT: *
  1110. * *
  1111. * OUTPUT: *
  1112. * *
  1113. * WARNINGS: *
  1114. * *
  1115. * HISTORY: *
  1116. * 11/23/98 GTH : Created. *
  1117. *=============================================================================================*/
  1118. void GameMtl::Notify_Changed(void)
  1119. {
  1120. NotifyDependents(FOREVER, PART_ALL, REFMSG_CHANGE);
  1121. if (MaterialDialog != NULL) {
  1122. MaterialDialog->Update_Display();
  1123. }
  1124. }
  1125. /***********************************************************************************************
  1126. * GameMtl::Reset -- reset this material to default settings *
  1127. * *
  1128. * INPUT: *
  1129. * *
  1130. * OUTPUT: *
  1131. * *
  1132. * WARNINGS: *
  1133. * *
  1134. * HISTORY: *
  1135. * 11/23/98 GTH : Created. *
  1136. *=============================================================================================*/
  1137. void GameMtl::Reset()
  1138. {
  1139. DebugPrint("GameMtl::Reset()\n");
  1140. ReplaceReference(REF_MAIN,CreateParameterBlock(MainParameterBlockDesc,1,CURRENT_VERSION));
  1141. for (int pass = 0; pass < W3dMaterialClass::MAX_PASSES; pass++) {
  1142. // Install a parameter block for each pass
  1143. IParamBlock * pblock = CreateParameterBlock( PassParameterBlockDescVer5,
  1144. sizeof(PassParameterBlockDescVer5)/sizeof(ParamBlockDescID),
  1145. CURRENT_VERSION);
  1146. ReplaceReference(pass_ref_index(pass), pblock);
  1147. for (int stage = 0;stage < W3dMaterialClass::MAX_STAGES; stage++) {
  1148. ReplaceReference(texture_ref_index(pass,stage), NULL);
  1149. Set_Texture_Enable(pass,stage,false);
  1150. Set_Texture_Publish(pass,stage,false);
  1151. Set_Texture_Resize(pass,stage,false);
  1152. Set_Texture_No_Mipmap(pass,stage,false);
  1153. Set_Texture_Clamp_U(pass,stage,false);
  1154. Set_Texture_Clamp_V(pass,stage,false);
  1155. Set_Texture_No_LOD(pass,stage,false);
  1156. Set_Texture_Alpha_Bitmap(pass,stage,false);
  1157. Set_Texture_Hint(pass,stage,W3DTEXTURE_HINT_BASE);
  1158. Set_Texture_Display(pass,stage,false);
  1159. Set_Texture_Frame_Rate(pass,stage,15.0f);
  1160. Set_Texture_Frame_Count(pass,stage,1);
  1161. Set_Texture_Anim_Type(pass,stage,W3DTEXTURE_ANIM_LOOP);
  1162. Set_Map_Channel(pass,stage,1);
  1163. if (MapperArg[pass][stage]) {
  1164. delete [] (MapperArg[pass][stage]);
  1165. MapperArg[pass][stage] = NULL;
  1166. MapperArgLen[pass][stage] = 0;
  1167. }
  1168. }
  1169. Set_Sort_Level(SORT_LEVEL_NONE);
  1170. Set_Ambient(pass,0,(pass == 0 ? Color(1.0,1.0,1.0) : Color(0,0,0)));
  1171. Set_Diffuse(pass,0,(pass == 0 ? Color(1.0,1.0,1.0) : Color(0,0,0)));
  1172. Set_Specular(pass,0,Color(0,0,0));
  1173. Set_Emissive(pass,0,Color(0,0,0));
  1174. Set_Shininess(pass,0,0.0f);
  1175. Set_Opacity(pass,0,1.0f);
  1176. Set_Translucency(pass,0,0.0f);
  1177. Set_Copy_Specular_To_Diffuse(pass,false);
  1178. Set_Mapping_Type(pass,0,W3DMAPPING_UV);
  1179. Set_Mapping_Type(pass,1,W3DMAPPING_UV);
  1180. Set_PSX_Translucency(pass,GAMEMTL_PSX_TRANS_NONE);
  1181. Set_PSX_Lighting(pass,true);
  1182. Set_Depth_Compare(pass,W3DSHADER_DEPTHCOMPARE_DEFAULT);
  1183. Set_Depth_Mask(pass,W3DSHADER_DEPTHMASK_DEFAULT);
  1184. Set_Alpha_Test(pass,W3DSHADER_ALPHATEST_DEFAULT);
  1185. Set_Dest_Blend(pass,W3DSHADER_DESTBLENDFUNC_DEFAULT);
  1186. Set_Pri_Gradient(pass,W3DSHADER_PRIGRADIENT_DEFAULT);
  1187. Set_Sec_Gradient(pass,W3DSHADER_SECGRADIENT_DEFAULT);
  1188. Set_Src_Blend(pass,W3DSHADER_SRCBLENDFUNC_DEFAULT);
  1189. Set_Detail_Color_Func(pass,W3DSHADER_DETAILCOLORFUNC_DEFAULT);
  1190. Set_Detail_Alpha_Func(pass,W3DSHADER_DETAILCOLORFUNC_DEFAULT);
  1191. // Playstation 2 default for opaque.
  1192. Set_PS2_Shader_Param_A(pass, PSS_SRC);
  1193. Set_PS2_Shader_Param_B(pass, PSS_ZERO);
  1194. Set_PS2_Shader_Param_C(pass, PSS_ONE);
  1195. Set_PS2_Shader_Param_D(pass, PSS_ZERO);
  1196. }
  1197. Ivalid.SetEmpty();
  1198. Set_Pass_Count(1); // set default value for the main param block
  1199. }
  1200. /***********************************************************************************************
  1201. * GameMtl::Update -- time has changed *
  1202. * *
  1203. * INPUT: *
  1204. * *
  1205. * OUTPUT: *
  1206. * *
  1207. * WARNINGS: *
  1208. * *
  1209. * HISTORY: *
  1210. * 11/23/98 GTH : Created. *
  1211. *=============================================================================================*/
  1212. void GameMtl::Update(TimeValue t, Interval &ivalid)
  1213. {
  1214. // This function is called by the system prior to rendering
  1215. // Its purpose is to let you pre-calculate anything you can to
  1216. // speed up the subsequent 'Shade' calls.
  1217. Ivalid = FOREVER;
  1218. ivalid &= Ivalid;
  1219. }
  1220. /***********************************************************************************************
  1221. * GameMtl::Validity -- return the validity of the material at time t *
  1222. * *
  1223. * INPUT: *
  1224. * *
  1225. * OUTPUT: *
  1226. * *
  1227. * WARNINGS: *
  1228. * *
  1229. * HISTORY: *
  1230. * 11/23/98 GTH : Created. *
  1231. *=============================================================================================*/
  1232. Interval GameMtl::Validity(TimeValue t)
  1233. {
  1234. return FOREVER;
  1235. }
  1236. /***********************************************************************************************
  1237. * GameMtl::Requirements -- what requirements does this material have? *
  1238. * *
  1239. * INPUT: *
  1240. * *
  1241. * OUTPUT: *
  1242. * *
  1243. * WARNINGS: *
  1244. * *
  1245. * HISTORY: *
  1246. * 11/23/98 GTH : Created. *
  1247. *=============================================================================================*/
  1248. ULONG GameMtl::Requirements(int subMtlNum)
  1249. {
  1250. ULONG req = 0;
  1251. for (int pass = 0; pass < W3dMaterialClass::MAX_PASSES; pass++) {
  1252. for (int stage = 0; stage < W3dMaterialClass::MAX_STAGES; stage++) {
  1253. if (Texture[pass][stage]) {
  1254. req |= Texture[pass][stage]->Requirements(subMtlNum);
  1255. }
  1256. }
  1257. }
  1258. req |= MTLREQ_BGCOL;
  1259. req |= MTLREQ_NOATMOS;
  1260. #ifdef WANT_DISPLACEMENT_MAPS
  1261. req |= MTLREQ_DISPLACEMAP;
  1262. #endif //WANT_DISPLACEMENT_MAPS
  1263. return req;
  1264. }
  1265. /***********************************************************************************************
  1266. * GameMtl::Load -- loading from a MAX file *
  1267. * *
  1268. * INPUT: *
  1269. * *
  1270. * OUTPUT: *
  1271. * *
  1272. * WARNINGS: *
  1273. * *
  1274. * HISTORY: *
  1275. * 11/23/98 GTH : Created. *
  1276. *=============================================================================================*/
  1277. IOResult GameMtl::Load(ILoad *iload)
  1278. {
  1279. ULONG nb;
  1280. int id;
  1281. int passindex = 0;
  1282. int len = 0;
  1283. unsigned char tmp8;
  1284. unsigned short tmp16;
  1285. char * tmpstring = NULL;
  1286. float tmpfloat;
  1287. IOResult res;
  1288. GameMtlPostLoad * lc = new GameMtlPostLoad(this);
  1289. iload->RegisterPostLoadCallback(lc);
  1290. // Register automatic translation callbacks for the pass parameter blocks
  1291. for (int i = 0; i < W3dMaterialClass::MAX_PASSES; i++) {
  1292. iload->RegisterPostLoadCallback(
  1293. new ParamBlockPLCB(PassParameterBlockVersions, NUM_OLDVERSIONS,
  1294. &CurrentPassParameterBlockVersion, this, REF_PASS_PARAMETERS + i)
  1295. );
  1296. }
  1297. while (IO_OK==(res=iload->OpenChunk())) {
  1298. switch (id = iload->CurChunkID()) {
  1299. case MTL_HDR_CHUNK:
  1300. res = MtlBase::Load(iload);
  1301. Ivalid.SetEmpty();
  1302. break;
  1303. case GAMEMTL_FLAGS_CHUNK:
  1304. res = iload->Read(&Flags,sizeof(Flags), &nb);
  1305. break;
  1306. case GAMEMTL_SURFACE_TYPE_CHUNK:
  1307. res = iload->Read(&SurfaceType,sizeof(SurfaceType),&nb);
  1308. break;
  1309. case GAMEMTL_SORT_LEVEL_CHUNK:
  1310. res = iload->Read(&SortLevel,sizeof(SortLevel),&nb);
  1311. break;
  1312. case GAMEMTL_PASS0_CUR_PAGE:
  1313. case GAMEMTL_PASS1_CUR_PAGE:
  1314. case GAMEMTL_PASS2_CUR_PAGE:
  1315. case GAMEMTL_PASS3_CUR_PAGE:
  1316. res = iload->Read(&tmp8,sizeof(tmp8),&nb);
  1317. CurPage[id - GAMEMTL_PASS0_CUR_PAGE] = tmp8;
  1318. break;
  1319. case GAMEMTL_PASS0_STAGE0_MAPPER_ARGS:
  1320. case GAMEMTL_PASS1_STAGE0_MAPPER_ARGS:
  1321. case GAMEMTL_PASS2_STAGE0_MAPPER_ARGS:
  1322. case GAMEMTL_PASS3_STAGE0_MAPPER_ARGS:
  1323. len = iload->CurChunkLength();
  1324. passindex = id - GAMEMTL_PASS0_STAGE0_MAPPER_ARGS;
  1325. tmpstring = Get_Mapping_Arg_Buffer(passindex, 0, len);
  1326. res = iload->Read(tmpstring, len, &nb);
  1327. break;
  1328. case GAMEMTL_PASS0_STAGE1_MAPPER_ARGS:
  1329. case GAMEMTL_PASS1_STAGE1_MAPPER_ARGS:
  1330. case GAMEMTL_PASS2_STAGE1_MAPPER_ARGS:
  1331. case GAMEMTL_PASS3_STAGE1_MAPPER_ARGS:
  1332. len = iload->CurChunkLength();
  1333. passindex = id - GAMEMTL_PASS0_STAGE1_MAPPER_ARGS;
  1334. tmpstring = Get_Mapping_Arg_Buffer(passindex, 1, len);
  1335. res = iload->Read(tmpstring, len, &nb);
  1336. break;
  1337. /*
  1338. ** All chunks below here are for the obsolete material plugin...
  1339. */
  1340. case GAMEMTL_GAMEFLAGS_CHUNK:
  1341. break;
  1342. case GAMEMTL_ATTRIBUTES_CHUNK:
  1343. res = iload->Read(&lc->Attributes,sizeof(lc->Attributes),&nb);
  1344. lc->IsOld = true;
  1345. break;
  1346. case GAMEMTL_COLORS_CHUNK:
  1347. res = iload->Read(&lc->Diffuse,sizeof(lc->Diffuse),&nb);
  1348. lc->IsOld = true;
  1349. break;
  1350. case GAMEMTL_DCT_FRAMES_CHUNK:
  1351. res = iload->Read(&tmp16,sizeof(unsigned short),&nb);
  1352. lc->DCTFrames = tmp16;
  1353. lc->IsOld = true;
  1354. break;
  1355. case GAMEMTL_DCT_FRAME_RATE_CHUNK:
  1356. res = iload->Read(&tmpfloat,sizeof(float),&nb);
  1357. lc->DCTFrameRate = tmpfloat;
  1358. lc->IsOld = true;
  1359. break;
  1360. case GAMEMTL_DIT_FRAMES_CHUNK:
  1361. res = iload->Read(&tmp16,sizeof(unsigned short),&nb);
  1362. lc->DITFrames = tmp16;
  1363. lc->IsOld = true;
  1364. break;
  1365. case GAMEMTL_DIT_FRAME_RATE_CHUNK:
  1366. res = iload->Read(&tmpfloat,sizeof(float),&nb);
  1367. lc->DITFrameRate = tmpfloat;
  1368. lc->IsOld = true;
  1369. break;
  1370. case GAMEMTL_SCT_FRAMES_CHUNK:
  1371. res = iload->Read(&tmp16,sizeof(unsigned short),&nb);
  1372. lc->SCTFrames = tmp16;
  1373. lc->IsOld = true;
  1374. break;
  1375. case GAMEMTL_SCT_FRAME_RATE_CHUNK:
  1376. res = iload->Read(&tmpfloat,sizeof(float),&nb);
  1377. lc->SCTFrameRate = tmpfloat;
  1378. lc->IsOld = true;
  1379. break;
  1380. case GAMEMTL_SIT_FRAMES_CHUNK:
  1381. res = iload->Read(&tmp16,sizeof(unsigned short),&nb);
  1382. lc->SITFrames = tmp16;
  1383. lc->IsOld = true;
  1384. break;
  1385. case GAMEMTL_SIT_FRAME_RATE_CHUNK:
  1386. res = iload->Read(&tmpfloat,sizeof(float),&nb);
  1387. lc->SITFrameRate = tmpfloat;
  1388. lc->IsOld = true;
  1389. break;
  1390. case GAMEMTL_DCT_MAPPING_CHUNK:
  1391. res = iload->Read(&tmp8,sizeof(unsigned char),&nb);
  1392. lc->DCTMappingType = tmp8;
  1393. lc->IsOld = true;
  1394. break;
  1395. case GAMEMTL_DIT_MAPPING_CHUNK:
  1396. res = iload->Read(&tmp8,sizeof(unsigned char),&nb);
  1397. lc->DITMappingType = tmp8;
  1398. lc->IsOld = true;
  1399. break;
  1400. case GAMEMTL_SCT_MAPPING_CHUNK:
  1401. res = iload->Read(&tmp8,sizeof(unsigned char),&nb);
  1402. lc->SCTMappingType = tmp8;
  1403. lc->IsOld = true;
  1404. break;
  1405. case GAMEMTL_SIT_MAPPING_CHUNK:
  1406. res = iload->Read(&tmp8,sizeof(unsigned char),&nb);
  1407. lc->SITMappingType = tmp8;
  1408. lc->IsOld = true;
  1409. break;
  1410. case GAMEMTL_DIFFUSE_COLOR_CHUNK:
  1411. res = iload->Read(&lc->Diffuse,sizeof(lc->Diffuse),&nb);
  1412. lc->IsOld = true;
  1413. break;
  1414. case GAMEMTL_SPECULAR_COLOR_CHUNK:
  1415. res = iload->Read(&lc->Specular,sizeof(lc->Specular),&nb);
  1416. lc->IsOld = true;
  1417. break;
  1418. case GAMEMTL_AMBIENT_COEFF_CHUNK:
  1419. res = iload->Read(&lc->AmbientCoeff,sizeof(lc->AmbientCoeff),&nb);
  1420. lc->IsOld = true;
  1421. break;
  1422. case GAMEMTL_DIFFUSE_COEFF_CHUNK:
  1423. res = iload->Read(&lc->DiffuseCoeff,sizeof(lc->DiffuseCoeff),&nb);
  1424. lc->IsOld = true;
  1425. break;
  1426. case GAMEMTL_SPECULAR_COEFF_CHUNK:
  1427. res = iload->Read(&lc->SpecularCoeff,sizeof(lc->SpecularCoeff),&nb);
  1428. lc->IsOld = true;
  1429. break;
  1430. case GAMEMTL_EMISSIVE_COEFF_CHUNK:
  1431. res = iload->Read(&lc->EmissiveCoeff,sizeof(lc->EmissiveCoeff),&nb);
  1432. lc->IsOld = true;
  1433. break;
  1434. case GAMEMTL_OPACITY_CHUNK:
  1435. res = iload->Read(&lc->Opacity,sizeof(lc->Opacity),&nb);
  1436. lc->IsOld = true;
  1437. break;
  1438. case GAMEMTL_TRANSLUCENCY_CHUNK:
  1439. res = iload->Read(&lc->Translucency,sizeof(lc->Translucency),&nb);
  1440. lc->IsOld = true;
  1441. break;
  1442. case GAMEMTL_SHININESS_CHUNK:
  1443. res = iload->Read(&lc->Shininess,sizeof(lc->Shininess),&nb);
  1444. lc->IsOld = true;
  1445. break;
  1446. case GAMEMTL_FOG_CHUNK:
  1447. res = iload->Read(&lc->FogCoeff,sizeof(lc->FogCoeff),&nb);
  1448. lc->IsOld = true;
  1449. break;
  1450. default:
  1451. break;
  1452. }
  1453. iload->CloseChunk();
  1454. if (res!=IO_OK) {
  1455. return res;
  1456. }
  1457. }
  1458. return IO_OK;
  1459. }
  1460. /***********************************************************************************************
  1461. * GameMtl::Save -- Saving into a MAX file *
  1462. * *
  1463. * INPUT: *
  1464. * *
  1465. * OUTPUT: *
  1466. * *
  1467. * WARNINGS: *
  1468. * *
  1469. * HISTORY: *
  1470. * 11/23/98 GTH : Created. *
  1471. *=============================================================================================*/
  1472. IOResult GameMtl::Save(ISave *isave)
  1473. {
  1474. IOResult res;
  1475. ULONG nb;
  1476. /*
  1477. ** Save the base class stuff
  1478. */
  1479. isave->BeginChunk(MTL_HDR_CHUNK);
  1480. res = MtlBase::Save(isave);
  1481. if (res!=IO_OK)
  1482. return res;
  1483. isave->EndChunk();
  1484. /*
  1485. ** Save the flags
  1486. */
  1487. isave->BeginChunk(GAMEMTL_FLAGS_CHUNK);
  1488. isave->Write(&Flags,sizeof(Flags),&nb);
  1489. isave->EndChunk();
  1490. /*
  1491. ** Save the "cur-pages"
  1492. */
  1493. uint8 tmp8;
  1494. int pass;
  1495. for (pass=0; pass < W3dMaterialClass::MAX_PASSES; pass++) {
  1496. isave->BeginChunk(GAMEMTL_PASS0_CUR_PAGE + pass);
  1497. tmp8 = CurPage[pass];
  1498. isave->Write(&tmp8,sizeof(tmp8),&nb);
  1499. isave->EndChunk();
  1500. }
  1501. /*
  1502. ** Save any Mapper Args
  1503. */
  1504. for (pass=0; pass < W3dMaterialClass::MAX_PASSES; pass++) {
  1505. char *buffer = Get_Mapping_Arg_Buffer(pass, 0);
  1506. if (buffer) {
  1507. isave->BeginChunk(GAMEMTL_PASS0_STAGE0_MAPPER_ARGS + pass);
  1508. isave->Write(buffer, strlen(buffer) + 1, &nb);
  1509. isave->EndChunk();
  1510. }
  1511. buffer = Get_Mapping_Arg_Buffer(pass, 1);
  1512. if (buffer) {
  1513. isave->BeginChunk(GAMEMTL_PASS0_STAGE1_MAPPER_ARGS + pass);
  1514. isave->Write(buffer, strlen(buffer) + 1, &nb);
  1515. isave->EndChunk();
  1516. }
  1517. }
  1518. /*
  1519. ** Save the surface type
  1520. */
  1521. isave->BeginChunk(GAMEMTL_SURFACE_TYPE_CHUNK);
  1522. isave->Write(&SurfaceType,sizeof(SurfaceType),&nb);
  1523. isave->EndChunk();
  1524. /*
  1525. ** Save the sort level
  1526. */
  1527. isave->BeginChunk(GAMEMTL_SORT_LEVEL_CHUNK);
  1528. isave->Write(&SortLevel,sizeof(SortLevel),&nb);
  1529. isave->EndChunk();
  1530. return IO_OK;
  1531. }
  1532. /***********************************************************************************************
  1533. * GameMtl::Shade -- evaluate the material for the renderer. *
  1534. * *
  1535. * INPUT: *
  1536. * *
  1537. * OUTPUT: *
  1538. * *
  1539. * WARNINGS: *
  1540. * This function could use a little work. It doesn't always produce correct results. *
  1541. * *
  1542. * HISTORY: *
  1543. * 11/23/98 GTH : Created. *
  1544. *=============================================================================================*/
  1545. void GameMtl::Shade(ShadeContext& sc)
  1546. {
  1547. if (ShaderType == STE_PS2_SHADER) {
  1548. ps2_shade(sc);
  1549. return;
  1550. }
  1551. if (gbufID) sc.SetGBufferID(gbufID);
  1552. /*
  1553. ** Shadowing, return black
  1554. */
  1555. if (sc.mode==SCMODE_SHADOW) {
  1556. sc.out.t = Color(0,0,0);
  1557. return;
  1558. }
  1559. /*
  1560. ** Render each pass, initialize dest with the current background
  1561. */
  1562. Color back_c;
  1563. Color back_t;
  1564. Color dest;
  1565. Color src;
  1566. float alpha;
  1567. sc.GetBGColor(back_c,back_t, FALSE);
  1568. dest = back_c;
  1569. for (int pass=0; pass < Get_Pass_Count(); pass++) {
  1570. /*
  1571. ** Computing the Primary and Secondary Gradients
  1572. */
  1573. Color ambient = sc.ambientLight;
  1574. Color diffuse(0,0,0);
  1575. Color specular(0,0,0);
  1576. for(int light_index = 0; light_index < sc.nLights; light_index++) {
  1577. Color light_color;
  1578. Point3 light_dir;
  1579. float dot_nl;
  1580. float diffuse_coef;
  1581. LightDesc * light = sc.Light(light_index);
  1582. if(light->Illuminate(sc, sc.Normal(), light_color, light_dir, dot_nl, diffuse_coef)) {
  1583. //ambient += light_color;
  1584. if (dot_nl > 0.0f) diffuse += dot_nl * light_color;
  1585. float c = DotProd(light_dir, sc.ReflectVector());
  1586. if(c > 0.f) {
  1587. specular += (float)pow(c, Get_Shininess(pass, sc.CurTime())) * light_color;
  1588. }
  1589. }
  1590. }
  1591. ambient = ambient * Get_Ambient(pass,sc.CurTime());
  1592. diffuse = diffuse * Get_Diffuse(pass,sc.CurTime());
  1593. specular = specular * Get_Specular(pass,sc.CurTime());
  1594. Color pri_gradient = ambient + diffuse + Get_Emissive(pass,sc.CurTime());
  1595. if (pri_gradient.r > 1.0f) pri_gradient.r = 1.0f;
  1596. if (pri_gradient.g > 1.0f) pri_gradient.g = 1.0f;
  1597. if (pri_gradient.b > 1.0f) pri_gradient.b = 1.0f;
  1598. Color sec_gradient = specular * Get_Specular(pass,sc.CurTime());
  1599. /*
  1600. ** Sampling the Texture(s)
  1601. */
  1602. AColor texel(1,1,1,1);
  1603. if (Get_Texture_Enable(pass,0) && Texture[pass][0]) {
  1604. // if (Get_Mapping_Type(pass) == GAMEMTL_MAPPING_UV) {
  1605. texel = Texture[pass][0]->EvalColor(sc);
  1606. // }
  1607. }
  1608. if (Get_Texture_Enable(pass,1) && Texture[pass][1]) {
  1609. AColor detail_texel = Texture[pass][1]->EvalColor(sc);
  1610. switch (Get_Detail_Color_Func(pass))
  1611. {
  1612. case W3DSHADER_DETAILCOLORFUNC_DISABLE:
  1613. break;
  1614. case W3DSHADER_DETAILCOLORFUNC_DETAIL:
  1615. texel = detail_texel;
  1616. break;
  1617. case W3DSHADER_DETAILCOLORFUNC_SCALE:
  1618. texel.r = detail_texel.r * texel.r;
  1619. texel.g = detail_texel.g * texel.g;
  1620. texel.b = detail_texel.b * texel.b;
  1621. break;
  1622. case W3DSHADER_DETAILCOLORFUNC_INVSCALE:
  1623. texel.r = texel.r + (1.0f - texel.r) * detail_texel.r;
  1624. texel.g = texel.g + (1.0f - texel.g) * detail_texel.g;
  1625. texel.b = texel.b + (1.0f - texel.b) * detail_texel.b;
  1626. break;
  1627. case W3DSHADER_DETAILCOLORFUNC_ADD:
  1628. texel.r = detail_texel.r + texel.r;
  1629. texel.g = detail_texel.g + texel.g;
  1630. texel.b = detail_texel.b + texel.b;
  1631. break;
  1632. case W3DSHADER_DETAILCOLORFUNC_SUB:
  1633. texel.r = texel.r - detail_texel.r;
  1634. texel.g = texel.g - detail_texel.g;
  1635. texel.b = texel.b - detail_texel.b;
  1636. break;
  1637. case W3DSHADER_DETAILCOLORFUNC_SUBR:
  1638. texel.r = detail_texel.r - texel.r;
  1639. texel.g = detail_texel.g - texel.g;
  1640. texel.b = detail_texel.b - texel.b;
  1641. break;
  1642. case W3DSHADER_DETAILCOLORFUNC_BLEND:
  1643. texel.r = (texel.a * texel.r) + ((1.0f - texel.a)*detail_texel.r);
  1644. texel.g = (texel.a * texel.g) + ((1.0f - texel.a)*detail_texel.g);
  1645. texel.b = (texel.a * texel.b) + ((1.0f - texel.a)*detail_texel.b);
  1646. break;
  1647. case W3DSHADER_DETAILCOLORFUNC_DETAILBLEND:
  1648. texel.r = (detail_texel.a * texel.r) + ((1.0f - detail_texel.a)*detail_texel.r);
  1649. texel.g = (detail_texel.a * texel.g) + ((1.0f - detail_texel.a)*detail_texel.g);
  1650. texel.b = (detail_texel.a * texel.b) + ((1.0f - detail_texel.a)*detail_texel.b);
  1651. break;
  1652. }
  1653. switch (Get_Detail_Alpha_Func(pass))
  1654. {
  1655. case W3DSHADER_DETAILALPHAFUNC_DISABLE:
  1656. break;
  1657. case W3DSHADER_DETAILALPHAFUNC_DETAIL:
  1658. texel.a = detail_texel.a;
  1659. break;
  1660. case W3DSHADER_DETAILALPHAFUNC_SCALE:
  1661. texel.a = texel.a * detail_texel.a;
  1662. break;
  1663. case W3DSHADER_DETAILALPHAFUNC_INVSCALE:
  1664. texel.a = texel.a + (1.0f - texel.a) * detail_texel.a;
  1665. break;
  1666. }
  1667. }
  1668. /*
  1669. ** Shader parameters define combination...
  1670. */
  1671. src.r = texel.r;
  1672. src.g = texel.g;
  1673. src.b = texel.b;
  1674. alpha = texel.a * Get_Opacity(pass,sc.CurTime());
  1675. switch (Get_Pri_Gradient(pass))
  1676. {
  1677. case W3DSHADER_PRIGRADIENT_DISABLE: break;
  1678. case W3DSHADER_PRIGRADIENT_MODULATE: src = src * pri_gradient; break;
  1679. case W3DSHADER_PRIGRADIENT_ADD: src = src + pri_gradient; break;
  1680. }
  1681. switch (Get_Sec_Gradient(pass))
  1682. {
  1683. case W3DSHADER_SECGRADIENT_DISABLE: break;
  1684. case W3DSHADER_SECGRADIENT_ENABLE: src = src + sec_gradient; break;
  1685. }
  1686. if (src.r > 1.0f) src.r = 1.0f;
  1687. if (src.g > 1.0f) src.g = 1.0f;
  1688. if (src.b > 1.0f) src.b = 1.0f;
  1689. if (src.r < 0.0f) src.r = 0.0f;
  1690. if (src.g < 0.0f) src.g = 0.0f;
  1691. if (src.b < 0.0f) src.b = 0.0f;
  1692. Color dest_blend;
  1693. switch (Get_Dest_Blend(pass))
  1694. {
  1695. case W3DSHADER_DESTBLENDFUNC_ZERO: dest_blend = Color(0,0,0); break;
  1696. case W3DSHADER_DESTBLENDFUNC_ONE: dest_blend = Color(1,1,1); break;
  1697. case W3DSHADER_DESTBLENDFUNC_SRC_COLOR: dest_blend = src; break;
  1698. case W3DSHADER_DESTBLENDFUNC_ONE_MINUS_SRC_COLOR: dest_blend = Color(1.0f-src.r,1.0f-src.g, 1.0f-src.b); break;
  1699. case W3DSHADER_DESTBLENDFUNC_SRC_ALPHA: dest_blend = Color(alpha,alpha,alpha); break;
  1700. case W3DSHADER_DESTBLENDFUNC_ONE_MINUS_SRC_ALPHA: dest_blend = Color(1.0f-alpha,1.0f-alpha,1.0f-alpha); break;
  1701. case W3DSHADER_DESTBLENDFUNC_SRC_COLOR_PREFOG: dest_blend = src; break;
  1702. }
  1703. Color src_blend;
  1704. switch (Get_Src_Blend(pass))
  1705. {
  1706. case W3DSHADER_SRCBLENDFUNC_ZERO: src_blend = Color(0,0,0); break;
  1707. case W3DSHADER_SRCBLENDFUNC_ONE: src_blend = Color(1,1,1); break;
  1708. case W3DSHADER_SRCBLENDFUNC_SRC_ALPHA: src_blend = Color(alpha,alpha,alpha); break;
  1709. case W3DSHADER_SRCBLENDFUNC_ONE_MINUS_SRC_ALPHA: src_blend = Color(1.0f-alpha,1.0f-alpha,1.0f-alpha); break;
  1710. }
  1711. src = scale(src_blend,src) + scale(dest_blend,dest);
  1712. /*
  1713. ** Dest becomes Src and we repeat!
  1714. */
  1715. dest = src;
  1716. }
  1717. sc.out.t = Color(0.0f, 0.0f, 0.0f);
  1718. sc.out.c = dest;
  1719. }
  1720. /***********************************************************************************************
  1721. * GameMtl::ps2_shade -- Emulate the PS2 shader. *
  1722. * *
  1723. * *
  1724. * *
  1725. * *
  1726. * HISTORY: *
  1727. * 10/12/1999MLL: Created. *
  1728. *=============================================================================================*/
  1729. void GameMtl::ps2_shade(ShadeContext& sc)
  1730. {
  1731. if (gbufID) sc.SetGBufferID(gbufID);
  1732. /*
  1733. ** Shadowing, return black
  1734. */
  1735. if (sc.mode == SCMODE_SHADOW) {
  1736. sc.out.t = Color(0,0,0);
  1737. return;
  1738. }
  1739. /*
  1740. ** Render each pass, initialize dest with the current background
  1741. */
  1742. // Background transparency. ???
  1743. Color back_t;
  1744. Color back_c;
  1745. AColor dest;
  1746. AColor src(1,1,1,1);
  1747. sc.GetBGColor(back_c, back_t, FALSE);
  1748. dest.r = back_c.r;
  1749. dest.g = back_c.g;
  1750. dest.b = back_c.b;
  1751. dest.a = 0.0f;
  1752. for (int pass=0; pass < Get_Pass_Count(); pass++) {
  1753. // Compute the gradients.
  1754. Color ambient = sc.ambientLight;
  1755. Color diffuse(0,0,0);
  1756. Color specular(0,0,0);
  1757. for (int light_index = 0; light_index < sc.nLights; light_index++) {
  1758. Color light_color;
  1759. Point3 light_dir;
  1760. float dot_nl;
  1761. float diffuse_coef;
  1762. LightDesc * light = sc.Light(light_index);
  1763. assert(light);
  1764. if(light->Illuminate(sc, sc.Normal(), light_color, light_dir, dot_nl, diffuse_coef)) {
  1765. if (dot_nl > 0.0f) diffuse += dot_nl * light_color;
  1766. float c = DotProd(light_dir, sc.ReflectVector());
  1767. if (c > 0.f) {
  1768. specular += (float)pow(c, Get_Shininess(pass, sc.CurTime())) * light_color;
  1769. }
  1770. }
  1771. }
  1772. ambient = ambient * Get_Ambient(pass,sc.CurTime());
  1773. diffuse = diffuse * Get_Diffuse(pass,sc.CurTime());
  1774. specular = specular * Get_Specular(pass,sc.CurTime());
  1775. Color gradient = ambient + diffuse + Get_Emissive(pass,sc.CurTime());
  1776. AColor pri_gradient;
  1777. pri_gradient.r = gradient.r;
  1778. pri_gradient.g = gradient.g;
  1779. pri_gradient.b = gradient.b;
  1780. pri_gradient.a = 1.0f;
  1781. if (pri_gradient.r > 1.0f) pri_gradient.r = 1.0f;
  1782. if (pri_gradient.g > 1.0f) pri_gradient.g = 1.0f;
  1783. if (pri_gradient.b > 1.0f) pri_gradient.b = 1.0f;
  1784. /*
  1785. ** Sampling the Texture(s)
  1786. */
  1787. if (Get_Texture_Enable(pass,0) && Texture[pass][0]) {
  1788. src = Texture[pass][0]->EvalColor(sc);
  1789. }
  1790. /*
  1791. ** Shader parameters define combination...
  1792. */
  1793. src.a *= Get_Opacity(pass,sc.CurTime());
  1794. switch (Get_Pri_Gradient(pass))
  1795. {
  1796. case PSS_PRIGRADIENT_MODULATE:
  1797. src = src * pri_gradient;
  1798. break;
  1799. case PSS_PRIGRADIENT_HIGHLIGHT:
  1800. src = src * pri_gradient;
  1801. src += back_t; // ???
  1802. break;
  1803. case PSS_PRIGRADIENT_HIGHLIGHT2:
  1804. src = src * pri_gradient;
  1805. src += back_t; // ???
  1806. break;
  1807. }
  1808. if (src.r > 1.0f) src.r = 1.0f;
  1809. if (src.g > 1.0f) src.g = 1.0f;
  1810. if (src.b > 1.0f) src.b = 1.0f;
  1811. if (src.b > 1.0f) src.a = 1.0f;
  1812. if (src.r < 0.0f) src.r = 0.0f;
  1813. if (src.g < 0.0f) src.g = 0.0f;
  1814. if (src.b < 0.0f) src.b = 0.0f;
  1815. if (src.a < 0.0f) src.a = 0.0f;
  1816. AColor param_a;
  1817. AColor param_b;
  1818. AColor param_c;
  1819. AColor param_d;
  1820. int a_value = Get_PS2_Shader_Param_A(pass);
  1821. int b_value = Get_PS2_Shader_Param_B(pass);
  1822. int c_value = Get_PS2_Shader_Param_C(pass);
  1823. int d_value = Get_PS2_Shader_Param_D(pass);
  1824. switch (a_value)
  1825. {
  1826. case PSS_SRC:
  1827. param_a = src;
  1828. break;
  1829. case PSS_DEST:
  1830. param_a = dest;
  1831. break;
  1832. case PSS_ZERO:
  1833. param_a = AColor(0, 0, 0, 0);
  1834. break;
  1835. }
  1836. switch (b_value)
  1837. {
  1838. case PSS_SRC:
  1839. param_b = src;
  1840. break;
  1841. case PSS_DEST:
  1842. param_b = dest;
  1843. break;
  1844. case PSS_ZERO:
  1845. param_b = AColor(0, 0, 0, 0);
  1846. break;
  1847. }
  1848. switch (c_value)
  1849. {
  1850. case PSS_SRC_ALPHA:
  1851. param_c = AColor(src.a, src.a, src.a, src.a);
  1852. break;
  1853. case PSS_DEST_ALPHA:
  1854. param_c = back_t; // ???
  1855. break;
  1856. case PSS_ONE:
  1857. param_c = AColor(1, 1, 1, 1);
  1858. break;
  1859. }
  1860. switch (d_value)
  1861. {
  1862. case PSS_SRC:
  1863. param_d = src;
  1864. break;
  1865. case PSS_DEST:
  1866. param_d = dest;
  1867. break;
  1868. case PSS_ZERO:
  1869. param_d = AColor(0, 0, 0);
  1870. break;
  1871. }
  1872. src = scale((param_a - param_b), param_c) + param_d;
  1873. if (src.r > 1.0f) src.r = 1.0f;
  1874. if (src.g > 1.0f) src.g = 1.0f;
  1875. if (src.b > 1.0f) src.b = 1.0f;
  1876. if (src.b > 1.0f) src.a = 1.0f;
  1877. if (src.r < 0.0f) src.r = 0.0f;
  1878. if (src.g < 0.0f) src.g = 0.0f;
  1879. if (src.b < 0.0f) src.b = 0.0f;
  1880. if (src.a < 0.0f) src.a = 0.0f;
  1881. /*
  1882. ** Dest becomes Src and we repeat!
  1883. */
  1884. dest = src;
  1885. }
  1886. sc.out.t = Color(0.0f, 0.0f, 0.0f);
  1887. sc.out.c.r = dest.r;
  1888. sc.out.c.g = dest.g;
  1889. sc.out.c.b = dest.b;
  1890. }
  1891. // PS2 equation paramaters.
  1892. // They are set to primes to avoid multiple equation solutions.
  1893. enum Shader_Translation {
  1894. ST_ZERO,
  1895. ST_ONE,
  1896. ST_SRC = 7,
  1897. ST_DEST = 31,
  1898. ST_SRC_ALPHA = 101,
  1899. ST_DEST_ALPHA = 2999,
  1900. };
  1901. /***********************************************************************************************
  1902. * GameMtl::Compute_PC_Shader_From_PS2_Shader -- Determine if a PC shader can be created. *
  1903. * *
  1904. * *
  1905. * *
  1906. * *
  1907. * HISTORY: *
  1908. * 10/13/1999MLL: Created. *
  1909. *=============================================================================================*/
  1910. int GameMtl::Compute_PC_Shader_From_PS2_Shader(int pass)
  1911. {
  1912. int param_value[4];
  1913. // These match the PC equation paramaters.
  1914. static const int src_blend[4] = {
  1915. ST_ZERO,
  1916. ST_ONE,
  1917. ST_SRC_ALPHA,
  1918. 1 - ST_SRC_ALPHA
  1919. };
  1920. static const int dest_blend[6] = {
  1921. ST_ZERO,
  1922. ST_ONE,
  1923. ST_SRC,
  1924. 1 - ST_SRC,
  1925. ST_SRC_ALPHA,
  1926. 1 - ST_SRC_ALPHA
  1927. };
  1928. int i = 0;
  1929. int j = 0;
  1930. int equation_value = 0;
  1931. // Get the PS2 shader values.
  1932. param_value[0] = Get_PS2_Shader_Param_A(pass);
  1933. param_value[1] = Get_PS2_Shader_Param_B(pass);
  1934. param_value[2] = Get_PS2_Shader_Param_D(pass);
  1935. param_value[3] = Get_PS2_Shader_Param_C(pass);
  1936. // Convert them to the enumeration.
  1937. for (i = 0; i < 3; i++) {
  1938. switch(param_value[i])
  1939. {
  1940. case PSS_SRC:
  1941. param_value[i] = ST_SRC;
  1942. break;
  1943. case PSS_DEST:
  1944. param_value[i] = ST_DEST;
  1945. break;
  1946. case PSS_ZERO:
  1947. param_value[i] = ST_ZERO;
  1948. break;
  1949. }
  1950. }
  1951. // The alpha paramater.
  1952. switch(param_value[3])
  1953. {
  1954. case PSS_SRC_ALPHA:
  1955. param_value[3] = ST_SRC_ALPHA;
  1956. break;
  1957. case PSS_DEST_ALPHA:
  1958. param_value[3] = ST_DEST_ALPHA;
  1959. break;
  1960. case PSS_ONE:
  1961. param_value[3] = ST_ONE;
  1962. break;
  1963. }
  1964. // Calculate the PS2 shader.
  1965. equation_value = ((param_value[0] - param_value[1]) * param_value[3]) + param_value[2];
  1966. for (i = 0; i < 4; i++) {
  1967. for (j = 0; j < 6; j++) {
  1968. // Calculate the PC shader. If equal, we have found a conversion.
  1969. if (((src_blend[i] * ST_SRC) + (dest_blend[j] * ST_DEST)) == equation_value) {
  1970. break;
  1971. }
  1972. }
  1973. if (j != 6) {
  1974. break;
  1975. }
  1976. }
  1977. if ((j == 6) && (i == 4)) {
  1978. // Set the W3D shader to opaque.
  1979. Set_Dest_Blend(pass, W3DSHADER_DESTBLENDFUNC_ZERO);
  1980. Set_Src_Blend(pass, W3DSHADER_SRCBLENDFUNC_ONE);
  1981. // No matches.
  1982. return (FALSE);
  1983. }
  1984. // Set the PC shader to an equivalant of the PS2 shader.
  1985. switch (dest_blend[j])
  1986. {
  1987. case ST_ZERO:
  1988. Set_Dest_Blend(pass, W3DSHADER_DESTBLENDFUNC_ZERO);
  1989. break;
  1990. case ST_ONE:
  1991. Set_Dest_Blend(pass, W3DSHADER_DESTBLENDFUNC_ONE);
  1992. break;
  1993. case ST_SRC:
  1994. Set_Dest_Blend(pass, W3DSHADER_DESTBLENDFUNC_SRC_COLOR);
  1995. break;
  1996. case (1 - ST_SRC):
  1997. Set_Dest_Blend(pass, W3DSHADER_DESTBLENDFUNC_ONE_MINUS_SRC_COLOR);
  1998. break;
  1999. case ST_SRC_ALPHA:
  2000. Set_Dest_Blend(pass, W3DSHADER_DESTBLENDFUNC_SRC_ALPHA);
  2001. break;
  2002. case (1 - ST_SRC_ALPHA):
  2003. Set_Dest_Blend(pass, W3DSHADER_DESTBLENDFUNC_ONE_MINUS_SRC_ALPHA);
  2004. break;
  2005. }
  2006. switch (src_blend[i])
  2007. {
  2008. case ST_ZERO:
  2009. Set_Src_Blend(pass, W3DSHADER_SRCBLENDFUNC_ZERO);
  2010. break;
  2011. case ST_ONE:
  2012. Set_Src_Blend(pass, W3DSHADER_SRCBLENDFUNC_ONE);
  2013. break;
  2014. case ST_SRC_ALPHA:
  2015. Set_Src_Blend(pass, W3DSHADER_SRCBLENDFUNC_SRC_ALPHA);
  2016. break;
  2017. case (1 - ST_SRC_ALPHA):
  2018. Set_Src_Blend(pass, W3DSHADER_SRCBLENDFUNC_ONE_MINUS_SRC_ALPHA);
  2019. break;
  2020. }
  2021. // A match was made.
  2022. return (TRUE);
  2023. }
  2024. /***********************************************************************************************
  2025. * GameMtl::Compute_PS2_Shader_From_PC_Shader -- Change a W3D material to a PS2 W3D material. *
  2026. W3DSHADER_PRIGRADIENT_ * *
  2027. * *
  2028. * *
  2029. * *
  2030. * HISTORY: *
  2031. * 10/26/1999MLL: Created. *
  2032. *=============================================================================================*/
  2033. int GameMtl::Compute_PS2_Shader_From_PC_Shader(int pass)
  2034. {
  2035. // These match the PC equation paramaters.
  2036. static const int a_blend[3] = {
  2037. ST_ZERO,
  2038. ST_SRC,
  2039. ST_DEST,
  2040. };
  2041. static const int b_blend[3] = {
  2042. ST_ZERO,
  2043. ST_SRC,
  2044. ST_DEST,
  2045. };
  2046. static const int d_blend[3] = {
  2047. ST_ZERO,
  2048. ST_SRC,
  2049. ST_DEST,
  2050. };
  2051. static const int c_blend[6] = {
  2052. ST_ONE,
  2053. ST_SRC_ALPHA,
  2054. ST_DEST_ALPHA,
  2055. };
  2056. int i = 0;
  2057. int j = 0;
  2058. int k = 0;
  2059. int l = 0;
  2060. int equation_value = 0;
  2061. int param_value[2];
  2062. // Get the PC shader values.
  2063. param_value[0] = Get_Src_Blend(pass);
  2064. param_value[1] = Get_Dest_Blend(pass);
  2065. switch (param_value[0])
  2066. {
  2067. case W3DSHADER_SRCBLENDFUNC_ZERO:
  2068. param_value[0] = ST_ZERO;
  2069. break;
  2070. case W3DSHADER_SRCBLENDFUNC_ONE:
  2071. param_value[0] = ST_ONE;
  2072. break;
  2073. case W3DSHADER_SRCBLENDFUNC_SRC_ALPHA:
  2074. param_value[0] = ST_SRC_ALPHA;
  2075. break;
  2076. case W3DSHADER_SRCBLENDFUNC_ONE_MINUS_SRC_ALPHA:
  2077. param_value[0] = 1 - ST_SRC_ALPHA;
  2078. break;
  2079. }
  2080. // Convert them to the enumeration.
  2081. switch (param_value[1])
  2082. {
  2083. case W3DSHADER_DESTBLENDFUNC_ZERO:
  2084. param_value[1] = ST_ZERO;
  2085. break;
  2086. case W3DSHADER_DESTBLENDFUNC_ONE:
  2087. param_value[1] = ST_ONE;
  2088. break;
  2089. case W3DSHADER_DESTBLENDFUNC_SRC_COLOR:
  2090. param_value[1] = ST_SRC;
  2091. break;
  2092. case W3DSHADER_DESTBLENDFUNC_ONE_MINUS_SRC_COLOR:
  2093. param_value[1] = 1 - ST_SRC;
  2094. break;
  2095. case W3DSHADER_DESTBLENDFUNC_SRC_ALPHA:
  2096. param_value[1] = ST_SRC_ALPHA;
  2097. break;
  2098. case W3DSHADER_DESTBLENDFUNC_ONE_MINUS_SRC_ALPHA:
  2099. param_value[1] = 1 - ST_SRC_ALPHA;
  2100. break;
  2101. case W3DSHADER_DESTBLENDFUNC_SRC_COLOR_PREFOG:
  2102. assert(true);
  2103. break;
  2104. }
  2105. // Calculate the PC shader.
  2106. equation_value = param_value[0] * ST_SRC + param_value[1] * ST_DEST;
  2107. // Set the shader to be a PS2 Shader.
  2108. ShaderType = STE_PS2_SHADER;
  2109. // Find a match for the depth compare test.
  2110. switch (Get_Depth_Compare(pass))
  2111. {
  2112. case W3DSHADER_DEPTHCOMPARE_PASS_NEVER:
  2113. Set_Depth_Compare(pass, PSS_DEPTHCOMPARE_PASS_NEVER);
  2114. break;
  2115. case W3DSHADER_DEPTHCOMPARE_PASS_LESS:
  2116. Set_Depth_Compare(pass, PSS_DEPTHCOMPARE_PASS_LESS);
  2117. break;
  2118. case W3DSHADER_DEPTHCOMPARE_PASS_LEQUAL:
  2119. Set_Depth_Compare(pass, PSS_DEPTHCOMPARE_PASS_LEQUAL);
  2120. break;
  2121. case W3DSHADER_DEPTHCOMPARE_PASS_ALWAYS:
  2122. Set_Depth_Compare(pass, PSS_DEPTHCOMPARE_PASS_ALWAYS);
  2123. break;
  2124. default:
  2125. Set_Depth_Compare(pass, PSS_DEPTHCOMPARE_PASS_LEQUAL);
  2126. break;
  2127. }
  2128. // Only 1 gradient matches between the PC and PS2.
  2129. switch (Get_Pri_Gradient(pass))
  2130. {
  2131. case W3DSHADER_PRIGRADIENT_MODULATE:
  2132. Set_Pri_Gradient(pass, PSS_PRIGRADIENT_MODULATE);
  2133. break;
  2134. default:
  2135. Set_Pri_Gradient(pass, PSS_PRIGRADIENT_MODULATE);
  2136. break;
  2137. }
  2138. for (i = 0; i < 3; i++) {
  2139. for (j = 0; j < 3; j++) {
  2140. for (k = 0; k < 3; k++) {
  2141. for (l = 0; l < 3; l++) {
  2142. // Calculate the PS2 shader. If equal, we have found a conversion.
  2143. if (equation_value == ((a_blend[i] - b_blend[j]) * c_blend[k]) + d_blend[l]) {
  2144. goto finished;
  2145. }
  2146. }
  2147. }
  2148. }
  2149. }
  2150. // Set the PS2 W3D shader to opaque.
  2151. Set_PS2_Shader_Param_A(pass, PSS_SRC);
  2152. Set_PS2_Shader_Param_B(pass, PSS_ZERO);
  2153. Set_PS2_Shader_Param_C(pass, PSS_ONE);
  2154. Set_PS2_Shader_Param_D(pass, PSS_ZERO);
  2155. Set_Depth_Mask(pass,W3DSHADER_DEPTHMASK_DEFAULT);
  2156. // No matches.
  2157. return (FALSE);
  2158. finished:
  2159. // Set the PS2 shader to an equivalant of the PC shader.
  2160. switch (a_blend[i])
  2161. {
  2162. case ST_ZERO:
  2163. Set_PS2_Shader_Param_A(pass, PSS_ZERO);
  2164. break;
  2165. case ST_SRC:
  2166. Set_PS2_Shader_Param_A(pass, PSS_SRC);
  2167. break;
  2168. case ST_DEST:
  2169. Set_PS2_Shader_Param_A(pass, PSS_DEST);
  2170. break;
  2171. }
  2172. switch (b_blend[j])
  2173. {
  2174. case ST_ZERO:
  2175. Set_PS2_Shader_Param_B(pass, PSS_ZERO);
  2176. break;
  2177. case ST_SRC:
  2178. Set_PS2_Shader_Param_B(pass, PSS_SRC);
  2179. break;
  2180. case ST_DEST:
  2181. Set_PS2_Shader_Param_B(pass, PSS_DEST);
  2182. break;
  2183. }
  2184. switch (d_blend[l])
  2185. {
  2186. case ST_ZERO:
  2187. Set_PS2_Shader_Param_D(pass, PSS_ZERO);
  2188. break;
  2189. case ST_SRC:
  2190. Set_PS2_Shader_Param_D(pass, PSS_SRC);
  2191. break;
  2192. case ST_DEST:
  2193. Set_PS2_Shader_Param_D(pass, PSS_DEST);
  2194. break;
  2195. }
  2196. switch (c_blend[k])
  2197. {
  2198. case ST_ONE:
  2199. Set_PS2_Shader_Param_C(pass, PSS_ONE);
  2200. break;
  2201. case ST_SRC_ALPHA:
  2202. Set_PS2_Shader_Param_C(pass, PSS_SRC_ALPHA);
  2203. break;
  2204. case ST_DEST_ALPHA:
  2205. Set_PS2_Shader_Param_C(pass, PSS_DEST_ALPHA);
  2206. break;
  2207. }
  2208. // A match was made.
  2209. return (TRUE);
  2210. }
  2211. void GameMtl::Set_Pass_Count(int passcount)
  2212. {
  2213. assert(MainParameterBlock);
  2214. MainParameterBlock->SetValue(0, TimeValue(0), passcount);
  2215. }
  2216. int GameMtl::Get_Pass_Count(void)
  2217. {
  2218. assert(MainParameterBlock);
  2219. int pcount;
  2220. MainParameterBlock->GetValue(0, TimeValue(0), pcount, FOREVER);
  2221. return pcount;
  2222. }
  2223. Color GameMtl::Get_Ambient(int pass,TimeValue t)
  2224. {
  2225. Color val;
  2226. PassParameterBlock[pass]->GetValue(PB_AMBIENT,t,val,FOREVER);
  2227. return val;
  2228. }
  2229. Color GameMtl::Get_Diffuse(int pass,TimeValue t)
  2230. {
  2231. Color val;
  2232. PassParameterBlock[pass]->GetValue(PB_DIFFUSE,t,val,FOREVER);
  2233. return val;
  2234. }
  2235. Color GameMtl::Get_Specular(int pass,TimeValue t)
  2236. {
  2237. Color val;
  2238. PassParameterBlock[pass]->GetValue(PB_SPECULAR,t,val,FOREVER);
  2239. return val;
  2240. }
  2241. Color GameMtl::Get_Emissive(int pass,TimeValue t)
  2242. {
  2243. Color val;
  2244. PassParameterBlock[pass]->GetValue(PB_EMISSIVE,t,val,FOREVER);
  2245. return val;
  2246. }
  2247. float GameMtl::Get_Shininess(int pass,TimeValue t)
  2248. {
  2249. float val;
  2250. PassParameterBlock[pass]->GetValue(PB_SHININESS,t,val,FOREVER);
  2251. return val;
  2252. }
  2253. float GameMtl::Get_Opacity(int pass,TimeValue t)
  2254. {
  2255. float val;
  2256. PassParameterBlock[pass]->GetValue(PB_OPACITY,t,val,FOREVER);
  2257. return val;
  2258. }
  2259. float GameMtl::Get_Translucency(int pass,TimeValue t)
  2260. {
  2261. float val;
  2262. PassParameterBlock[pass]->GetValue(PB_TRANSLUCENCY,t,val,FOREVER);
  2263. return val;
  2264. }
  2265. int GameMtl::Get_Copy_Specular_To_Diffuse(int pass)
  2266. {
  2267. int val;
  2268. PassParameterBlock[pass]->GetValue(PB_COPY_SPECULAR_TO_DIFFUSE,0,val,FOREVER);
  2269. return val;
  2270. }
  2271. int GameMtl::Get_Mapping_Type(int pass, int stage)
  2272. {
  2273. int val = -1;
  2274. if (stage == 0)
  2275. PassParameterBlock[pass]->GetValue(PB_STAGE0_MAPPING_TYPE,0,val,FOREVER);
  2276. else if (stage == 1)
  2277. PassParameterBlock[pass]->GetValue(PB_STAGE1_MAPPING_TYPE,0,val,FOREVER);
  2278. return val;
  2279. }
  2280. int GameMtl::Get_PSX_Translucency(int pass)
  2281. {
  2282. int val;
  2283. PassParameterBlock[pass]->GetValue(PB_PSX_TRANSLUCENCY,0,val,FOREVER);
  2284. return val;
  2285. }
  2286. int GameMtl::Get_PSX_Lighting(int pass)
  2287. {
  2288. int val;
  2289. PassParameterBlock[pass]->GetValue(PB_PSX_LIGHTING,0,val,FOREVER);
  2290. return val;
  2291. }
  2292. int GameMtl::Get_Depth_Compare(int pass)
  2293. {
  2294. int val;
  2295. PassParameterBlock[pass]->GetValue(PB_DEPTH_COMPARE,0,val,FOREVER);
  2296. return val;
  2297. }
  2298. int GameMtl::Get_Depth_Mask(int pass)
  2299. {
  2300. int val;
  2301. PassParameterBlock[pass]->GetValue(PB_DEPTH_MASK,0,val,FOREVER);
  2302. return val;
  2303. }
  2304. int GameMtl::Get_Alpha_Test(int pass)
  2305. {
  2306. int val;
  2307. PassParameterBlock[pass]->GetValue(PB_ALPHA_TEST,0,val,FOREVER);
  2308. return val;
  2309. }
  2310. int GameMtl::Get_Dest_Blend(int pass)
  2311. {
  2312. int val;
  2313. PassParameterBlock[pass]->GetValue(PB_DEST_BLEND,0,val,FOREVER);
  2314. return val;
  2315. }
  2316. int GameMtl::Get_Pri_Gradient(int pass)
  2317. {
  2318. int val;
  2319. PassParameterBlock[pass]->GetValue(PB_PRI_GRADIENT,0,val,FOREVER);
  2320. return val;
  2321. }
  2322. int GameMtl::Get_Sec_Gradient(int pass)
  2323. {
  2324. int val;
  2325. PassParameterBlock[pass]->GetValue(PB_SEC_GRADIENT,0,val,FOREVER);
  2326. return val;
  2327. }
  2328. int GameMtl::Get_Src_Blend(int pass)
  2329. {
  2330. int val;
  2331. PassParameterBlock[pass]->GetValue(PB_SRC_BLEND,0,val,FOREVER);
  2332. return val;
  2333. }
  2334. int GameMtl::Get_Detail_Color_Func(int pass)
  2335. {
  2336. int val;
  2337. PassParameterBlock[pass]->GetValue(PB_DETAIL_COLOR_FUNC,0,val,FOREVER);
  2338. return val;
  2339. }
  2340. int GameMtl::Get_Detail_Alpha_Func(int pass)
  2341. {
  2342. int val;
  2343. PassParameterBlock[pass]->GetValue(PB_DETAIL_ALPHA_FUNC,0,val,FOREVER);
  2344. return val;
  2345. }
  2346. int GameMtl::Get_Texture_Enable(int pass,int stage)
  2347. {
  2348. int val;
  2349. if (stage == 0) {
  2350. PassParameterBlock[pass]->GetValue(PB_STAGE0_TEXTURE_ENABLE,0,val,FOREVER);
  2351. } else {
  2352. PassParameterBlock[pass]->GetValue(PB_STAGE1_TEXTURE_ENABLE,0,val,FOREVER);
  2353. }
  2354. return val;
  2355. }
  2356. int GameMtl::Get_Texture_Publish(int pass,int stage)
  2357. {
  2358. int val;
  2359. if (stage == 0) {
  2360. PassParameterBlock[pass]->GetValue(PB_STAGE0_TEXTURE_PUBLISH,0,val,FOREVER);
  2361. } else {
  2362. PassParameterBlock[pass]->GetValue(PB_STAGE1_TEXTURE_PUBLISH,0,val,FOREVER);
  2363. }
  2364. return val;
  2365. }
  2366. int GameMtl::Get_Texture_Resize(int pass,int stage)
  2367. {
  2368. int val;
  2369. if (stage == 0) {
  2370. PassParameterBlock[pass]->GetValue(PB_STAGE0_TEXTURE_RESIZE,0,val,FOREVER);
  2371. } else {
  2372. PassParameterBlock[pass]->GetValue(PB_STAGE1_TEXTURE_RESIZE,0,val,FOREVER);
  2373. }
  2374. return val;
  2375. }
  2376. int GameMtl::Get_Texture_No_Mipmap(int pass,int stage)
  2377. {
  2378. int val;
  2379. if (stage == 0) {
  2380. PassParameterBlock[pass]->GetValue(PB_STAGE0_TEXTURE_NO_MIPMAP,0,val,FOREVER);
  2381. } else {
  2382. PassParameterBlock[pass]->GetValue(PB_STAGE1_TEXTURE_NO_MIPMAP,0,val,FOREVER);
  2383. }
  2384. return val;
  2385. }
  2386. int GameMtl::Get_Texture_Clamp_U(int pass,int stage)
  2387. {
  2388. int val;
  2389. if (stage == 0) {
  2390. PassParameterBlock[pass]->GetValue(PB_STAGE0_TEXTURE_CLAMP_U,0,val,FOREVER);
  2391. } else {
  2392. PassParameterBlock[pass]->GetValue(PB_STAGE1_TEXTURE_CLAMP_U,0,val,FOREVER);
  2393. }
  2394. return val;
  2395. }
  2396. int GameMtl::Get_Texture_Clamp_V(int pass,int stage)
  2397. {
  2398. int val;
  2399. if (stage == 0) {
  2400. PassParameterBlock[pass]->GetValue(PB_STAGE0_TEXTURE_CLAMP_V,0,val,FOREVER);
  2401. } else {
  2402. PassParameterBlock[pass]->GetValue(PB_STAGE1_TEXTURE_CLAMP_V,0,val,FOREVER);
  2403. }
  2404. return val;
  2405. }
  2406. int GameMtl::Get_Texture_No_LOD(int pass,int stage)
  2407. {
  2408. int val;
  2409. if (stage == 0) {
  2410. PassParameterBlock[pass]->GetValue(PB_STAGE0_TEXTURE_NO_LOD,0,val,FOREVER);
  2411. } else {
  2412. PassParameterBlock[pass]->GetValue(PB_STAGE1_TEXTURE_NO_LOD,0,val,FOREVER);
  2413. }
  2414. return val;
  2415. }
  2416. int GameMtl::Get_Texture_Alpha_Bitmap(int pass,int stage)
  2417. {
  2418. int val;
  2419. if (stage == 0) {
  2420. PassParameterBlock[pass]->GetValue(PB_STAGE0_TEXTURE_ALPHA_BITMAP,0,val,FOREVER);
  2421. } else {
  2422. PassParameterBlock[pass]->GetValue(PB_STAGE1_TEXTURE_ALPHA_BITMAP,0,val,FOREVER);
  2423. }
  2424. return val;
  2425. }
  2426. int GameMtl::Get_Texture_Hint(int pass,int stage)
  2427. {
  2428. int val;
  2429. if (stage == 0) {
  2430. PassParameterBlock[pass]->GetValue(PB_STAGE0_TEXTURE_HINT,0,val,FOREVER);
  2431. } else {
  2432. PassParameterBlock[pass]->GetValue(PB_STAGE1_TEXTURE_HINT,0,val,FOREVER);
  2433. }
  2434. return val;
  2435. }
  2436. int GameMtl::Get_Texture_Display(int pass,int stage)
  2437. {
  2438. int val;
  2439. GameMtl* gmtl = (GameMtl*)GetMtlEditInterface()->GetCurMtl();
  2440. Class_ID clsid = gmtl->ClassID();
  2441. if (stage == 0) {
  2442. PassParameterBlock[pass]->GetValue(PB_STAGE0_TEXTURE_DISPLAY,0,val,FOREVER);
  2443. } else {
  2444. PassParameterBlock[pass]->GetValue(PB_STAGE1_TEXTURE_DISPLAY,0,val,FOREVER);
  2445. }
  2446. return val;
  2447. }
  2448. float GameMtl::Get_Texture_Frame_Rate(int pass,int stage)
  2449. {
  2450. float val;
  2451. if (stage == 0) {
  2452. PassParameterBlock[pass]->GetValue(PB_STAGE0_TEXTURE_FRAME_RATE,0,val,FOREVER);
  2453. } else {
  2454. PassParameterBlock[pass]->GetValue(PB_STAGE1_TEXTURE_FRAME_RATE,0,val,FOREVER);
  2455. }
  2456. return val;
  2457. }
  2458. int GameMtl::Get_Texture_Frame_Count(int pass,int stage)
  2459. {
  2460. int val;
  2461. if (stage == 0) {
  2462. PassParameterBlock[pass]->GetValue(PB_STAGE0_TEXTURE_FRAME_COUNT,0,val,FOREVER);
  2463. } else {
  2464. PassParameterBlock[pass]->GetValue(PB_STAGE1_TEXTURE_FRAME_COUNT,0,val,FOREVER);
  2465. }
  2466. return val;
  2467. }
  2468. int GameMtl::Get_Texture_Anim_Type(int pass,int stage)
  2469. {
  2470. int val;
  2471. if (stage == 0) {
  2472. PassParameterBlock[pass]->GetValue(PB_STAGE0_TEXTURE_ANIM_TYPE,0,val,FOREVER);
  2473. } else {
  2474. PassParameterBlock[pass]->GetValue(PB_STAGE1_TEXTURE_ANIM_TYPE,0,val,FOREVER);
  2475. }
  2476. return val;
  2477. }
  2478. Texmap * GameMtl::Get_Texture(int pass,int stage)
  2479. {
  2480. return GetSubTexmap(pass_stage_to_texmap_index(pass,stage));
  2481. }
  2482. int GameMtl::Get_PS2_Shader_Param_A(int pass)
  2483. {
  2484. int val;
  2485. PassParameterBlock[pass]->GetValue(PB_PS2_SHADER_PARAM_A,0,val,FOREVER);
  2486. return val;
  2487. }
  2488. int GameMtl::Get_PS2_Shader_Param_B(int pass)
  2489. {
  2490. int val;
  2491. PassParameterBlock[pass]->GetValue(PB_PS2_SHADER_PARAM_B,0,val,FOREVER);
  2492. return val;
  2493. }
  2494. int GameMtl::Get_PS2_Shader_Param_C(int pass)
  2495. {
  2496. int val;
  2497. PassParameterBlock[pass]->GetValue(PB_PS2_SHADER_PARAM_C,0,val,FOREVER);
  2498. return val;
  2499. }
  2500. int GameMtl::Get_PS2_Shader_Param_D(int pass)
  2501. {
  2502. int val;
  2503. PassParameterBlock[pass]->GetValue(PB_PS2_SHADER_PARAM_D,0,val,FOREVER);
  2504. return val;
  2505. }
  2506. int GameMtl::Get_Map_Channel(int pass,int stage)
  2507. {
  2508. int val;
  2509. if (stage == 0) {
  2510. PassParameterBlock[pass]->GetValue(PB_STAGE0_MAP_CHANNEL,0,val,FOREVER);
  2511. } else {
  2512. PassParameterBlock[pass]->GetValue(PB_STAGE1_MAP_CHANNEL,0,val,FOREVER);
  2513. }
  2514. return val;
  2515. }
  2516. void GameMtl::Set_Ambient(int pass,TimeValue t,Color val)
  2517. {
  2518. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2519. assert(PassParameterBlock[pass]);
  2520. PassParameterBlock[pass]->SetValue(PB_AMBIENT, t, val);
  2521. }
  2522. void GameMtl::Set_Diffuse(int pass,TimeValue t,Color val)
  2523. {
  2524. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2525. assert(PassParameterBlock[pass]);
  2526. PassParameterBlock[pass]->SetValue(PB_DIFFUSE, t, val);
  2527. }
  2528. void GameMtl::Set_Specular(int pass,TimeValue t,Color val)
  2529. {
  2530. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2531. assert(PassParameterBlock[pass]);
  2532. PassParameterBlock[pass]->SetValue(PB_SPECULAR, t, val);
  2533. }
  2534. void GameMtl::Set_Emissive(int pass,TimeValue t,Color val)
  2535. {
  2536. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2537. assert(PassParameterBlock[pass]);
  2538. PassParameterBlock[pass]->SetValue(PB_EMISSIVE, t, val);
  2539. }
  2540. void GameMtl::Set_Shininess(int pass,TimeValue t,float val)
  2541. {
  2542. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2543. assert(PassParameterBlock[pass]);
  2544. PassParameterBlock[pass]->SetValue(PB_SHININESS, t, val);
  2545. }
  2546. void GameMtl::Set_Opacity(int pass,TimeValue t,float val)
  2547. {
  2548. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2549. assert(PassParameterBlock[pass]);
  2550. PassParameterBlock[pass]->SetValue(PB_OPACITY, t, val);
  2551. }
  2552. void GameMtl::Set_Translucency(int pass,TimeValue t,float val)
  2553. {
  2554. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2555. assert(PassParameterBlock[pass]);
  2556. PassParameterBlock[pass]->SetValue(PB_TRANSLUCENCY, t, val);
  2557. }
  2558. void GameMtl::Set_Copy_Specular_To_Diffuse(int pass,bool val)
  2559. {
  2560. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2561. assert(PassParameterBlock[pass]);
  2562. PassParameterBlock[pass]->SetValue(PB_COPY_SPECULAR_TO_DIFFUSE, 0, val);
  2563. }
  2564. void GameMtl::Set_Mapping_Type(int pass,int stage,int val)
  2565. {
  2566. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2567. assert(PassParameterBlock[pass]);
  2568. if (stage == 0)
  2569. PassParameterBlock[pass]->SetValue(PB_STAGE0_MAPPING_TYPE, 0, val);
  2570. else if (stage == 1)
  2571. PassParameterBlock[pass]->SetValue(PB_STAGE1_MAPPING_TYPE, 0, val);
  2572. }
  2573. void GameMtl::Set_PSX_Translucency(int pass,int val)
  2574. {
  2575. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2576. assert(PassParameterBlock[pass]);
  2577. PassParameterBlock[pass]->SetValue(PB_PSX_TRANSLUCENCY, 0, val);
  2578. }
  2579. void GameMtl::Set_PSX_Lighting(int pass,bool val)
  2580. {
  2581. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2582. assert(PassParameterBlock[pass]);
  2583. PassParameterBlock[pass]->SetValue(PB_PSX_LIGHTING, 0, val);
  2584. }
  2585. void GameMtl::Set_Depth_Compare(int pass,int val)
  2586. {
  2587. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2588. assert(PassParameterBlock[pass]);
  2589. PassParameterBlock[pass]->SetValue(PB_DEPTH_COMPARE, 0, val);
  2590. }
  2591. void GameMtl::Set_Depth_Mask(int pass,int val)
  2592. {
  2593. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2594. assert(PassParameterBlock[pass]);
  2595. PassParameterBlock[pass]->SetValue(PB_DEPTH_MASK, 0, val);
  2596. }
  2597. void GameMtl::Set_Alpha_Test(int pass,int val)
  2598. {
  2599. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2600. assert(PassParameterBlock[pass]);
  2601. PassParameterBlock[pass]->SetValue(PB_ALPHA_TEST, 0, val);
  2602. }
  2603. void GameMtl::Set_Dest_Blend(int pass,int val)
  2604. {
  2605. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2606. assert(PassParameterBlock[pass]);
  2607. PassParameterBlock[pass]->SetValue(PB_DEST_BLEND, 0, val);
  2608. }
  2609. void GameMtl::Set_Pri_Gradient(int pass,int val)
  2610. {
  2611. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2612. assert(PassParameterBlock[pass]);
  2613. PassParameterBlock[pass]->SetValue(PB_PRI_GRADIENT, 0, val);
  2614. }
  2615. void GameMtl::Set_Sec_Gradient(int pass,int val)
  2616. {
  2617. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2618. assert(PassParameterBlock[pass]);
  2619. PassParameterBlock[pass]->SetValue(PB_SEC_GRADIENT, 0, val);
  2620. }
  2621. void GameMtl::Set_Src_Blend(int pass,int val)
  2622. {
  2623. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2624. assert(PassParameterBlock[pass]);
  2625. PassParameterBlock[pass]->SetValue(PB_SRC_BLEND, 0, val);
  2626. }
  2627. void GameMtl::Set_Detail_Color_Func(int pass,int val)
  2628. {
  2629. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2630. assert(PassParameterBlock[pass]);
  2631. PassParameterBlock[pass]->SetValue(PB_DETAIL_COLOR_FUNC, 0, val);
  2632. }
  2633. void GameMtl::Set_Detail_Alpha_Func(int pass,int val)
  2634. {
  2635. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2636. assert(PassParameterBlock[pass]);
  2637. PassParameterBlock[pass]->SetValue(PB_DETAIL_ALPHA_FUNC, 0, val);
  2638. }
  2639. void GameMtl::Set_Texture_Enable(int pass,int stage,bool val)
  2640. {
  2641. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2642. assert(PassParameterBlock[pass]);
  2643. if (stage == 0) {
  2644. PassParameterBlock[pass]->SetValue(PB_STAGE0_TEXTURE_ENABLE, 0, val);
  2645. } else {
  2646. PassParameterBlock[pass]->SetValue(PB_STAGE1_TEXTURE_ENABLE, 0, val);
  2647. }
  2648. }
  2649. void GameMtl::Set_Texture_Publish(int pass,int stage,bool val)
  2650. {
  2651. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2652. assert(PassParameterBlock[pass]);
  2653. if (stage == 0) {
  2654. PassParameterBlock[pass]->SetValue(PB_STAGE0_TEXTURE_PUBLISH, 0, val);
  2655. } else {
  2656. PassParameterBlock[pass]->SetValue(PB_STAGE1_TEXTURE_PUBLISH, 0, val);
  2657. }
  2658. }
  2659. void GameMtl::Set_Texture_Resize(int pass,int stage,bool val)
  2660. {
  2661. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2662. assert(PassParameterBlock[pass]);
  2663. if (stage == 0) {
  2664. PassParameterBlock[pass]->SetValue(PB_STAGE0_TEXTURE_RESIZE, 0, val);
  2665. } else {
  2666. PassParameterBlock[pass]->SetValue(PB_STAGE1_TEXTURE_RESIZE, 0, val);
  2667. }
  2668. }
  2669. void GameMtl::Set_Texture_No_Mipmap(int pass,int stage,bool val)
  2670. {
  2671. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2672. assert(PassParameterBlock[pass]);
  2673. if (stage == 0) {
  2674. PassParameterBlock[pass]->SetValue(PB_STAGE0_TEXTURE_NO_MIPMAP, 0, val);
  2675. } else {
  2676. PassParameterBlock[pass]->SetValue(PB_STAGE1_TEXTURE_NO_MIPMAP, 0, val);
  2677. }
  2678. }
  2679. void GameMtl::Set_Texture_Clamp_U(int pass,int stage,bool val)
  2680. {
  2681. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2682. assert(PassParameterBlock[pass]);
  2683. if (stage == 0) {
  2684. PassParameterBlock[pass]->SetValue(PB_STAGE0_TEXTURE_CLAMP_U, 0, val);
  2685. } else {
  2686. PassParameterBlock[pass]->SetValue(PB_STAGE1_TEXTURE_CLAMP_U, 0, val);
  2687. }
  2688. }
  2689. void GameMtl::Set_Texture_Clamp_V(int pass,int stage,bool val)
  2690. {
  2691. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2692. assert(PassParameterBlock[pass]);
  2693. if (stage == 0) {
  2694. PassParameterBlock[pass]->SetValue(PB_STAGE0_TEXTURE_CLAMP_V, 0, val);
  2695. } else {
  2696. PassParameterBlock[pass]->SetValue(PB_STAGE1_TEXTURE_CLAMP_V, 0, val);
  2697. }
  2698. }
  2699. void GameMtl::Set_Texture_No_LOD(int pass,int stage,bool val)
  2700. {
  2701. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2702. assert(PassParameterBlock[pass]);
  2703. if (stage == 0) {
  2704. PassParameterBlock[pass]->SetValue(PB_STAGE0_TEXTURE_NO_LOD, 0, val);
  2705. } else {
  2706. PassParameterBlock[pass]->SetValue(PB_STAGE1_TEXTURE_NO_LOD, 0, val);
  2707. }
  2708. }
  2709. void GameMtl::Set_Texture_Alpha_Bitmap(int pass,int stage,bool val)
  2710. {
  2711. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2712. assert(PassParameterBlock[pass]);
  2713. if (stage == 0) {
  2714. PassParameterBlock[pass]->SetValue(PB_STAGE0_TEXTURE_ALPHA_BITMAP, 0, val);
  2715. } else {
  2716. PassParameterBlock[pass]->SetValue(PB_STAGE1_TEXTURE_ALPHA_BITMAP, 0, val);
  2717. }
  2718. }
  2719. void GameMtl::Set_Texture_Hint(int pass,int stage,int val)
  2720. {
  2721. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2722. assert(PassParameterBlock[pass]);
  2723. if (stage == 0) {
  2724. PassParameterBlock[pass]->SetValue(PB_STAGE0_TEXTURE_HINT, 0, val);
  2725. } else {
  2726. PassParameterBlock[pass]->SetValue(PB_STAGE1_TEXTURE_HINT, 0, val);
  2727. }
  2728. }
  2729. void GameMtl::Set_Texture_Display(int pass,int stage,bool val)
  2730. {
  2731. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2732. assert(PassParameterBlock[pass]);
  2733. // clear all tex display flags
  2734. for (int pi = 0; pi<Get_Pass_Count(); pi++) {
  2735. PassParameterBlock[pi]->SetValue(PB_STAGE0_TEXTURE_DISPLAY, 0, false);
  2736. PassParameterBlock[pi]->SetValue(PB_STAGE1_TEXTURE_DISPLAY, 0, false);
  2737. }
  2738. // set the one we want
  2739. Texmap* txt = Texture[pass][stage];
  2740. if (val == true) {
  2741. if (stage == 0) {
  2742. PassParameterBlock[pass]->SetValue(PB_STAGE0_TEXTURE_DISPLAY, 0, val);
  2743. } else {
  2744. PassParameterBlock[pass]->SetValue(PB_STAGE1_TEXTURE_DISPLAY, 0, val);
  2745. }
  2746. int set = TestMtlFlag(MTL_TEX_DISPLAY_ENABLED);
  2747. #if defined W3D_MAX4
  2748. if(txt){
  2749. SetMtlFlag(MTL_SUB_DISPLAY_ENABLED, TRUE); // New
  2750. SetActiveTexmap(txt);//Texture[pass][stage]);
  2751. txt->ActivateTexDisplay(TRUE);
  2752. GetCOREInterface()->ActivateTexture(txt, this);
  2753. }
  2754. #endif
  2755. NotifyDependents(FOREVER,PART_ALL,REFMSG_CHANGE);
  2756. } else {
  2757. #if defined W3D_MAX4
  2758. if(txt){
  2759. txt->ActivateTexDisplay(FALSE);
  2760. GetCOREInterface()->DeActivateTexture(txt, this);
  2761. }
  2762. #endif
  2763. SetMtlFlag( MTL_TEX_DISPLAY_ENABLED, FALSE );
  2764. SetActiveTexmap(NULL);
  2765. NotifyDependents(FOREVER,PART_ALL,REFMSG_CHANGE);
  2766. }
  2767. // tell dialog to refresh...
  2768. if (MaterialDialog) {
  2769. MaterialDialog->ReloadDialog();
  2770. }
  2771. if (IsMultiMtl()) {
  2772. // Loop through all sub materials of the multi-material.
  2773. for (unsigned mi = 0; mi < NumSubMtls(); mi++) {
  2774. // Only change those that are W3D materials.
  2775. if (GetSubMtl(mi)->ClassID() == GameMaterialClassID) {
  2776. int pass;
  2777. for (pass = 0; pass < ((GameMtl*)(GetSubMtl(mi)))->Get_Pass_Count(); pass++) {
  2778. if (((GameMtl*)(GetSubMtl(mi)))->Get_Texture_Enable(pass, stage)) {
  2779. (GetSubMtl(mi))->SetMtlFlag(MTL_TEX_DISPLAY_ENABLED, TRUE);
  2780. }
  2781. }
  2782. }
  2783. }
  2784. }
  2785. }
  2786. void GameMtl::Set_Texture_Frame_Rate(int pass,int stage,float val)
  2787. {
  2788. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2789. assert(PassParameterBlock[pass]);
  2790. if (stage == 0) {
  2791. PassParameterBlock[pass]->SetValue(PB_STAGE0_TEXTURE_FRAME_RATE, 0, val);
  2792. } else {
  2793. PassParameterBlock[pass]->SetValue(PB_STAGE1_TEXTURE_FRAME_RATE, 0, val);
  2794. }
  2795. }
  2796. void GameMtl::Set_Texture_Frame_Count(int pass,int stage,int val)
  2797. {
  2798. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2799. assert(PassParameterBlock[pass]);
  2800. if (stage == 0) {
  2801. PassParameterBlock[pass]->SetValue(PB_STAGE0_TEXTURE_FRAME_COUNT, 0, val);
  2802. } else {
  2803. PassParameterBlock[pass]->SetValue(PB_STAGE1_TEXTURE_FRAME_COUNT, 0, val);
  2804. }
  2805. }
  2806. void GameMtl::Set_Texture_Anim_Type(int pass,int stage,int val)
  2807. {
  2808. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2809. assert(PassParameterBlock[pass]);
  2810. if (stage == 0) {
  2811. PassParameterBlock[pass]->SetValue(PB_STAGE0_TEXTURE_ANIM_TYPE, 0, val);
  2812. } else {
  2813. PassParameterBlock[pass]->SetValue(PB_STAGE1_TEXTURE_ANIM_TYPE, 0, val);
  2814. }
  2815. }
  2816. void GameMtl::Set_Texture(int pass,int stage,Texmap * tex)
  2817. {
  2818. SetSubTexmap(pass_stage_to_texmap_index(pass,stage),tex);
  2819. }
  2820. void GameMtl::Set_PS2_Shader_Param_A(int pass,int val)
  2821. {
  2822. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2823. assert(PassParameterBlock[pass]);
  2824. PassParameterBlock[pass]->SetValue(PB_PS2_SHADER_PARAM_A, 0, val);
  2825. }
  2826. void GameMtl::Set_PS2_Shader_Param_B(int pass,int val)
  2827. {
  2828. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2829. assert(PassParameterBlock[pass]);
  2830. PassParameterBlock[pass]->SetValue(PB_PS2_SHADER_PARAM_B, 0, val);
  2831. }
  2832. void GameMtl::Set_PS2_Shader_Param_C(int pass,int val)
  2833. {
  2834. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2835. assert(PassParameterBlock[pass]);
  2836. PassParameterBlock[pass]->SetValue(PB_PS2_SHADER_PARAM_C, 0, val);
  2837. }
  2838. void GameMtl::Set_PS2_Shader_Param_D(int pass,int val)
  2839. {
  2840. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2841. assert(PassParameterBlock[pass]);
  2842. PassParameterBlock[pass]->SetValue(PB_PS2_SHADER_PARAM_D, 0, val);
  2843. }
  2844. void GameMtl::Set_Map_Channel(int pass,int stage,int val)
  2845. {
  2846. assert((pass >=0) && (pass < W3dMaterialClass::MAX_PASSES));
  2847. assert(PassParameterBlock[pass]);
  2848. if (stage == 0) {
  2849. PassParameterBlock[pass]->SetValue(PB_STAGE0_MAP_CHANNEL, 0, val);
  2850. } else {
  2851. PassParameterBlock[pass]->SetValue(PB_STAGE1_MAP_CHANNEL, 0, val);
  2852. }
  2853. if (Texture[pass][stage] != NULL) {
  2854. UVGen * uvgen = Texture[pass][stage]->GetTheUVGen();
  2855. if (uvgen != NULL) {
  2856. uvgen->SetMapChannel(val);
  2857. }
  2858. }
  2859. NotifyDependents(FOREVER,PART_ALL,REFMSG_CHANGE);
  2860. }
  2861. // This returns the mapping args string buffer for that pass (and stage) after
  2862. // assuring that it can contain a string of length 'len' (if len is 0 no
  2863. // resizing will be performed)..
  2864. char * GameMtl::Get_Mapping_Arg_Buffer(int pass, int stage, unsigned int len)
  2865. {
  2866. assert(pass >= 0);
  2867. assert(pass < W3dMaterialClass::MAX_PASSES);
  2868. assert(stage >= 0);
  2869. assert(stage < W3dMaterialClass::MAX_STAGES);
  2870. if (MapperArgLen[pass][stage] < len) {
  2871. MapperArgLen[pass][stage] = len + 10; // New length
  2872. char *temp = new char[MapperArgLen[pass][stage] + 1];
  2873. if (MapperArg[pass][stage]) {
  2874. assert(strlen(MapperArg[pass][stage]) <= MapperArgLen[pass][stage]);
  2875. strcpy(temp, MapperArg[pass][stage]);
  2876. delete [] (MapperArg[pass][stage]);
  2877. MapperArg[pass][stage] = NULL;
  2878. }
  2879. MapperArg[pass][stage] = temp;
  2880. }
  2881. return MapperArg[pass][stage];
  2882. }
  2883. int GameMtl::pass_stage_to_texmap_index(int pass,int stage)
  2884. {
  2885. assert((pass >= 0) && (pass < W3dMaterialClass::MAX_PASSES));
  2886. assert((stage >= 0) && (stage < W3dMaterialClass::MAX_STAGES));
  2887. return pass * W3dMaterialClass::MAX_STAGES + stage;
  2888. }
  2889. void GameMtl::texmap_index_to_pass_stage(int index,int * set_pass,int * set_stage)
  2890. {
  2891. *set_pass = index / W3dMaterialClass::MAX_STAGES;
  2892. *set_stage = index % W3dMaterialClass::MAX_STAGES;
  2893. }
  2894. float GameMtl::EvalDisplacement(ShadeContext& sc)
  2895. {
  2896. float displacement = 0.0F;
  2897. if (DisplacementMap != NULL) {
  2898. displacement = DisplacementMap->EvalMono(sc);
  2899. displacement = displacement * DisplacementAmt;
  2900. }
  2901. return displacement;
  2902. }
  2903. Interval GameMtl::DisplacementValidity(TimeValue t)
  2904. {
  2905. return FOREVER;
  2906. }
  2907. void GameMtlPostLoad::proc(ILoad *iload)
  2908. {
  2909. if (IsOld) {
  2910. m->Reset();
  2911. m->Set_Pass_Count(1);
  2912. m->Set_Ambient(0,0,AmbientCoeff);
  2913. m->Set_Diffuse(0,0,Diffuse * DiffuseCoeff);
  2914. m->Set_Specular(0,0,Specular * SpecularCoeff);
  2915. m->Set_Emissive(0,0,EmissiveCoeff);
  2916. m->Set_Opacity(0,0,Opacity);
  2917. m->Set_Translucency(0,0,Translucency);
  2918. m->Set_Shininess(0,0,Shininess);
  2919. m->Set_Mapping_Type(0,0,DCTMappingType);
  2920. Texmap * tex = (*(m->Maps))[ID_DI].Map;
  2921. if ((tex) && (tex->ClassID() == Class_ID(BMTEX_CLASS_ID,0))) {
  2922. m->Set_Texture(0,0,tex);
  2923. m->Set_Texture_Enable(0,0,true);
  2924. m->Set_Texture_Frame_Rate(0,0,DCTFrameRate);
  2925. m->Set_Texture_Frame_Count(0,0,DCTFrames);
  2926. if (m->TestMtlFlag(MTL_TEX_DISPLAY_ENABLED)) {
  2927. m->Set_Texture_Display(0,0,true);
  2928. }
  2929. }
  2930. m->ReplaceReference(GameMtl::REF_MAPS,NULL);
  2931. }
  2932. // older material formats did not save the map channel and will default to zero,
  2933. // we need to change the map channel to one in this case.
  2934. for (int pass = 0; pass < W3dMaterialClass::MAX_PASSES; pass++) {
  2935. for (int stage = 0; stage < W3dMaterialClass::MAX_STAGES; stage++) {
  2936. if ((m->Get_Map_Channel(pass,stage) < 1) || (m->Get_Map_Channel(pass,stage) > 99)) {
  2937. m->Set_Map_Channel(pass,stage,1);
  2938. }
  2939. }
  2940. }
  2941. // Now that I've removed the UI for the RESIZE and NO_MIPMAP options in the texture
  2942. // pane, we initialize the No_LOD setting to the existing NO_MIPMAP setting
  2943. // NOTE: I created a new flag for gamemtl which gets set when this conversion takes
  2944. // place for the first time.
  2945. if (m->Get_Flag(GAMEMTL_CONVERTED_TO_NOLOD) == false) {
  2946. for (int pass = 0; pass < W3dMaterialClass::MAX_PASSES; pass++) {
  2947. for (int stage = 0; stage < W3dMaterialClass::MAX_STAGES; stage++) {
  2948. bool no_lod = m->Get_Texture_No_Mipmap(pass,stage) != 0;
  2949. m->Set_Texture_No_LOD(pass,stage,no_lod);
  2950. }
  2951. }
  2952. m->Set_Flag(GAMEMTL_CONVERTED_TO_NOLOD,true);
  2953. }
  2954. delete this;
  2955. }
  2956. #if defined W3D_GMAXDEV
  2957. //============================================================================================
  2958. static ActionDescription spActions[] = {
  2959. IDA_GAMEMTL_DODLG,
  2960. IDS_GAMEMTL_DODLG,
  2961. IDS_GAMEMTL_DODLG,
  2962. IDS_GAMEMTL,
  2963. };
  2964. //============================================================================================
  2965. GameMtlActionCB* Game_Mtl_ActionCB = NULL;
  2966. GMaxMtlDlg * GMaxMaterialDialog = NULL;
  2967. //============================================================================================
  2968. static void GmaxStartupNotificationProc( void* param, NotifyInfo* notify_info){
  2969. GetCOREInterface()
  2970. ->GetActionManager()->ActivateActionTable(Game_Mtl_ActionCB, kGameMtlActions);
  2971. }
  2972. //============================================================================================
  2973. static void GmaxResetNotificationProc( void* param, NotifyInfo* notify_info){
  2974. if(GMaxMaterialDialog){
  2975. GMaxMaterialDialog->DestroyDialog();
  2976. GMaxMaterialDialog = NULL;
  2977. }
  2978. }
  2979. //============================================================================================
  2980. static void GmaxPreOpenNotificationProc( void* param, NotifyInfo* notify_info){
  2981. if(GMaxMaterialDialog){
  2982. GMaxMaterialDialog->DestroyDialog();
  2983. GMaxMaterialDialog = NULL;
  2984. }
  2985. }
  2986. //============================================================================================
  2987. static void GmaxPreDeleteNotificationProc( void* param, NotifyInfo* notify_info){
  2988. if(GMaxMaterialDialog){
  2989. INode* node = (INode*)notify_info->callParam;
  2990. if(node && node->GetMtl() == GMaxMaterialDialog->GetMtl()){
  2991. GMaxMaterialDialog->DestroyDialog();
  2992. GMaxMaterialDialog = NULL;
  2993. }
  2994. }
  2995. }
  2996. //============================================================================================
  2997. ActionTable* GameMaterialClassDesc::GetActionTable(int action_index)
  2998. {
  2999. TSTR name = Get_String(IDS_GAMEMTL);
  3000. HACCEL hAccel = LoadAccelerators(AppInstance,MAKEINTRESOURCE(IDR_GAMEMTL_SHORTCUTS));
  3001. int numOps = NumElements(spActions);
  3002. ActionTable* pTab;
  3003. pTab = new ActionTable(kGameMtlActions, kGameMtlContext, name, hAccel, numOps, spActions, AppInstance);
  3004. if(! GetCOREInterface()->GetActionManager()->RegisterActionContext(kGameMtlContext, name.data())){
  3005. MessageBox(NULL, "W3D Action Registration Error", "W3D Error", MB_OK);
  3006. return NULL;
  3007. }
  3008. //Create a dummy material to activate the ActionTable. Will stay around forever
  3009. GameMtl* pmtl = new GameMtl(true);//CreateNewGameMtl();//;
  3010. Game_Mtl_ActionCB = new GameMtlActionCB (pmtl);
  3011. RegisterNotification(GmaxStartupNotificationProc,NULL,NOTIFY_SYSTEM_STARTUP);
  3012. RegisterNotification(GmaxResetNotificationProc,NULL,NOTIFY_SYSTEM_POST_RESET);
  3013. RegisterNotification(GmaxPreOpenNotificationProc,NULL,NOTIFY_FILE_PRE_OPEN);
  3014. RegisterNotification(GmaxPreDeleteNotificationProc,NULL,NOTIFY_SCENE_PRE_DELETED_NODE);
  3015. RegisterNotification(GmaxPreOpenNotificationProc,NULL,NOTIFY_SYSTEM_PRE_NEW);
  3016. return pTab;
  3017. }
  3018. //============================================================================================
  3019. BOOL GameMtlActionCB::ExecuteAction(int id) {
  3020. Interface* ip = GetCOREInterface();
  3021. switch(id){
  3022. case IDA_GAMEMTL_DODLG:{
  3023. if(GMaxMaterialDialog && GMaxMaterialDialog->IsVisible()){
  3024. return TRUE;// Already displayed
  3025. }
  3026. HWND hParent = ip->GetMAXHWnd();
  3027. bool found_gamemtl(false);
  3028. Mtl* mtl = NULL;
  3029. if(ip->GetSelNodeCount() < 1){ //No Selection
  3030. game_mtl = (GameMtl*)_GameMaterialCD.Create(FALSE);
  3031. }else{ //Selection exists
  3032. INode* node = ip->GetSelNode(0);
  3033. mtl = node->GetMtl();
  3034. if(NULL == mtl){// Node has no mtl
  3035. game_mtl = (GameMtl*)_GameMaterialCD.Create(FALSE);
  3036. }else{ //Selection has material
  3037. int n_subs = mtl->NumSubMtls() ;
  3038. if(n_subs > 0){ //MultiMtl
  3039. for(int sub_i(0); sub_i < n_subs && ! found_gamemtl; sub_i ++){
  3040. if(mtl->GetSubMtl(sub_i)->ClassID() == GameMaterialClassID){
  3041. found_gamemtl = true;
  3042. game_mtl = (GameMtl*)(mtl->GetSubMtl(sub_i));
  3043. }
  3044. }
  3045. if(! found_gamemtl){ //multiMtl but no gamemtl
  3046. game_mtl = (GameMtl*)_GameMaterialCD.Create(FALSE);
  3047. }
  3048. }else{ //single mtl
  3049. if(mtl && mtl->ClassID() == GameMaterialClassID){
  3050. game_mtl = (GameMtl*) mtl;
  3051. }else{
  3052. game_mtl = (GameMtl*)_GameMaterialCD.Create(FALSE);
  3053. }
  3054. }
  3055. }
  3056. }//
  3057. IMtlParams* mtl_params = NULL;
  3058. if(found_gamemtl){ //pass the multiMtl to the dialog
  3059. mtl_params = new FakeIMtlParams;
  3060. ((FakeIMtlParams*)mtl_params)->Multi_mtl_list = mtl;
  3061. }
  3062. if(NULL == GMaxMaterialDialog){
  3063. GMaxMaterialDialog = (GMaxMtlDlg *)game_mtl->CreateParamDlg(hParent,mtl_params);
  3064. }else{
  3065. GMaxMaterialDialog->Reset(game_mtl);
  3066. }
  3067. return TRUE;
  3068. }
  3069. }
  3070. return FALSE;
  3071. }
  3072. #endif