| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- /*
- ** 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/>.
- */
- /* $Header: /Commando/Code/Tools/max2w3d/meshsave.h 45 1/28/02 3:47p Greg_h $ */
- /***********************************************************************************************
- *** Confidential - Westwood Studios ***
- ***********************************************************************************************
- * *
- * Project Name : Commando / G *
- * *
- * File Name : MESHSAVE.H *
- * *
- * Programmer : Greg Hjelstrom *
- * *
- * Start Date : 06/10/97 *
- * *
- * Last Update : June 10, 1997 [GH] *
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #if defined(_MSC_VER)
- #pragma once
- #endif
- #ifndef MESHSAVE_H
- #define MESHSAVE_H
- #include "rawfile.h" // have to include this before Max.h
- #include <Max.h>
- #include "bittype.h"
- #include "w3d_file.h"
- #include "chunkio.h"
- #include "progress.h"
- #include "nodelist.h"
- #include "util.h"
- #include "w3dmtl.h"
- #include "meshbuild.h"
- #include "w3dappdata.h"
- class HierarchySaveClass;
- class MeshConnectionsClass;
- class MeshSaveClass;
- class SkinDataClass;
- /*******************************************************************************************
- **
- ** VertStruct
- **
- *******************************************************************************************/
- struct VertStruct
- {
- Point3 Vertex;
- Point3 Normal;
- Point2 TexCoord;
- Color Color;
- uint32 MaxVertIdx; // index of the MAX vertex that this vert came from
- uint32 MaxFaceIdx; // index of the MAX face that this vert came from
- VertStruct * Next; // used by the hash table...
- };
- /*******************************************************************************************
- **
- ** FaceStruct
- **
- *******************************************************************************************/
- struct FaceStruct
- {
- uint32 MaxVidx[3]; // original 3ds-MAX vertex index (for smoothing computations)
- uint32 OurVidx[3]; // vertex, vertex normal, and texture coord indices
- uint32 MaterialIdx; // material index
- uint32 SmGroup; // smoothing group (not really needed, normals pre-calced)
- Point3 Normal; // Face normal
- float32 Dist; // Plane distance
- uint32 Attributes; // collision flags, sort method, etc
- };
- /*******************************************************************************************
- **
- ** MeshSaveClass - this is the big one, create meshes and skins from a MAX mesh.
- **
- *******************************************************************************************/
- class MeshSaveClass
- {
- public:
- enum {
- EX_UNKNOWN = 0, // exception error codes
- EX_CANCEL = 1
- };
- 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,
- WorldInfoClass * world_info = NULL
- );
- ~MeshSaveClass(void);
- int Write_To_File(ChunkSaveClass & csave,bool export_aabtrees = false);
- private:
-
- INode * MaxINode;
- W3DAppData2Struct & ExportOptions;
- W3dMeshHeader3Struct Header;
- W3dMaterialDescClass MaterialDesc;
- MeshBuilderClass Builder;
- TimeValue CurTime;
- Matrix3 ExportSpace;
- Matrix3 MeshToExportSpace;
- Matrix3 PivotSpace;
- HierarchySaveClass * HTree;
- char * UserText;
- bool MeshInverted; // this flag indicates that the transform is inverting this mesh
- W3dVertInfStruct * VertInfluences;
- int * MaterialRemapTable; // reindexes mtl_idx after un-used mtls are removed
- // Flag set if the mesh uses a PS2 material.
- int PS2Material;
- private:
-
- // Use a MeshBuilderClass to process the mesh
- void Build_Mesh(Mesh & mesh, Mtl *node_mtl);
- // compute properties for the mesh
- void compute_bounding_volumes(void);
- void compute_physical_constants(INode * inode,Progress_Meter_Class & meter,bool voxelize);
- // create the materials
- int scan_used_materials(Mesh & mesh, Mtl * nodemtl);
- void create_materials(Mtl * nodemtl,DWORD wirecolor);
- // creating damage stages
- void add_damage_stage(MeshSaveClass * damage_mesh);
-
- // methods used in building the wtm file
- int write_header(ChunkSaveClass & csave);
- int write_user_text(ChunkSaveClass & csave);
- int write_verts(ChunkSaveClass & csave);
- int write_vert_normals(ChunkSaveClass & csave);
- int write_vert_influences(ChunkSaveClass & csave);
- int write_vert_shade_indices(ChunkSaveClass & csave);
-
- int write_triangles(ChunkSaveClass & csave);
-
- int write_material_info(ChunkSaveClass & csave);
- int write_shaders(ChunkSaveClass & csave);
- int write_vertex_materials(ChunkSaveClass & csave);
- int write_textures(ChunkSaveClass & csave);
- int write_pass(ChunkSaveClass & csave,int pass);
- int write_vertex_material_ids(ChunkSaveClass & csave,int pass);
- int write_shader_ids(ChunkSaveClass & csave,int pass);
- int write_dcg(ChunkSaveClass & csave,int pass);
-
- int write_texture_stage(ChunkSaveClass & csave,int pass,int stage);
- int write_texture_ids(ChunkSaveClass & csave,int pass,int stage);
- int write_texture_coords(ChunkSaveClass & csave,int pass,int stage);
- int write_aabtree(ChunkSaveClass & csave);
- // transforms mesh so that it uses the desired coordinate system
- void prep_mesh(Mesh & mesh,Matrix3 & objoff);
- // inverse deform the mesh so that its ready to be used as a skin!
- void get_skin_modifier_objects(SkinDataClass ** skin_data_ptr,SkinWSMObjectClass ** skin_obj_ptr);
- int get_htree_bone_index_for_inode(INode * node);
- void inv_deform_mesh(void);
- // get rendering settings for the materials
- void customize_materials(void);
- // Write the ps2 shaders and approximate them as close as possible in the W3D shaders.
- int write_ps2_shaders(ChunkSaveClass & csave);
- // Make the PC shader emulate the PS2 shader.
- void setup_PC_shaders_from_PS2_shaders();
- friend class DamageClass;
- };
- #endif /*MESHSAVE_H*/
|