170 lines
5.9 KiB
C
Raw Permalink Normal View History

/*
** 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/hiersave.h 29 10/26/00 5:59p Greg_h $ */
/***********************************************************************************************
*** Confidential - Westwood Studios ***
***********************************************************************************************
* *
* Project Name : Commando / G 3D Engine *
* *
* $Archive:: /Commando/Code/Tools/max2w3d/hiersave.h $*
* *
* $Author:: Greg_h $*
* *
* $Modtime:: 10/26/00 5:09p $*
* *
* $Revision:: 29 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#ifndef HIERSAVE_H
#define HIERSAVE_H
#include "always.h"
#include <Max.h>
#include <stdio.h>
#ifndef W3D_FILE_H
#include "w3d_file.h"
#endif
#ifndef PROGRESS_H
#include "progress.h"
#endif
#ifndef CHUNKIO_H
#include "chunkio.h"
#endif
#ifndef NODELIST_H
#include "nodelist.h"
#endif
#ifndef VECTOR_H
#include "vector.h"
#endif
struct HierarchyNodeStruct
{
INode * MaxNode;
W3dPivotStruct Pivot;
W3dPivotFixupStruct Fixup;
bool operator == (const HierarchyNodeStruct & that) { return false; }
bool operator != (const HierarchyNodeStruct & that) { return !(*this == that); }
};
class HierarchySaveClass
{
public:
enum {
MATRIX_FIXUP_NONE = 0,
MATRIX_FIXUP_TRANS = 1,
MATRIX_FIXUP_TRANS_ROT = 2
};
HierarchySaveClass();
HierarchySaveClass(
INode * root,
TimeValue time,
Progress_Meter_Class & treemeter,
char * hname,
int fixup_type = MATRIX_FIXUP_NONE,
HierarchySaveClass * fixuptree = NULL);
HierarchySaveClass(
INodeListClass * rootlist,
TimeValue time,
Progress_Meter_Class & treemeter,
char * hname,
int fixup_type = MATRIX_FIXUP_NONE,
HierarchySaveClass * fixuptree = NULL,
const Matrix3 & origin_offset = Matrix3(1));
~HierarchySaveClass();
bool Save(ChunkSaveClass & csave);
bool Load(ChunkLoadClass & cload);
int Num_Nodes(void) const { return CurNode; }
const char * Get_Name(void) const;
const char * Get_Node_Name(int node) const;
// get ahold of the max inode
INode * Get_Node(int node) const;
// Returns the node's transform from object to world space
Matrix3 Get_Node_Transform(int node) const;
// Returns the node's transform relative to its parent
Matrix3 Get_Node_Relative_Transform(int node) const { return get_relative_transform(node); }
// Get the fixup matrix for the given pivot (always applied to the *relative* transform)
Matrix3 Get_Fixup_Transform(int node) const;
// Finds a node by name
int Find_Named_Node(const char * name) const;
// Get the coordinate system to use when exporting the given INode. Note that this
// function takes into account the multiple skeletons present when exporting LOD models.
void Get_Export_Coordinate_System(INode * node,int * set_bone_index,INode ** set_bone_node,Matrix3 * set_transform);
// Turning on terrian mode will cause all HTrees to force all normal meshes to be
// attached to the RootTransform regardless of the status of their 'Export_Transform' flag
static void Enable_Terrain_Optimization(bool onoff) { TerrainModeEnabled = onoff; }
private:
enum { MAX_PIVOTS = 4096, DEFAULT_NODE_ARRAY_SIZE = 512, NODE_ARRAY_GROWTH_SIZE = 32 };
TimeValue CurTime;
W3dHierarchyStruct HierarchyHeader;
DynamicVectorClass<HierarchyNodeStruct> Node;
int CurNode;
int FixupType;
Matrix3 OriginOffsetTransform; // this transform makes a node relative to the origin
HierarchySaveClass * FixupTree;
static bool TerrainModeEnabled;
void add_tree(INode * node,int pidx);
int add_node(INode * node,int pidx);
bool save_header(ChunkSaveClass & csave);
bool save_pivots(ChunkSaveClass & csave);
bool save_fixups(ChunkSaveClass & csave);
bool load_header(ChunkLoadClass & cload);
bool load_pivots(ChunkLoadClass & cload);
bool load_fixups(ChunkLoadClass & cload);
Matrix3 get_relative_transform(int nodeidx) const;
Matrix3 fixup_matrix(const Matrix3 & src) const;
void Free(void);
};
#endif /*HIERSAVE_H*/