140 lines
5.3 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/vchannel.h 8 10/30/00 6:56p Greg_h $ */
/***********************************************************************************************
*** Confidential - Westwood Studios ***
***********************************************************************************************
* *
* Project Name : Commando Tools - W3D export *
* *
* $Archive:: /Commando/Code/Tools/max2w3d/vchannel.h $*
* *
* $Author:: Greg_h $*
* *
* $Modtime:: 10/30/00 5:25p $*
* *
* $Revision:: 8 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#ifndef VCHANNEL_H
#define VCHANNEL_H
#ifndef ALWAYS_H
#include "always.h"
#endif
#ifndef BITTYPE_H
#include "bittype.h"
#endif
#ifndef CHUNKIO_H
#include "chunkio.h"
#endif
#ifndef W3D_FILE_H
#include "w3d_file.h"
#endif
class BitChannelClass;
/*
This class is a container for an array of vectors. It will keep
track of whether the entire array of vectors is zero, and if not
where the non-zero vectors begin and end.
VectorChannelClass is used in exporting motion. Motion data
is broken into separate channels for X, Y, Z, and orientation.
Then if any of the channels are empty, they don't have to be stored.
The X,Y,Z channels all contain one-dimensional vectors and the
orientation channel contains four-dimensional vectors.
*/
// for compression
#define DEFAULT_LOSSY_ERROR_TOLERANCE (0.0001)
#define PACKETS_ALL_USEFUL (0xFFFFFFFF)
class VectorChannelClass
{
public:
VectorChannelClass(uint32 id,int maxframes,uint32 flags,int vectorlength,float32 * identvec);
~VectorChannelClass(void);
void Set_Vector(int framenumber,float32 * vector);
float * Get_Vector(int frameidx);
bool Is_Empty(void) { return IsEmpty; }
void SetSaveOptions(bool compress, int flavor, float Terr, float Rerr, bool reduce, int reduce_percent);
bool Save(ChunkSaveClass & csave, BitChannelClass *binmov);
void ClearInvisibleData(BitChannelClass *vis);
private:
uint32 ID;
uint32 Flags;
int MaxFrames;
int VectorLen;
bool IsEmpty;
float32 * IdentVect;
float32 * Data;
int Begin;
int End;
// Save Options
bool ReduceAnimation;
int ReduceAnimationPercent;
bool CompressAnimation;
int CompressAnimationFlavor;
float CompressAnimationTranslationError;
float CompressAnimationRotationError;
// Write a single value
void set_value(int framenum,int vindex,float32 val);
// Read a single value
float32 get_value(int framenum,int vindex);
// Test a vector against the "identity" vector
bool is_identity(float32 * vec);
// This function finds the start and end of the "non-identity" data
void compute_range(void);
// compress functions
void compress(W3dTimeCodedAnimChannelStruct * c);
float compress(int filter_index, float scale, float value1, float *indata, unsigned char *pPacket, float *outdata);
float test_compress(int filter_index, float scale, float value1, float *indata, float *outdata);
uint32 find_useless_packet(W3dTimeCodedAnimChannelStruct * c, double tolerance);
uint32 find_useless_packetQ(W3dTimeCodedAnimChannelStruct * c, double tolerance);
uint32 find_least_useful_packet(W3dTimeCodedAnimChannelStruct *c);
uint32 find_least_useful_packetQ(W3dTimeCodedAnimChannelStruct *c);
void remove_packet(W3dTimeCodedAnimChannelStruct * c, uint32 packet_idx);
bool SaveTimeCoded(ChunkSaveClass & csave, BitChannelClass *binmov);
bool SaveAdaptiveDelta(ChunkSaveClass & csave, BitChannelClass *binmov);
};
#endif /*VCHANNEL_H*/