| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
- ***********************************************************************************************
- * *
- * Project Name : WW3D *
- * *
- * $Archive:: /Commando/Code/ww3d2/vertmaterial.cpp $*
- * *
- * Author:: Greg Hjelstrom *
- * *
- * $Modtime:: 2/11/02 9:38a $*
- * *
- * $Revision:: 43 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * Init -- init code *
- * Shutdown -- shutdown code *
- * Get_Preset -- retrieve presets *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "vertmaterial.h"
- #include "realcrc.h"
- #include "wwdebug.h"
- #include "w3d_util.h"
- #include "chunkio.h"
- #include "w3derr.h"
- #include "ini.h"
- #include "xstraw.h"
- #include "dx8wrapper.h"
- #include <stdio.h>
- #include <string.h>
- static unsigned int unique=1;
- VertexMaterialClass* VertexMaterialClass::Presets[VertexMaterialClass::PRESET_COUNT];
- /*
- ** VertexMaterialClass Implementation
- */
- VertexMaterialClass::VertexMaterialClass(void):
- Material(NULL),
- Flags(0),
- AmbientColorSource(D3DMCS_MATERIAL),
- EmissiveColorSource(D3DMCS_MATERIAL),
- DiffuseColorSource(D3DMCS_MATERIAL),
- UseLighting(false),
- UniqueID(0),
- CRCDirty(true)
- {
- int i;
- for (i=0; i<MeshBuilderClass::MAX_STAGES; i++)
- {
- Mapper[i]=NULL;
- UVSource[i] = i;
- }
- Material=new D3DMATERIAL8;
- memset(Material,0,sizeof(D3DMATERIAL8));
- Set_Ambient(1.0f,1.0f,1.0f);
- Set_Diffuse(1.0f,1.0f,1.0f);
- Set_Opacity(1.0f);
- }
- VertexMaterialClass::VertexMaterialClass(const VertexMaterialClass & src) :
- Material(NULL),
- Flags(src.Flags),
- AmbientColorSource(src.AmbientColorSource),
- EmissiveColorSource(src.EmissiveColorSource),
- DiffuseColorSource(src.DiffuseColorSource),
- UseLighting(src.UseLighting),
- Name(src.Name),
- UniqueID(src.UniqueID),
- CRCDirty(true)
- {
- int i;
- for (i=0; i<MeshBuilderClass::MAX_STAGES; i++)
- {
- Mapper[i]=NULL;
- if (src.Mapper[i])
- {
- TextureMapperClass *mapper=src.Mapper[i]->Clone();
- Set_Mapper(mapper,i);
- mapper->Release_Ref();
- }
- UVSource[i] = src.UVSource[i];
- }
- Material=new D3DMATERIAL8;
- memcpy(Material,src.Material,sizeof(D3DMATERIAL8));
- }
- void VertexMaterialClass::Make_Unique()
- {
- CRCDirty=true;
- UniqueID=unique;
- unique++;
- }
- VertexMaterialClass::~VertexMaterialClass(void)
- {
- int i;
- for (i=0; i<MeshBuilderClass::MAX_STAGES; i++)
- {
- if (Mapper[i])
- {
- REF_PTR_RELEASE(Mapper[i]);
- Mapper[i]=NULL;
- }
- }
- delete Material;
- }
- VertexMaterialClass & VertexMaterialClass::operator = (const VertexMaterialClass &src)
- {
- if (this != &src) {
- Name=src.Name;
- Flags = src.Flags;
- AmbientColorSource = src.AmbientColorSource;
- EmissiveColorSource = src.EmissiveColorSource;
- DiffuseColorSource = src.DiffuseColorSource;
- UseLighting=src.UseLighting;
- UniqueID=src.UniqueID;
- CRCDirty=src.CRCDirty;
- int stage;
- for (stage=0;stage<MeshBuilderClass::MAX_STAGES;++stage) {
- if (Mapper[stage] != NULL) {
- Mapper[stage]->Release_Ref();
- Mapper[stage] = NULL;
- }
- }
- for (stage=0;stage<MeshBuilderClass::MAX_STAGES;++stage) {
- if (src.Mapper[stage]) {
- TextureMapperClass *mapper = src.Mapper[stage]->Clone();
- Set_Mapper(mapper,stage);
- mapper->Release_Ref();
- }
- UVSource[stage] = src.UVSource[stage];
- }
- *Material=*src.Material;
- }
- return *this;
- }
- unsigned long VertexMaterialClass::Compute_CRC(void) const
- {
- unsigned long crc = 0;
-
- // don't include the name when determining whether two vertex materials match
- // crc = CRC_Memory(reinterpret_cast<const unsigned char *>(Name.Peek_Buffer()),sizeof(char)*strlen(Name),crc);
- crc = CRC_Memory(reinterpret_cast<const unsigned char *>(Material),sizeof(D3DMATERIAL8),crc);
- crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&Flags),sizeof(Flags),crc);
- crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&DiffuseColorSource),sizeof(DiffuseColorSource),crc);
- crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&AmbientColorSource),sizeof(AmbientColorSource),crc);
- crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&EmissiveColorSource),sizeof(EmissiveColorSource),crc);
- crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&UVSource),sizeof(UVSource),crc);
- crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&UseLighting),sizeof(UseLighting),crc);
- crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&UniqueID),sizeof(UniqueID),crc);
- int i;
- for (i=0; i<MeshBuilderClass::MAX_STAGES; i++)
- {
- if (Mapper[i]) crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&(Mapper[i])),sizeof(TextureMapperClass*),crc);
- }
- return crc;
- }
- // Ambient Get and Sets
- void VertexMaterialClass::Get_Ambient(Vector3 * set) const
- {
- assert(set);
- *set=Vector3(Material->Ambient.r,Material->Ambient.g,Material->Ambient.b);
- }
- void VertexMaterialClass::Set_Ambient(const Vector3 & color)
- {
- CRCDirty=true;
- Material->Ambient.r=color.X;
- Material->Ambient.g=color.Y;
- Material->Ambient.b=color.Z;
- }
- void VertexMaterialClass::Set_Ambient(float r,float g,float b)
- {
- CRCDirty=true;
- Material->Ambient.r=r;
- Material->Ambient.g=g;
- Material->Ambient.b=b;
- }
- // Diffuse Get and Sets
- void VertexMaterialClass::Get_Diffuse(Vector3 * set) const
- {
- assert(set);
- *set=Vector3(Material->Diffuse.r,Material->Diffuse.g,Material->Diffuse.b);
- }
- void VertexMaterialClass::Set_Diffuse(const Vector3 & color)
- {
- CRCDirty=true;
- Material->Diffuse.r=color.X;
- Material->Diffuse.g=color.Y;
- Material->Diffuse.b=color.Z;
- }
- void VertexMaterialClass::Set_Diffuse(float r,float g,float b)
- {
- CRCDirty=true;
- Material->Diffuse.r=r;
- Material->Diffuse.g=g;
- Material->Diffuse.b=b;
- }
- // Specular Get and Sets
- void VertexMaterialClass::Get_Specular(Vector3 * set) const
- {
- assert(set);
- *set=Vector3(Material->Specular.r,Material->Specular.g,Material->Specular.b);
- }
- void VertexMaterialClass::Set_Specular(const Vector3 & color)
- {
- CRCDirty=true;
- Material->Specular.r=color.X;
- Material->Specular.g=color.Y;
- Material->Specular.b=color.Z;
- }
- void VertexMaterialClass::Set_Specular(float r,float g,float b)
- {
- CRCDirty=true;
- Material->Specular.r=r;
- Material->Specular.g=g;
- Material->Specular.b=b;
- }
- // Emissive Get and Sets
- void VertexMaterialClass::Get_Emissive(Vector3 * set) const
- {
- assert(set);
- *set=Vector3(Material->Emissive.r,Material->Emissive.g,Material->Emissive.b);
- }
- void VertexMaterialClass::Set_Emissive(const Vector3 & color)
- {
- CRCDirty=true;
- Material->Emissive.r=color.X;
- Material->Emissive.g=color.Y;
- Material->Emissive.b=color.Z;
- }
- void VertexMaterialClass::Set_Emissive(float r,float g,float b)
- {
- CRCDirty=true;
- Material->Emissive.r=r;
- Material->Emissive.g=g;
- Material->Emissive.b=b;
- }
- float VertexMaterialClass::Get_Shininess(void) const
- {
- return Material->Power;
- }
- void VertexMaterialClass::Set_Shininess(float shin)
- {
- CRCDirty=true;
- Material->Power=shin;
- }
- float VertexMaterialClass::Get_Opacity(void) const
- {
- return Material->Diffuse.a;
- }
- void VertexMaterialClass::Set_Opacity(float o)
- {
- CRCDirty=true;
- Material->Diffuse.a=o;
- }
- void VertexMaterialClass::Set_Ambient_Color_Source(ColorSourceType src)
- {
- CRCDirty=true;
- switch (src)
- {
- case COLOR1: AmbientColorSource = D3DMCS_COLOR1; break;
- case COLOR2: AmbientColorSource = D3DMCS_COLOR2; break;
- default: AmbientColorSource = D3DMCS_MATERIAL; break;
- }
- }
- void VertexMaterialClass::Set_Emissive_Color_Source(ColorSourceType src)
- {
- CRCDirty=true;
- switch (src)
- {
- case COLOR1: EmissiveColorSource = D3DMCS_COLOR1; break;
- case COLOR2: EmissiveColorSource = D3DMCS_COLOR2; break;
- default: EmissiveColorSource = D3DMCS_MATERIAL; break;
- }
- }
- void VertexMaterialClass::Set_Diffuse_Color_Source(ColorSourceType src)
- {
- CRCDirty=true;
- switch (src)
- {
- case COLOR1: DiffuseColorSource = D3DMCS_COLOR1; break;
- case COLOR2: DiffuseColorSource = D3DMCS_COLOR2; break;
- default: DiffuseColorSource = D3DMCS_MATERIAL; break;
- }
- }
- VertexMaterialClass::ColorSourceType
- VertexMaterialClass::Get_Ambient_Color_Source(void)
- {
- switch(AmbientColorSource)
- {
- case D3DMCS_COLOR1: return COLOR1;
- case D3DMCS_COLOR2: return COLOR2;
- default: return MATERIAL;
- }
- }
- VertexMaterialClass::ColorSourceType
- VertexMaterialClass::Get_Emissive_Color_Source(void)
- {
- switch(EmissiveColorSource)
- {
- case D3DMCS_COLOR1: return COLOR1;
- case D3DMCS_COLOR2: return COLOR2;
- default: return MATERIAL;
- }
- }
- VertexMaterialClass::ColorSourceType
- VertexMaterialClass::Get_Diffuse_Color_Source(void)
- {
- switch(DiffuseColorSource)
- {
- case D3DMCS_COLOR1: return COLOR1;
- case D3DMCS_COLOR2: return COLOR2;
- default: return MATERIAL;
- }
- }
- void VertexMaterialClass::Set_UV_Source(int stage,int array_index)
- {
- WWASSERT(stage >= 0);
- WWASSERT(stage < MeshBuilderClass::MAX_STAGES);
- WWASSERT(array_index >= 0);
- WWASSERT(array_index < 8);
- CRCDirty=true;
- UVSource[stage] = array_index;
- }
- int VertexMaterialClass::Get_UV_Source(int stage)
- {
- WWASSERT(stage >= 0);
- WWASSERT(stage < MeshBuilderClass::MAX_STAGES);
- return UVSource[stage];
- }
- void VertexMaterialClass::Init_From_Material3(const W3dMaterial3Struct & mat3)
- {
- Vector3 tmp0,tmp1,tmp2;
-
- W3dUtilityClass::Convert_Color(mat3.DiffuseColor,&tmp0);
- W3dUtilityClass::Convert_Color(mat3.DiffuseCoefficients,&tmp1);
- tmp2.X = tmp0.X * tmp1.X;
- tmp2.Y = tmp0.Y * tmp1.Y;
- tmp2.Z = tmp0.Z * tmp1.Z;
- Set_Diffuse(tmp2);
- W3dUtilityClass::Convert_Color(mat3.SpecularColor,&tmp0);
- W3dUtilityClass::Convert_Color(mat3.SpecularCoefficients,&tmp1);
- tmp2.X = tmp0.X * tmp1.X;
- tmp2.Y = tmp0.Y * tmp1.Y;
- tmp2.Z = tmp0.Z * tmp1.Z;
- Set_Specular(tmp2);
- W3dUtilityClass::Convert_Color(mat3.EmissiveCoefficients,&tmp0);
- Set_Emissive(tmp0);
- W3dUtilityClass::Convert_Color(mat3.AmbientCoefficients,&tmp0);
- Set_Ambient(tmp0);
- Set_Shininess(mat3.Shininess);
- Set_Opacity(mat3.Opacity);
- }
- WW3DErrorType VertexMaterialClass::Load_W3D(ChunkLoadClass & cload)
- {
- char name[256];
- W3dVertexMaterialStruct vmat;
- bool hasname = false;
- char *mapping0_arg_buffer = NULL;
- char *mapping1_arg_buffer = NULL;
- unsigned int mapping0_arg_len = 0U;
- unsigned int mapping1_arg_len = 0U;
- while (cload.Open_Chunk()) {
- switch (cload.Cur_Chunk_ID()) {
- case W3D_CHUNK_VERTEX_MATERIAL_NAME:
- cload.Read(&name,cload.Cur_Chunk_Length());
- hasname = true;
- break;
- case W3D_CHUNK_VERTEX_MATERIAL_INFO:
- if (cload.Read(&vmat,sizeof(vmat)) != sizeof(vmat)) {
- return WW3D_ERROR_LOAD_FAILED;
- }
- break;
- case W3D_CHUNK_VERTEX_MAPPER_ARGS0:
- mapping0_arg_len = cload.Cur_Chunk_Length();
- mapping0_arg_buffer = new char[mapping0_arg_len];
- if (cload.Read(mapping0_arg_buffer, mapping0_arg_len) != mapping0_arg_len) {
- return WW3D_ERROR_LOAD_FAILED;
- }
- break;
- case W3D_CHUNK_VERTEX_MAPPER_ARGS1:
- mapping1_arg_len = cload.Cur_Chunk_Length();
- mapping1_arg_buffer = new char[mapping1_arg_len];
- if (cload.Read(mapping1_arg_buffer, mapping1_arg_len) != mapping1_arg_len) {
- return WW3D_ERROR_LOAD_FAILED;
- }
- break;
- };
- cload.Close_Chunk();
- }
- if (hasname) {
- Set_Name(name);
- }
- // Read an INIClass from the mapping argument buffer - this will be used
- // to initialize any special mappers used.
- INIClass mapping0_arg_ini;
- if (mapping0_arg_buffer) {
- char *extended_arg_buffer = new char[mapping0_arg_len + 10];
- sprintf(extended_arg_buffer, "[Args]\n%s", mapping0_arg_buffer);
- mapping0_arg_len = strlen(extended_arg_buffer) + 1;
- delete [] mapping0_arg_buffer;
- mapping0_arg_buffer = NULL;
- BufferStraw map_arg_buf_straw((void *)extended_arg_buffer, mapping0_arg_len);
- mapping0_arg_ini.Load(map_arg_buf_straw);
- delete [] extended_arg_buffer;
- extended_arg_buffer = NULL;
- }
- INIClass mapping1_arg_ini;
- if (mapping1_arg_buffer) {
- char *extended_arg_buffer = new char[mapping1_arg_len + 20];
- sprintf(extended_arg_buffer, "[Args]\n%s", mapping1_arg_buffer);
- mapping1_arg_len = strlen(extended_arg_buffer) + 1;
- delete [] mapping1_arg_buffer;
- mapping1_arg_buffer = NULL;
- BufferStraw map_arg_buf_straw((void *)extended_arg_buffer, mapping1_arg_len);
- mapping1_arg_ini.Load(map_arg_buf_straw);
- delete [] extended_arg_buffer;
- extended_arg_buffer = NULL;
- }
- if (vmat.Attributes & W3DVERTMAT_USE_DEPTH_CUE) {
- Set_Flag(VertexMaterialClass::DEPTH_CUE,true);
- }
- if (vmat.Attributes & W3DVERTMAT_COPY_SPECULAR_TO_DIFFUSE) {
- Set_Flag(VertexMaterialClass::COPY_SPECULAR_TO_DIFFUSE,true);
- }
- // Set up the vertex mapper. If it is one of the simple
- // ones, set the pointer to one of the global instances.
- int mapping = vmat.Attributes & W3DVERTMAT_STAGE0_MAPPING_MASK;
- switch(mapping) {
-
- case W3DVERTMAT_STAGE0_MAPPING_UV:
- break;
- case W3DVERTMAT_STAGE0_MAPPING_ENVIRONMENT:
- {
- EnvironmentMapperClass *mapper = NEW_REF(EnvironmentMapperClass,(0));
- Set_Mapper(mapper);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_CHEAP_ENVIRONMENT:
- {
- ClassicEnvironmentMapperClass *mapper = NEW_REF(ClassicEnvironmentMapperClass,(0));
- Set_Mapper(mapper);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_LINEAR_OFFSET:
- {
- LinearOffsetTextureMapperClass *mapper =
- NEW_REF(LinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
- Set_Mapper(mapper);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_SCREEN:
- {
- ScreenMapperClass *mapper =
- NEW_REF(ScreenMapperClass,(mapping0_arg_ini, "Args", 0));
- Set_Mapper(mapper);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_SCALE:
- {
- ScaleTextureMapperClass *mapper =
- NEW_REF(ScaleTextureMapperClass,(mapping0_arg_ini, "Args", 0));
- Set_Mapper(mapper);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_GRID:
- {
- GridTextureMapperClass *mapper =
- NEW_REF(GridTextureMapperClass,(mapping0_arg_ini, "Args", 0));
- Set_Mapper(mapper,0);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_ROTATE:
- {
- RotateTextureMapperClass *mapper =
- NEW_REF(RotateTextureMapperClass,(mapping0_arg_ini, "Args", 0));
- Set_Mapper(mapper,0);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_SINE_LINEAR_OFFSET:
- {
- SineLinearOffsetTextureMapperClass *mapper =
- NEW_REF(SineLinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
- Set_Mapper(mapper,0);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_STEP_LINEAR_OFFSET:
- {
- StepLinearOffsetTextureMapperClass *mapper =
- NEW_REF(StepLinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
- Set_Mapper(mapper,0);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_ZIGZAG_LINEAR_OFFSET:
- {
- ZigZagLinearOffsetTextureMapperClass *mapper =
- NEW_REF(ZigZagLinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
- Set_Mapper(mapper,0);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_WS_CLASSIC_ENV:
- {
- WSClassicEnvironmentMapperClass *mapper = NEW_REF(WSClassicEnvironmentMapperClass,(0));
- Set_Mapper(mapper,0);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_WS_ENVIRONMENT:
- {
- WSEnvironmentMapperClass *mapper = NEW_REF(WSEnvironmentMapperClass,(0));
- Set_Mapper(mapper,0);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_GRID_CLASSIC_ENV:
- {
- GridClassicEnvironmentMapperClass *mapper =
- NEW_REF(GridClassicEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
- Set_Mapper(mapper,0);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_GRID_ENVIRONMENT:
- {
- GridEnvironmentMapperClass *mapper =
- NEW_REF(GridEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
- Set_Mapper(mapper,0);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_RANDOM:
- {
- RandomTextureMapperClass *mapper =
- NEW_REF(RandomTextureMapperClass,(mapping0_arg_ini, "Args", 0));
- Set_Mapper(mapper,0);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_EDGE:
- {
- EdgeMapperClass *mapper =
- NEW_REF(EdgeMapperClass,(mapping0_arg_ini, "Args", 0));
- Set_Mapper(mapper,0);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE0_MAPPING_BUMPENV:
- {
- BumpEnvTextureMapperClass *mapper =
- NEW_REF(BumpEnvTextureMapperClass,(mapping0_arg_ini, "Args", 0));
- Set_Mapper(mapper,0);
- mapper->Release_Ref();
- }
- break;
- default:
- WWDEBUG_SAY(("Unsupported mapper in %s\n",name));
- break;
- }
- // Same setup for stage 1's mapper.
- mapping = vmat.Attributes & W3DVERTMAT_STAGE1_MAPPING_MASK;
- switch(mapping) {
- case W3DVERTMAT_STAGE1_MAPPING_UV:
- break;
- case W3DVERTMAT_STAGE1_MAPPING_ENVIRONMENT:
- {
- EnvironmentMapperClass *mapper = new EnvironmentMapperClass(1);
- Set_Mapper(mapper, 1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_CHEAP_ENVIRONMENT:
- {
- ClassicEnvironmentMapperClass *mapper = new ClassicEnvironmentMapperClass(1);
- Set_Mapper(mapper, 1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_LINEAR_OFFSET:
- {
- LinearOffsetTextureMapperClass *mapper =
- new LinearOffsetTextureMapperClass(mapping1_arg_ini, "Args", 1);
- Set_Mapper(mapper, 1);
- mapper->Release_Ref();
- }
- break;
-
- case W3DVERTMAT_STAGE1_MAPPING_SCREEN:
- {
- ScreenMapperClass *mapper =
- new ScreenMapperClass(mapping1_arg_ini, "Args", 1);
- Set_Mapper(mapper, 1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_SCALE:
- {
- ScaleTextureMapperClass *mapper =
- NEW_REF(ScaleTextureMapperClass,(mapping1_arg_ini, "Args", 1));
- Set_Mapper(mapper,1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_GRID:
- {
- GridTextureMapperClass *mapper =
- NEW_REF(GridTextureMapperClass,(mapping1_arg_ini, "Args", 1));
- Set_Mapper(mapper,1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_ROTATE:
- {
- RotateTextureMapperClass *mapper =
- NEW_REF(RotateTextureMapperClass,(mapping1_arg_ini, "Args", 1));
- Set_Mapper(mapper,1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_SINE_LINEAR_OFFSET:
- {
- SineLinearOffsetTextureMapperClass *mapper =
- NEW_REF(SineLinearOffsetTextureMapperClass,(mapping1_arg_ini, "Args", 1));
- Set_Mapper(mapper,1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_STEP_LINEAR_OFFSET:
- {
- StepLinearOffsetTextureMapperClass *mapper =
- NEW_REF(StepLinearOffsetTextureMapperClass,(mapping1_arg_ini, "Args", 1));
- Set_Mapper(mapper,1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_ZIGZAG_LINEAR_OFFSET:
- {
- ZigZagLinearOffsetTextureMapperClass *mapper =
- NEW_REF(ZigZagLinearOffsetTextureMapperClass,(mapping1_arg_ini, "Args", 1));
- Set_Mapper(mapper,1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_WS_CLASSIC_ENV:
- {
- WSClassicEnvironmentMapperClass *mapper = NEW_REF(WSClassicEnvironmentMapperClass,(1));
- Set_Mapper(mapper,1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_WS_ENVIRONMENT:
- {
- WSEnvironmentMapperClass *mapper = NEW_REF(WSEnvironmentMapperClass,(1));
- Set_Mapper(mapper,1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_GRID_CLASSIC_ENV:
- {
- GridClassicEnvironmentMapperClass *mapper =
- NEW_REF(GridClassicEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
- Set_Mapper(mapper,1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_GRID_ENVIRONMENT:
- {
- GridEnvironmentMapperClass *mapper =
- NEW_REF(GridEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
- Set_Mapper(mapper,1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_RANDOM:
- {
- RandomTextureMapperClass *mapper =
- NEW_REF(RandomTextureMapperClass,(mapping1_arg_ini, "Args", 1));
- Set_Mapper(mapper,1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_EDGE:
- {
- EdgeMapperClass *mapper =
- NEW_REF(EdgeMapperClass,(mapping1_arg_ini, "Args", 1));
- Set_Mapper(mapper,1);
- mapper->Release_Ref();
- }
- break;
- case W3DVERTMAT_STAGE1_MAPPING_BUMPENV:
- {
- BumpEnvTextureMapperClass *mapper =
- NEW_REF(BumpEnvTextureMapperClass,(mapping1_arg_ini, "Args", 1));
- Set_Mapper(mapper,1);
- mapper->Release_Ref();
- }
- break;
- default:
- WWDEBUG_SAY(("Unsupported mapper in %s\n",name));
- break;
- }
- Vector3 tmp;
- W3dUtilityClass::Convert_Color(vmat.Ambient,&tmp);
- Set_Ambient(tmp);
-
- W3dUtilityClass::Convert_Color(vmat.Diffuse,&tmp);
- Set_Diffuse(tmp);
-
- W3dUtilityClass::Convert_Color(vmat.Specular,&tmp);
- Set_Specular(tmp);
- W3dUtilityClass::Convert_Color(vmat.Emissive,&tmp);
- Set_Emissive(tmp);
- Set_Shininess(vmat.Shininess);
- Set_Opacity(vmat.Opacity);
- return WW3D_ERROR_OK;
- }
- WW3DErrorType VertexMaterialClass::Save_W3D(ChunkSaveClass & csave)
- {
- WWASSERT(0);
- return WW3D_ERROR_OK;
- }
- void VertexMaterialClass::Apply(void) const
- {
- int i;
- DX8Wrapper::Set_DX8_Material(Material);
- DX8Wrapper::Set_DX8_Render_State(D3DRS_LIGHTING,UseLighting);
- DX8Wrapper::Set_DX8_Render_State(D3DRS_AMBIENTMATERIALSOURCE,AmbientColorSource);
- DX8Wrapper::Set_DX8_Render_State(D3DRS_DIFFUSEMATERIALSOURCE,DiffuseColorSource);
- DX8Wrapper::Set_DX8_Render_State(D3DRS_EMISSIVEMATERIALSOURCE,EmissiveColorSource);
- // set to default values if no mappers
- for (i=0; i<MeshBuilderClass::MAX_STAGES; i++) {
- if (Mapper[i]) {
- Mapper[i]->Apply(UVSource[i]);
- } else {
- DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_PASSTHRU | UVSource[i]);
- DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE);
- }
- }
- }
- void VertexMaterialClass::Apply_Null(void)
- {
- int i;
- static D3DMATERIAL8 default_settings =
- {
- { 1.0f, 1.0f, 1.0f, 1.0f }, // diffuse
- { 1.0f, 1.0f, 1.0f, 1.0f }, // ambient
- { 0.0f, 0.0f, 0.0f, 0.0f }, // specular
- { 0.0f, 0.0f, 0.0f, 0.0f }, // emissive
- 1.0f // power
- };
- DX8Wrapper::Set_DX8_Render_State(D3DRS_LIGHTING,FALSE);
- DX8Wrapper::Set_DX8_Material(&default_settings);
- DX8Wrapper::Set_DX8_Render_State(D3DRS_AMBIENTMATERIALSOURCE,D3DMCS_MATERIAL);
- DX8Wrapper::Set_DX8_Render_State(D3DRS_DIFFUSEMATERIALSOURCE,D3DMCS_MATERIAL);
- DX8Wrapper::Set_DX8_Render_State(D3DRS_EMISSIVEMATERIALSOURCE,D3DMCS_MATERIAL);
- // set to default values if no mappers
- for (i=0; i<MeshBuilderClass::MAX_STAGES; i++) {
- DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_PASSTHRU | i);
- DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE);
- }
- }
- /***********************************************************************************************
- * Init -- init code *
- * *
- * *
- * *
- * *
- * INPUT: *
- * *
- * OUTPUT: *
- * *
- * WARNINGS: *
- * *
- * HISTORY: *
- * 2/14/2001 hy : Created. *
- *=============================================================================================*/
- void VertexMaterialClass::Init()
- {
- int i;
- for (i=0; i<PRESET_COUNT;i++)
- Presets[i]=NEW_REF(VertexMaterialClass,());
- // Set up presets
- Presets[PRELIT_DIFFUSE]->Set_Diffuse_Color_Source(VertexMaterialClass::COLOR1);
- Presets[PRELIT_DIFFUSE]->Set_Lighting(false);
- Presets[PRELIT_NODIFFUSE]->Set_Lighting(false);
- }
- /***********************************************************************************************
- * Shutdown -- shutdown code *
- * *
- * *
- * *
- * *
- * INPUT: *
- * *
- * OUTPUT: *
- * *
- * WARNINGS: *
- * *
- * HISTORY: *
- * 2/14/2001 hy : Created. *
- *=============================================================================================*/
- void VertexMaterialClass::Shutdown()
- {
- int i;
- for (i=0; i<PRESET_COUNT;i++)
- REF_PTR_RELEASE(Presets[i]);
- }
- /***********************************************************************************************
- * Get_Preset -- retrieve presets *
- * *
- * *
- * *
- * *
- * INPUT: *
- * *
- * OUTPUT: *
- * *
- * WARNINGS: *
- * *
- * HISTORY: *
- * 2/14/2001 hy : Created. *
- *=============================================================================================*/
- VertexMaterialClass * VertexMaterialClass::Get_Preset(PresetType type)
- {
- WWASSERT(type<PRESET_COUNT);
- Presets[type]->Add_Ref();
- return Presets[type];
- }
|