/* ** Command & Conquer Generals(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 . */ /*********************************************************************************************** *** Confidential - Westwood Studios *** *********************************************************************************************** * * * Project Name : Commando / G 3D engine * * * * File Name : MeshDeformSet.h * * * * Programmer : Patrick Smith * * * * Start Date : 04/26/99 * * * * Last Update : * * *---------------------------------------------------------------------------------------------* * Functions: * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #ifndef __MESH_DEFORM_SET_H #define __MESH_DEFORM_SET_H #include #include "Vector.H" #include "MeshDeformDefs.H" // Forward declarations class MeshDeformSaveSetClass; class MeshBuilderClass; /////////////////////////////////////////////////////////////////////////// // // MeshDeformSetClass // /////////////////////////////////////////////////////////////////////////// class MeshDeformSetClass { public: ////////////////////////////////////////////////////////////////////// // Public data types ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Public constructors/destructors ////////////////////////////////////////////////////////////////////// MeshDeformSetClass (void) : m_pMesh (NULL), m_pVertexArray (NULL), m_pVertexOPStartArray (NULL), m_pVertexColors (NULL), m_VertexColorCount (0), m_State (0), m_CurrentKeyFrame (0), m_bAutoApply (true), m_VertexCount (0) { Init_Key_Frames (); } virtual ~MeshDeformSetClass (void); ////////////////////////////////////////////////////////////////////// // Public methods ////////////////////////////////////////////////////////////////////// //virtual LocalModData * Clone (void) { return new MeshDeformSetClass; } void Update_Mesh (TriObject &tri_obj); void Set_State (float state); // Inline accessors Mesh * Peek_Mesh (void) const { return m_pMesh; } const Point3 * Peek_Orig_Vertex_Array (void) const { return m_pVertexArray; } Point3 * Peek_Vertex_OPStart_Array (void) const { return m_pVertexOPStartArray; } VertColor * Peek_Vertex_Colors (void) const { return m_pVertexColors; } // Keyframe managment void Set_Current_Key_Frame (int index); int Get_Current_Key_Frame (void) const { return m_CurrentKeyFrame; } void Update_Key_Frame (int key_frame); void Update_Current_Data (void); void Update_Set_Members (void); void Collapse_Keyframe_Data (int keyframe); void Reset_Key_Frame_Verts (int keyframe); void Reset_Key_Frame_Colors (int keyframe); // Data managment void Set_Vertex_Position (int index, const Point3 &value); void Set_Vertex_Color (int index, int color_index, const VertColor &value); // Set managment void Select_Members (void); void Update_Members (DEFORM_CHANNELS flags); void Restore_Members (void); // Auto apply bool Does_Set_Auto_Apply (void) const { return m_bAutoApply; } void Auto_Apply (bool auto_apply = true) { m_bAutoApply = auto_apply; } // Information bool Is_Empty (void) const; int Get_Vertex_Count (int keyframe) const { return m_KeyFrames[keyframe]->verticies.Count (); } int Get_Color_Count (int keyframe) const { return m_KeyFrames[keyframe]->colors.Count (); } const VERT_INFO & Get_Vertex_Data (int keyframe, int index) const { return m_KeyFrames[keyframe]->verticies[index]; } const VERT_INFO & Get_Color_Data (int keyframe, int index) const { return m_KeyFrames[keyframe]->colors[index]; } // Persistent storage IOResult Save (ISave *save_obj); IOResult Load (ILoad *load_obj); void Save (MeshBuilderClass &builder, Mesh &mesh, MeshDeformSaveSetClass &save_set, Matrix3 *transform = NULL); protected: ////////////////////////////////////////////////////////////////////// // Protected methods ////////////////////////////////////////////////////////////////////// void Resize_Vertex_Array (int count, int color_count); void Copy_Vertex_Array (Mesh &mesh); // Keyframe methods void Init_Key_Frames (void); void Free_Key_Frames (void); void Determine_Interpolation_Indicies (int key_frame, bool position, int &from, int &to, float &state); // Deformation application methods void Apply_Position_Changes (UINT vert, int frame_to_check, Point3 &position, Matrix3 *transform = NULL); void Apply_Color_Changes (UINT vert, int frame_to_check, Mesh &mesh); void Apply_Color_Changes (UINT vert_index, UINT vert_color_index, int frame_to_check, VertColor &color); private: ////////////////////////////////////////////////////////////////////// // Private data types ////////////////////////////////////////////////////////////////////// typedef struct { DEFORM_LIST verticies; DEFORM_LIST colors; BitArray affected_verts; BitArray affected_colors; } KEY_FRAME; typedef DynamicVectorClass KEY_FRAME_LIST; ////////////////////////////////////////////////////////////////////// // Private member data ////////////////////////////////////////////////////////////////////// Mesh * m_pMesh; Point3 * m_pVertexArray; Point3 * m_pVertexOPStartArray; VertColor * m_pVertexColors; int m_VertexCount; int m_VertexColorCount; int m_CurrentKeyFrame; float m_State; bool m_bAutoApply; // Array representing which verticies are part of the set BitArray m_SetMembers; // List of key frames KEY_FRAME_LIST m_KeyFrames; }; #endif //__MESH_DEFORM_DATA_H