226 lines
8.1 KiB
C++
226 lines
8.1 KiB
C++
/*
|
|
** Command & Conquer Generals Zero Hour(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 44 10/30/00 1:12p 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 "MeshDeformSave.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,
|
|
unsigned int * materialColors,
|
|
int &numMaterialColors,
|
|
int &numHouseColors,
|
|
char * materialColorTexture,
|
|
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;
|
|
MeshDeformSaveClass DeformSave;
|
|
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, unsigned int *materialColors, int &numMaterialColors, int &numHouseColors);
|
|
|
|
// 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, char *materialColorTexture);
|
|
void fix_diffuse_materials(bool isHouseColor);
|
|
|
|
// count number of used solid materials (no texture)
|
|
int getNumSolidMaterials(Mtl * nodemtl);
|
|
|
|
// 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*/ |