81static char _string1[512];
85#define MIN_AABTREE_POLYGONS 8
86#define DIFFUSE_HOUSECOLOR_TEXTURE_PREFIX 0x4443485A
87#define DIFFUSE_COLOR_TEXTURE_PREFIX 0x44434d5A
88#define DIFFUSE_COLOR_TEXTURE_MASK 0x4443005A
97 float det = tm[0][0] * (tm[1][1]*tm[2][2] - tm[1][2]*tm[2][1]);
98 det -= tm[0][1] * (tm[1][0]*tm[2][2] - tm[1][2]*tm[2][0]);
99 det += tm[0][2] * (tm[1][0]*tm[2][1] - tm[1][1]*tm[2][0]);
236 char * container_name,
238 const Mesh * input_mesh,
244 unsigned int * materialColors,
245 int &numMaterialColors,
247 char *materialColorTexture,
251 ExportOptions(exportoptions),
253 ExportSpace(exportspace),
256 VertInfluences(
NULL),
257 MaterialRemapTable(
NULL)
259 Mesh mesh = *input_mesh;
260 Mtl * nodemtl = inode->GetMtl();
261 DWORD wirecolor = inode->GetWireColor();
270 }
else if (nodemtl->IsMultiMtl()) {
271 for (
int i = 0; i < nodemtl->NumSubMtls(); i++) {
272 Mtl *sub = nodemtl->GetSubMtl(i);
285 Matrix3 objtm = MaxINode->GetObjectTM(curtime);
293 MeshToExportSpace = objtm *
Inverse(ExportSpace);
294 prep_mesh(mesh,MeshToExportSpace);
299 assert(mesh_name !=
NULL);
300 assert(container_name !=
NULL);
302 memset(&Header,0,
sizeof(Header));
320 if (mesh.getNumFaces() <= 0) {
321 throw ErrorClass(
"No Triangles in Mesh: %s",Header.MeshName);
324 if (mesh.getNumVerts() <= 0) {
325 throw ErrorClass(
"No Vertices in Mesh: %s",Header.MeshName);
332 scan_used_materials(mesh,nodemtl);
333 create_materials(nodemtl,wirecolor,materialColorTexture);
352 Builder.Set_World_Info (world_info);
353 Build_Mesh(mesh, nodemtl, materialColors, numMaterialColors, numHouseColors);
355 if (materialColorTexture)
358 fix_diffuse_materials(numHouseColors != 0);
364 Object *ref_obj = MaxINode->GetObjectRef ();
365 DeformSave.Initialize(Builder, ref_obj, mesh, &MeshToExportSpace);
370 if (ExportOptions.Is_Vertex_Alpha_Enabled()) {
371 unsigned int alpha_passes = 0;
372 for (
int pass=0; pass < MaterialDesc.Pass_Count(); pass++) {
373 if (MaterialDesc.Pass_Uses_Vertex_Alpha(pass)) {
374 alpha_passes |= (1 << pass);
377 DeformSave.Set_Alpha_Passes(alpha_passes);
383 Header.NumTris = Builder.Get_Face_Count();
384 Header.NumVertices = Builder.Get_Vertex_Count();
390 compute_bounding_volumes();
398 compute_physical_constants(MaxINode,voxelmeter,
false );
411 MaxINode->GetUserPropBuffer(usertext);
412 CStr usertext8 = usertext;
414 if (usertext8.Length() > 0) {
415 UserText =
new char[usertext8.Length() + 1];
416 memset(UserText,0,usertext8.Length() + 1);
417 memcpy(UserText,usertext8.data(),usertext8.Length());
440 if (VertInfluences) {
441 delete[] VertInfluences;
442 VertInfluences =
NULL;
445 if (MaterialRemapTable) {
446 delete[] MaterialRemapTable;
447 MaterialRemapTable =
NULL;
452void getMaterialUV(UVVert &tvert,
unsigned int diffuse,
unsigned int *materialColors,
int &numMaterialColors,
int &numHouseColors,
bool house)
460 if (materialColors[i]==diffuse)
462 tvert.x=((double)(i%16)+0.5)/16.0;
463 tvert.y=1.0-((double)(i/16)+0.5)/16.0;
469 ExportLog::printf(
"\nUndefined House Color %d,%d,%d",(diffuse>>16)&0xff,(diffuse>>8)&0xff,diffuse&0xff);
473 for (i=16; i<(16+numMaterialColors); i++)
475 if (materialColors[i]==diffuse)
477 tvert.x=((double)(i%16)+0.5)/16.0;
478 tvert.y=1.0-((double)(i/16)+0.5)/16.0;
484 tvert.x=((double)(i%16)+0.5)/16.0;
485 tvert.y=1.0-((double)(i/16)+0.5)/16.0;
487 materialColors[i]=diffuse;
491void MeshSaveClass::Build_Mesh(Mesh & mesh, Mtl *node_mtl,
unsigned int *materialColors,
int &numMaterialColors,
int &numHouseColors)
498 int firstSolidColoredMaterial=-1;
500 Builder.Reset(
true,mesh.getNumFaces(),mesh.getNumFaces()/3);
509 bool is_skin =
false;
510 SkinDataClass * skindata =
NULL;
511 SkinWSMObjectClass * skinobj =
NULL;
513 get_skin_modifier_objects(&skindata,&skinobj);
518 is_skin = ((skindata !=
NULL) && (skinobj !=
NULL));
524 MeshBuilderClass::FaceClass face;
525 for (face_index = 0; face_index < mesh.getNumFaces(); face_index++) {
527 Face maxface = mesh.faces[face_index];
530 if (Header.NumMaterials > 0) {
531 mat_index = MaterialRemapTable[(maxface.getMatID() % Header.NumMaterials)];
533 assert(mat_index != -1);
535 for (pass=0; pass<MaterialDesc.Pass_Count(); pass++) {
536 face.
ShaderIndex[pass] = MaterialDesc.Get_Shader_Index(mat_index,pass);
538 face.
TextureIndex[pass][stage] = MaterialDesc.Get_Texture_Index(mat_index,pass,stage);
547 face.
SmGroup = maxface.getSmGroup();
550 face.
Index = face_index;
557 Mtl *mtl_to_use = node_mtl;
558 if ((node_mtl !=
NULL) && (node_mtl->NumSubMtls() > 1)) {
559 mtl_to_use = node_mtl->GetSubMtl (maxface.getMatID() % node_mtl->NumSubMtls());
564 face.
SurfaceType = ((GameMtl *)mtl_to_use)->Get_Surface_Type ();
567 for (vert_counter = 0; vert_counter < 3; vert_counter++) {
575 int max_vert_counter;
578 max_vert_counter = 2 - vert_counter;
580 max_vert_counter = vert_counter;
583 int max_vert_index = maxface.v[max_vert_counter];
588 face.
Verts[vert_counter].
Id = max_vert_index;
593 face.
Verts[vert_counter].
Position.
X = mesh.verts[max_vert_index].x;
594 face.
Verts[vert_counter].
Position.
Y = mesh.verts[max_vert_index].y;
595 face.
Verts[vert_counter].
Position.
Z = mesh.verts[max_vert_index].z;
600 for (
int pass=0; pass < MaterialDesc.Pass_Count(); pass++) {
601 if (MaterialDesc.Pass_Uses_Vertex_Alpha(pass)) {
603 face.
Verts[vert_counter].
Alpha[pass] = vdata[max_vert_index] * .01;
617 for (pass=0; pass<MaterialDesc.Pass_Count(); pass++) {
623 UVVert tvert(0.0,0.0,0.0);
625 W3dVertexMaterialStruct *vmat=MaterialDesc.Get_Vertex_Material(mat_index, pass);
627 W3dMapClass *map3d=MaterialDesc.Get_Texture(mat_index,pass,stage);
637 if (strnicmp(MaterialDesc.Get_Vertex_Material_Name(mat_index,pass),
"HouseColor",10)==0)
644 if (firstSolidColoredMaterial == -1)
645 firstSolidColoredMaterial=MaterialDesc.Get_Vertex_Material_Index(mat_index,pass);
654 int channel = MaterialDesc.Get_Map_Channel(mat_index,pass,stage);
656 UVVert * uvarray = mesh.mapVerts(channel);
657 TVFace * tvfacearray = mesh.mapFaces(channel);
660 W3dMapClass *map3d=MaterialDesc.Get_Texture(mat_index,pass,stage);
662 if (map3d && (uvarray !=
NULL) && (tvfacearray !=
NULL)) {
664 int tvert_index = tvfacearray[face_index].t[max_vert_counter];
665 tvert = uvarray[tvert_index];
686 int max_cvert_index = mesh.vcFace[face_index].t[max_vert_counter];
689 vc = mesh.vertCol[max_cvert_index];
699 if (ExportOptions.Is_Vertex_Alpha_Enabled()) {
701 float alpha = (vc.x + vc.y + vc.z) / 3.0f;
702 for (
int pass=0; pass < MaterialDesc.Pass_Count(); pass++) {
703 if (MaterialDesc.Pass_Uses_Vertex_Alpha(pass)) {
722 for (pass = 0; pass<MaterialDesc.Pass_Count(); pass++) {
725 W3dMapClass *map3d=MaterialDesc.Get_Texture(mat_index,pass,0);
741 int skin_bone_index = skindata->
VertData[max_vert_index].BoneIdx[0];
744 if ( (skin_bone_index != -1) &&
745 (skin_bone_index < skinobj->Num_Bones()) &&
748 face.
Verts[vert_counter].
BoneIndex = get_htree_bone_index_for_inode(skinobj->
BoneTab[skin_bone_index]);
753 Builder.Add_Face(face);
759 Builder.Build_Mesh(
true);
761 const MeshBuilderClass::MeshStatsStruct & stats = Builder.Get_Mesh_Stats();
762 int vcount = Builder.Get_Vertex_Count();
763 int pcount = mesh.numFaces;
764 float vert_poly_ratio = (float)vcount / (
float)pcount;
788 *skin_data_ptr =
NULL;
789 *skin_obj_ptr =
NULL;
792 for (
int i = 0; i < MaxINode->NumRefs(); i++) {
794 ReferenceTarget *refTarg = MaxINode->GetReference(i);
797 if (refTarg !=
NULL && refTarg->ClassID() == Class_ID(WSM_DERIVOB_CLASS_ID,0)) {
799 IDerivedObject * wsm_der_obj = (IDerivedObject *)refTarg;
802 for (
int j = 0; j < wsm_der_obj->NumModifiers(); j++) {
803 Modifier * mod = wsm_der_obj->GetModifier(j);
807 SkinModifierClass * skinmod = (SkinModifierClass *)mod;
808 ModContext * mc = wsm_der_obj->GetModContext(j);
809 *skin_data_ptr = (SkinDataClass *)(mc->localData);
830int MeshSaveClass::get_htree_bone_index_for_inode(INode * node)
835 int bindex = HTree->Find_Named_Node(w3dname);
859void MeshSaveClass::inv_deform_mesh()
863 VertInfluences =
new W3dVertInfStruct[Builder.Get_Vertex_Count()];
864 memset(VertInfluences,0,
sizeof(W3dVertInfStruct) * Builder.Get_Vertex_Count());
867 for (
int vert_index = 0; vert_index < Builder.Get_Vertex_Count(); vert_index++) {
869 MeshBuilderClass::VertClass & vert = Builder.Get_Vertex(vert_index);
876 VertInfluences[vert_index].BoneIdx = 0;
885 Matrix3 bonetm = HTree->Get_Node_Transform(vert.
BoneIndex);
886 Matrix3 invbonetm =
Inverse(bonetm);
893 pos = pos * invbonetm;
907 norm = norm * invbonetm;
913 VertInfluences[vert_index].BoneIdx = vert.
BoneIndex;
941 if (write_header(csave) != 0) {
945 if (write_user_text(csave) != 0) {
949 if (write_verts(csave) != 0) {
953 if (write_vert_normals(csave) != 0) {
957 if (write_triangles(csave) != 0) {
961 if (write_vert_influences(csave) != 0) {
965 if (write_vert_shade_indices(csave) != 0) {
969 if (write_material_info(csave) != 0) {
973 if (write_vertex_materials(csave) != 0) {
977 if (PS2Material ==
TRUE) {
980 if (write_ps2_shaders(csave) != 0) {
985 if (write_shaders(csave) != 0) {
990 if (write_textures(csave) != 0) {
994 for (
int pass=0; pass<MaterialDesc.Pass_Count(); pass++) {
995 if (write_pass(csave,pass) != 0) {
1000 if (DeformSave.Export (csave) !=
true) {
1004 if (export_aabtree ==
true) {
1005 if (write_aabtree(csave) != 0) {
1037 if (csave.
Write(&Header,
sizeof(W3dMeshHeader3Struct)) !=
sizeof(W3dMeshHeader3Struct)) {
1063 if (UserText ==
NULL) {
1072 if (csave.
Write(UserText,strlen(UserText) + 1) != strlen(UserText) + 1) {
1103 assert(Builder.Get_Vertex_Count() > 0);
1104 assert(Builder.Get_Vertex_Count() == (
int)Header.NumVertices);
1106 for (
int i=0; i<Builder.Get_Vertex_Count(); i++) {
1108 const MeshBuilderClass::VertClass & vert = Builder.Get_Vertex(i);
1112 assert(vert.
Position.
X <= Header.Max.X);
1113 assert(vert.
Position.
Y <= Header.Max.Y);
1114 assert(vert.
Position.
Z <= Header.Max.Z);
1116 assert(vert.
Position.
X >= Header.Min.X);
1117 assert(vert.
Position.
Y >= Header.Min.Y);
1118 assert(vert.
Position.
Z >= Header.Min.Z);
1161 for (
int i=0; i < Builder.Get_Vertex_Count(); i++) {
1163 const MeshBuilderClass::VertClass & vert = Builder.Get_Vertex(i);
1167 if (ExportOptions.Is_ZNormals_Enabled()) {
1207 (VertInfluences ==
NULL)) {
1215 int count = Builder.Get_Vertex_Count();
1216 if (csave.
Write(VertInfluences,count *
sizeof(W3dVertInfStruct)) != count *
sizeof(W3dVertInfStruct)) {
1246 assert(Builder.Get_Face_Count() == (
int)Header.NumTris);
1247 for (
int i=0; i<Builder.Get_Face_Count(); i++) {
1249 const MeshBuilderClass::FaceClass & face = Builder.Get_Face(i);
1252 memset(&tri,0,
sizeof(W3dTriStruct));
1266 if (csave.
Write(&tri,
sizeof(W3dTriStruct)) !=
sizeof(W3dTriStruct)) {
1278int MeshSaveClass::write_vert_shade_indices(
ChunkSaveClass & csave)
1286 for (
int i=0; i < Builder.Get_Vertex_Count(); i++) {
1288 const MeshBuilderClass::VertClass & vert = Builder.Get_Vertex(i);
1292 if (csave.
Write(&(shade_index),
sizeof(shade_index)) !=
sizeof(shade_index)) {
1310 W3dMaterialInfoStruct matinfo;
1311 matinfo.
PassCount = MaterialDesc.Pass_Count();
1313 matinfo.
ShaderCount = MaterialDesc.Shader_Count();
1316 if (csave.
Write(&matinfo,
sizeof(matinfo)) !=
sizeof(matinfo)) {
1328 if (MaterialDesc.Vertex_Material_Count() <= 0)
return 0;
1335 for (
int i=0; i<MaterialDesc.Vertex_Material_Count(); i++) {
1340 const char * name = MaterialDesc.Get_Vertex_Material_Name(i);
1343 if (csave.
Write(name,strlen(name) + 1) != strlen(name) + 1) {
1350 W3dVertexMaterialStruct * vmat = MaterialDesc.Get_Vertex_Material(i);
1352 if (csave.
Write(vmat,
sizeof(W3dVertexMaterialStruct)) !=
sizeof(W3dVertexMaterialStruct)) {
1358 const char * args = MaterialDesc.Get_Mapper_Args(i, 0);
1361 if (csave.
Write(args,strlen(args) + 1) != strlen(args) + 1) {
1366 args = MaterialDesc.Get_Mapper_Args(i, 1);
1369 if (csave.
Write(args,strlen(args) + 1) != strlen(args) + 1) {
1386 assert(MaterialDesc.Shader_Count() > 0);
1388 if (PS2Material ==
TRUE) {
1392 setup_PC_shaders_from_PS2_shaders();
1399 W3dShaderStruct * shader;
1401 for (
int i=0; i<MaterialDesc.Shader_Count(); i++) {
1402 shader = MaterialDesc.Get_Shader(i);
1403 if (csave.
Write(shader,
sizeof(W3dShaderStruct)) !=
sizeof(W3dShaderStruct)) {
1431 W3dShaderStruct *shader;
1432 W3dPS2ShaderStruct ps2shader;
1434 for (
int i=0; i<MaterialDesc.Shader_Count(); i++) {
1435 shader = MaterialDesc.Get_Shader(i);
1484 if (csave.
Write(&ps2shader,
sizeof(W3dPS2ShaderStruct)) !=
sizeof(W3dPS2ShaderStruct)) {
1496void MeshSaveClass::setup_PC_shaders_from_PS2_shaders()
1499 W3dShaderStruct *shader;
1501 for (
int i=0; i<MaterialDesc.Shader_Count(); i++) {
1502 shader = MaterialDesc.Get_Shader(i);
1543 if (MaterialDesc.Texture_Count() <= 0)
return 0;
1550 for (
int i=0; i<MaterialDesc.Texture_Count(); i++) {
1552 W3dMapClass * map = MaterialDesc.Get_Texture(i);
1564 if (csave.
Write(map->
AnimInfo,
sizeof(W3dTextureInfoStruct)) !=
sizeof(W3dTextureInfoStruct))
return 1;
1580 assert(pass < MaterialDesc.Pass_Count());
1586 const MeshBuilderClass::MeshStatsStruct & stats = Builder.Get_Mesh_Stats();
1589 write_vertex_material_ids(csave,pass);
1593 write_shader_ids(csave,pass);
1596 if (stats.
HasDiffuseColor[pass] || DeformSave.Does_Deformer_Modify_DCG ()) {
1597 write_dcg(csave,pass);
1601 write_texture_stage(csave,pass,stage);
1610int MeshSaveClass::write_vertex_material_ids(
ChunkSaveClass & csave,
int pass)
1612 const MeshBuilderClass::MeshStatsStruct & stats = Builder.Get_Mesh_Stats();
1621 for (
int i=0; i<Builder.Get_Vertex_Count(); i++) {
1622 matid = Builder.Get_Vertex(i).VertexMaterialIndex[pass];
1626 matid = Builder.Get_Vertex(0).VertexMaterialIndex[pass];
1636int MeshSaveClass::write_shader_ids(
ChunkSaveClass & csave,
int pass)
1638 const MeshBuilderClass::MeshStatsStruct & stats = Builder.Get_Mesh_Stats();
1646 for (
int i=0; i<Builder.Get_Face_Count(); i++) {
1647 shaderid = Builder.Get_Face(i).ShaderIndex[pass];
1651 shaderid = Builder.Get_Face(0).ShaderIndex[pass];
1663 const MeshBuilderClass::MeshStatsStruct & stats = Builder.Get_Mesh_Stats();
1669 for (
int i=0; i<Builder.Get_Vertex_Count(); i++) {
1670 Vector3 vcolor = Builder.Get_Vertex(i).DiffuseColor[pass];
1671 W3dRGBAStruct color;
1672 color.
R = (
uint8)(255.0f * vcolor.
X);
1673 color.
G = (
uint8)(255.0f * vcolor.
Y);
1674 color.
B = (
uint8)(255.0f * vcolor.
Z);
1676 float a = Builder.Get_Vertex(i).Alpha[pass];
1677 color.
A = (
uint8)(255.0f * a);
1679 if (csave.
Write(&(color),
sizeof(W3dRGBAStruct)) !=
sizeof(W3dRGBAStruct)) {
1690int MeshSaveClass::write_texture_stage(
ChunkSaveClass & csave,
int pass,
int stage)
1692 const MeshBuilderClass::MeshStatsStruct & stats = Builder.Get_Mesh_Stats();
1693 if (!stats.
HasTexture[pass][stage])
return 0;
1699 write_texture_ids(csave,pass,stage);
1700 write_texture_coords(csave,pass,stage);
1709int MeshSaveClass::write_texture_ids(
ChunkSaveClass & csave,
int pass,
int stage)
1711 const MeshBuilderClass::MeshStatsStruct & stats = Builder.Get_Mesh_Stats();
1719 for (
int i=0; i<Builder.Get_Face_Count(); i++) {
1720 texid = Builder.Get_Face(i).TextureIndex[pass][stage];
1724 texid = Builder.Get_Face(0).TextureIndex[pass][stage];
1734int MeshSaveClass::write_texture_coords(
ChunkSaveClass & csave,
int pass,
int stage)
1736 const MeshBuilderClass::MeshStatsStruct & stats = Builder.Get_Mesh_Stats();
1737 if (stats.
HasTexCoords[pass][stage] ==
false)
return 0;
1743 for (
int i=0; i<Builder.Get_Vertex_Count(); i++) {
1744 W3dTexCoordStruct tex;
1745 tex.
U = Builder.Get_Vertex(i).TexCoord[pass][stage].X;
1746 tex.
V = Builder.Get_Vertex(i).TexCoord[pass][stage].Y;
1748 if (csave.
Write(&(tex),
sizeof(W3dTexCoordStruct)) !=
sizeof(W3dTexCoordStruct)) {
1772 int vertcount = Builder.Get_Vertex_Count();
1773 int polycount = Builder.Get_Face_Count();
1774 Vector3 * verts =
new Vector3[vertcount];
1775 Vector3i * polys =
new Vector3i[polycount];
1777 for (
int vi=0; vi<vertcount; vi++) {
1778 verts[vi] = Builder.Get_Vertex(vi).Position;
1781 for (
int pi=0; pi<polycount; pi++) {
1782 polys[pi].
I = Builder.Get_Face(pi).VertIdx[0];
1783 polys[pi].
J = Builder.Get_Face(pi).VertIdx[1];
1784 polys[pi].
K = Builder.Get_Face(pi).VertIdx[2];
1790 AABTreeBuilderClass aabtree_builder;
1791 aabtree_builder.
Build_AABTree(polycount,polys,vertcount,verts);
1792 aabtree_builder.
Export(csave);
1804int MeshSaveClass::scan_used_materials(Mesh & mesh,Mtl * nodemtl)
1809 if ((nodemtl ==
NULL) || (nodemtl->NumSubMtls() <= 1)) {
1811 MaterialRemapTable =
new int[1];
1812 MaterialRemapTable[0] = 0;
1817 int sub_mtl_count = nodemtl->NumSubMtls();
1818 MaterialRemapTable =
new int[sub_mtl_count];
1821 for (mat_index=0; mat_index<sub_mtl_count; mat_index++) {
1822 MaterialRemapTable[mat_index] = -1;
1826 for (face_index=0; face_index<mesh.getNumFaces(); face_index++) {
1827 int max_mat_index = mesh.faces[face_index].getMatID();
1828 int mat_index = (max_mat_index % sub_mtl_count);
1829 MaterialRemapTable[mat_index] = 1;
1834 for (mat_index=0; mat_index<sub_mtl_count; mat_index++) {
1835 if (MaterialRemapTable[mat_index] == 1) {
1836 MaterialRemapTable[mat_index] = matcount;
1841 assert(matcount > 0);
1851 tmap = mtl->GetSubTexmap(ID_DI);
1867 return (tmap && tmap->ClassID() == Class_ID(BMTEX_CLASS_ID,0));
1872int MeshSaveClass::getNumSolidMaterials(Mtl * nodemtl)
1877 if ((nodemtl ==
NULL) || (nodemtl->NumSubMtls() <= 1))
1885 int sub_mtl_count = nodemtl->NumSubMtls();
1887 for (mat_index=0; mat_index<sub_mtl_count; mat_index++)
1889 if (MaterialRemapTable[mat_index] != -1)
1903void MeshSaveClass::fix_diffuse_materials(
bool isHouseColor)
1906 char materialColorFilename[_MAX_FNAME + 1];
1908 for (
int mat_index=0; mat_index<MaterialDesc.Material_Count(); mat_index++)
1910 for (
int pass=0; pass<MaterialDesc.Pass_Count(); pass++)
1912 W3dVertexMaterialStruct *vmat=MaterialDesc.Get_Vertex_Material(mat_index,pass);
1916 W3dMapClass *map3d=MaterialDesc.Get_Texture(mat_index,pass,stage);
1923 if (isHouseColor && *(map3d->
Filename+1) !=
'H')
1926 sprintf(materialColorFilename,
"%s%s",
"ZHCD",map3d->
Filename+4);
1948void MeshSaveClass::create_materials(Mtl * nodemtl,
DWORD wirecolor,
char *materialColorTexture)
1964 Header.NumMaterials = 1;
1966 W3dVertexMaterialStruct vmat;
1967 W3dShaderStruct shader;
1968 W3dMaterialClass material;
1995 MaterialDesc.Add_Material(material);
1997 assert(MaterialDesc.Material_Count() == 1);
1999 }
else if (!nodemtl) {
2002 Header.NumMaterials = 1;
2004 W3dVertexMaterialStruct vmat;
2005 W3dShaderStruct shader;
2006 W3dMaterialClass material;
2011 vmat.
Diffuse.
R = GetRValue(wirecolor);
2012 vmat.
Diffuse.
G = GetGValue(wirecolor);
2013 vmat.
Diffuse.
B = GetBValue(wirecolor);
2019 MaterialDesc.Add_Material(material,
"WireColor");
2020 assert(MaterialDesc.Material_Count() == 1);
2022 }
else if (!nodemtl->IsMultiMtl()) {
2024 Header.NumMaterials = 1;
2025 W3dMaterialClass mat;
2028 mat.
Init(nodemtl,materialColorTexture);
2033 err = MaterialDesc.Add_Material(mat,nodemtl->GetName());
2035 sprintf(_string1,
"Exporting Materials for Mesh: %s\nMaterial %s is multi-pass and transparent\nMulti-pass transparent materials are not allowed.\n",
2037 nodemtl->GetName());
2039 throw ErrorClass(_string1);
2041 assert(MaterialDesc.Material_Count() == 1);
2045 Header.NumMaterials = nodemtl->NumSubMtls();
2046 W3dMaterialClass mat;
2048 for (
unsigned mi = 0; mi < Header.NumMaterials; mi++) {
2051 if (MaterialRemapTable[mi] != -1) {
2054 mat.
Init(nodemtl->GetSubMtl(mi),materialColorTexture);
2056 mat.
Init(nodemtl->GetSubMtl(mi),
NULL);
2061 name = nodemtl->GetSubMtl(mi)->GetName();
2062 err = MaterialDesc.Add_Material(mat,name);
2065 sprintf(_string1,
"Exporting Materials for Mesh: %s\nMaterial %s has %d passes.\nThe other materials have %d passes.\nAll Materials must have the same number of passes.\n",
2067 nodemtl->GetSubMtl(mi)->GetName(),
2069 MaterialDesc.Pass_Count());
2071 throw ErrorClass(_string1);
2074 sprintf(_string1,
"Exporting Materials for Mesh: %s\nMaterial %s is multi-pass and transparent\nMulti-pass transparent materials are not allowed.\n",
2076 nodemtl->GetSubMtl(mi)->GetName());
2077 throw ErrorClass(_string1);
2080 sprintf(_string1,
"Exporting Materials for Mesh: %s\nMaterial %s does not have the same Static Sort Level as other materials used on the mesh.\nAll materials for a mesh must use the same Static Sort Level value.\n",
2082 nodemtl->GetSubMtl(mi)->GetName());
2084 throw ErrorClass(_string1);
2091 Header.SortLevel = MaterialDesc.Get_Sort_Level();
2106void MeshSaveClass::compute_bounding_volumes(
void)
2111 Builder.Compute_Bounding_Box(&
min,&
max);
2112 Builder.Compute_Bounding_Sphere(¢er,&radius);
2114 Header.SphCenter.X = center.
X;
2115 Header.SphCenter.Y = center.
Y;
2116 Header.SphCenter.Z = center.
Z;
2117 Header.SphRadius = radius;
2119 Header.Min.X =
min.X;
2120 Header.Min.Y =
min.Y;
2121 Header.Min.Z =
min.Z;
2122 Header.Max.X =
max.X;
2123 Header.Max.Y =
max.Y;
2124 Header.Max.Z =
max.Z;
2140void MeshSaveClass::compute_physical_constants
2153 AnyINodeFilter nodefilt;
2154 INodeListClass meshlist(CurTime,&nodefilt);
2155 meshlist.Insert(inode);
2158 VoxelClass * voxel =
new VoxelClass
2168 VoxelDebugWindowClass dbgwin(voxel);
2169 dbgwin.Display_Window();
2178 Header.Volume = (float)vol[0];
2180 Header.MassCenter.X = (float)cm[0];
2181 Header.MassCenter.Y = (float)cm[1];
2182 Header.MassCenter.Z = (float)cm[2];
2184 Header.Inertia[0] = (float)inertia[0];
2185 Header.Inertia[1] = (float)inertia[1];
2186 Header.Inertia[2] = (float)inertia[2];
2187 Header.Inertia[3] = (float)inertia[3];
2188 Header.Inertia[4] = (float)inertia[4];
2189 Header.Inertia[5] = (float)inertia[5];
2190 Header.Inertia[6] = (float)inertia[6];
2191 Header.Inertia[7] = (float)inertia[7];
2192 Header.Inertia[8] = (float)inertia[8];
2197 Header.MassCenter.X = (Header.Max.X + Header.Min.X) / 2.0f;
2198 Header.MassCenter.Y = (Header.Max.Y + Header.Min.Y) / 2.0f;
2199 Header.MassCenter.Z = (Header.Max.Z + Header.Min.Z) / 2.0f;
2203 Header.Inertia[0] = 1.0f;
2204 Header.Inertia[1] = 0.0f;
2205 Header.Inertia[2] = 0.0f;
2206 Header.Inertia[3] = 0.0f;
2207 Header.Inertia[4] = 1.0f;
2208 Header.Inertia[5] = 0.0f;
2209 Header.Inertia[6] = 0.0f;
2210 Header.Inertia[7] = 0.0f;
2211 Header.Inertia[8] = 1.0f;
2213 Header.Volume = (Header.Max.X - Header.Min.X) * (Header.Max.Y - Header.Min.Y) * (Header.Max.Z - Header.Min.Z);
2232void MeshSaveClass::prep_mesh(Mesh & mesh,
Matrix3 & objoff)
2238 for (vert_index = 0; vert_index < mesh.getNumVerts (); vert_index++) {
2239 mesh.verts[vert_index] = mesh.verts[vert_index] * objoff;
2243 mesh.buildNormals();
#define ALPHA_VERTEX_CHANNEL
int W3d_Shader_Get_Depth_Compare(const W3dPS2ShaderStruct *s)
void W3d_Shader_Reset(W3dShaderStruct *s)
int W3d_Shader_Get_PS2_Param_D(const W3dShaderStruct *s)
int W3d_Shader_Get_Pri_Gradient(const W3dPS2ShaderStruct *s)
#define W3D_MESH_FLAG_COLLISION_TYPE_PHYSICAL
int W3d_Shader_Get_PS2_Param_B(const W3dShaderStruct *s)
#define W3D_MESH_FLAG_GEOMETRY_TYPE_MASK
#define W3D_MESH_FLAG_COLLISION_TYPE_VIS
#define W3D_MESH_FLAG_TWO_SIDED
void W3d_Shader_Set_Dest_Blend_Func(W3dShaderStruct *s, int val)
@ W3DSHADER_PRIGRADIENT_MODULATE
@ W3DSHADER_DEPTHCOMPARE_PASS_LESS
@ W3DSHADER_SRCBLENDFUNC_SRC_ALPHA
@ W3DSHADER_DESTBLENDFUNC_ONE_MINUS_SRC_ALPHA
@ W3DSHADER_DEPTHCOMPARE_PASS_NEVER
@ W3DSHADER_DEPTHCOMPARE_PASS_ALWAYS
@ W3DSHADER_DEPTHCOMPARE_PASS_LEQUAL
#define OBSOLETE_W3D_MESH_FLAG_GEOMETRY_TYPE_SHADOW
#define W3D_MESH_FLAG_NONE
#define W3D_MESH_FLAG_COLLISION_TYPE_PROJECTILE
#define W3D_MESH_FLAG_COLLISION_TYPE_VEHICLE
#define W3D_MESH_FLAG_GEOMETRY_TYPE_OBBOX
int W3d_Shader_Get_PS2_Param_A(const W3dShaderStruct *s)
void W3d_Shader_Set_Pri_Gradient(W3dShaderStruct *s, int val)
void W3d_Shader_Set_Src_Blend_Func(W3dShaderStruct *s, int val)
#define W3D_MESH_FLAG_HIDDEN
#define W3D_VERTEX_CHANNEL_BONEID
#define W3D_MESH_FLAG_NPATCHABLE
IOVector3Struct W3dVectorStruct
#define W3D_MESH_FLAG_CAST_SHADOW
@ W3D_CHUNK_STAGE_TEXCOORDS
@ W3D_CHUNK_MATERIAL_PASS
@ W3D_CHUNK_VERTEX_MAPPER_ARGS1
@ W3D_CHUNK_VERTEX_SHADE_INDICES
@ W3D_CHUNK_MESH_USER_TEXT
@ W3D_CHUNK_VERTEX_NORMALS
@ W3D_CHUNK_VERTEX_MATERIALS
@ W3D_CHUNK_TEXTURE_STAGE
@ W3D_CHUNK_VERTEX_MATERIAL_NAME
@ W3D_CHUNK_VERTEX_MAPPER_ARGS0
@ W3D_CHUNK_VERTEX_MATERIAL
@ W3D_CHUNK_VERTEX_INFLUENCES
@ W3D_CHUNK_VERTEX_MATERIAL_INFO
@ W3D_CHUNK_VERTEX_MATERIAL_IDS
@ W3D_CHUNK_MATERIAL_INFO
int W3d_Shader_Get_Alpha_Test(const W3dPS2ShaderStruct *s)
#define W3D_MESH_FLAG_COLLISION_TYPE_CAMERA
#define W3D_MESH_FLAG_GEOMETRY_TYPE_NORMAL
#define W3D_MESH_FLAG_SHATTERABLE
void W3d_Vertex_Material_Reset(W3dVertexMaterialStruct *vmat)
#define W3D_MESH_FLAG_GEOMETRY_TYPE_AABOX
int W3d_Shader_Get_PS2_Param_C(const W3dShaderStruct *s)
@ PSS_DEPTHCOMPARE_PASS_LESS
@ PSS_DEPTHCOMPARE_PASS_NEVER
@ PSS_PS2_PRIGRADIENT_DECAL
@ PSS_DEPTHCOMPARE_PASS_ALWAYS
@ PSS_PRIGRADIENT_HIGHLIGHT
@ PSS_PS2_PRIGRADIENT_HIGHLIGHT2
@ PSS_PS2_PRIGRADIENT_MODULATE
@ PSS_PRIGRADIENT_MODULATE
@ PSS_PRIGRADIENT_HIGHLIGHT2
@ PSS_PS2_PRIGRADIENT_HIGHLIGHT
@ PSS_DEPTHCOMPARE_PASS_LEQUAL
int W3d_Shader_Get_Depth_Mask(const W3dPS2ShaderStruct *s)
void W3d_Shader_Set_Depth_Compare(W3dShaderStruct *s, int val)
#define W3D_MESH_FLAG_GEOMETRY_TYPE_SKIN
#define W3D_MESH_FLAG_GEOMETRY_TYPE_CAMERA_ALIGNED
int W3d_Shader_Get_Texturing(const W3dPS2ShaderStruct *s)
#define W3D_VERTEX_CHANNEL_LOCATION
#define W3D_CURRENT_MESH_VERSION
#define W3D_FACE_CHANNEL_FACE
#define W3D_VERTEX_CHANNEL_NORMAL
#define W3D_MESH_FLAG_GEOMETRY_TYPE_CAMERA_ORIENTED
void Build_AABTree(int polycount, TriIndex *polys, int vertcount, Vector3 *verts)
void Export(ChunkSaveClass &csave)
uint32 Write(const void *buf, uint32 nbytes)
bool Begin_Chunk(uint32 id)
static void printf(char *,...)
int Get_Texture_Enable(int pass, int stage)
Texmap * Get_Texture(int pass, int stage)
int ShaderIndex[MAX_PASSES]
int TextureIndex[MAX_PASSES][MAX_STAGES]
Vector3 DiffuseColor[MAX_PASSES]
int VertexMaterialIndex[MAX_PASSES]
Vector2 TexCoord[MAX_PASSES][MAX_STAGES]
MeshSaveClass(char *mesh_name, char *container_name, INode *inode, const Mesh *input_mesh, Matrix3 &exportspace, W3DAppData2Struct &exportoptions, HierarchySaveClass *htree, TimeValue curtime, Progress_Meter_Class &meter, unsigned int *materialColors, int &numMaterialColors, int &numHouseColors, char *materialColorTexture, WorldInfoClass *world_info=NULL)
int Write_To_File(ChunkSaveClass &csave, bool export_aabtrees=false)
void Finish_In_Steps(int number_of_steps)
Tab< InfluenceStruct > VertData
RefTargetHandle GetReference(int i)
void Compute_Physical_Properties(double Volume[1], double CM[3], double I[9])
void Set_Filename(const char *name)
W3dTextureInfoStruct * AnimInfo
void Set_Vertex_Material(const W3dVertexMaterialStruct &vmat, int pass=0)
void Set_Shader(const W3dShaderStruct &shader, int pass=0)
int Get_Pass_Count(void) const
void Set_Pass_Count(int count)
void Init(Mtl *mtl, char *materialColorTexture=NULL)
@ INCONSISTENT_SORT_LEVEL
Class_ID PS2GameMaterialClassID
Class_ID GameMaterialClassID
#define DIFFUSE_COLOR_TEXTURE_PREFIX
const int VOXEL_RESOLUTION
#define DIFFUSE_COLOR_TEXTURE_MASK
int isTexturedMaterial(Mtl *mtl)
uint32 setup_mesh_attributes(INode *node)
float Compute_3x3_Determinant(const Matrix3 &tm)
void getMaterialUV(UVVert &tvert, unsigned int diffuse, unsigned int *materialColors, int &numMaterialColors, int &numHouseColors, bool house)
#define MIN_AABTREE_POLYGONS
bool use_simple_rendering(int geo_type)
WWINLINE Quaternion Inverse(const Quaternion &a)
#define SKIN_MOD_CLASS_ID
bool HasVertexMaterial[MAX_PASSES]
bool HasPerPolyTexture[MAX_PASSES][MAX_STAGES]
bool HasTexture[MAX_PASSES][MAX_STAGES]
bool HasDiffuseColor[MAX_PASSES]
bool HasPerPolyShader[MAX_PASSES]
bool HasTexCoords[MAX_PASSES][MAX_STAGES]
bool HasShader[MAX_PASSES]
bool HasPerVertexMaterial[MAX_PASSES]
uint32 VertexMaterialCount
void Set(uint8 r, uint8 g, uint8 b)
void Set_W3D_Name(char *set_name, const char *src)
bool Is_Collision_OBBox(INode *node)
bool Is_Hidden(INode *node)
bool Is_Shatterable(INode *node)
bool Is_Camera_Oriented_Mesh(INode *node)
bool Is_Camera_Aligned_Mesh(INode *node)
bool Is_Skin(INode *node)
bool Is_Projectile_Collision(INode *node)
bool Is_Collision_AABox(INode *node)
bool Is_Two_Sided(INode *node)
bool Is_Vis_Collision(INode *node)
bool Is_Camera_Collision(INode *node)
bool Is_NPatchable(INode *node)
bool Is_Physical_Collision(INode *node)
bool Is_Shadow(INode *node)
bool Is_Vehicle_Collision(INode *node)