GameMtl.cpp 121 KB

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