162 lines
5.8 KiB
C
162 lines
5.8 KiB
C
|
/*
|
||
|
** 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/>.
|
||
|
*/
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
||
|
***********************************************************************************************
|
||
|
* *
|
||
|
* Project Name : WWPhys *
|
||
|
* *
|
||
|
* $Archive:: /Commando/Code/wwmath/lookuptable.h $*
|
||
|
* *
|
||
|
* Original Author:: Greg Hjelstrom *
|
||
|
* *
|
||
|
* $Author:: Greg_h $*
|
||
|
* *
|
||
|
* $Modtime:: 4/18/00 1:20p $*
|
||
|
* *
|
||
|
* $Revision:: 6 $*
|
||
|
* *
|
||
|
*---------------------------------------------------------------------------------------------*
|
||
|
* Functions: *
|
||
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||
|
|
||
|
|
||
|
#ifndef LOOKUPTABLE_H
|
||
|
#define LOOKUPTABLE_H
|
||
|
|
||
|
#include "always.h"
|
||
|
#include "simplevec.h"
|
||
|
#include "wwstring.h"
|
||
|
#include "refcount.h"
|
||
|
#include "multilist.h"
|
||
|
#include "wwmath.h"
|
||
|
|
||
|
|
||
|
class Vector2;
|
||
|
class Curve1DClass;
|
||
|
class ChunkSaveClass;
|
||
|
class ChunkLoadClass;
|
||
|
|
||
|
|
||
|
/**
|
||
|
** LookupTableClass
|
||
|
** This class contains the tabulated values for a function.
|
||
|
*/
|
||
|
class LookupTableClass : public RefCountClass, public MultiListObjectClass
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
LookupTableClass(int sample_count = 256);
|
||
|
virtual ~LookupTableClass(void);
|
||
|
|
||
|
void Init(const char * name,Curve1DClass * curve);
|
||
|
float Get_Value(float input);
|
||
|
float Get_Value_Quick(float input);
|
||
|
const char * Get_Name(void) { return Name; }
|
||
|
protected:
|
||
|
|
||
|
StringClass Name; // name of this table, if it came from a file, this is also the filename
|
||
|
float MinInputValue;
|
||
|
float MaxInputValue;
|
||
|
float OOMaxMinusMin;
|
||
|
SimpleVecClass<float> OutputSamples;
|
||
|
|
||
|
};
|
||
|
|
||
|
inline float LookupTableClass::Get_Value(float input)
|
||
|
{
|
||
|
if (input <= MinInputValue) {
|
||
|
return OutputSamples[0];
|
||
|
}
|
||
|
if (input >= MaxInputValue) {
|
||
|
return OutputSamples[OutputSamples.Length()-1];
|
||
|
}
|
||
|
|
||
|
float normalized_input = (float)(OutputSamples.Length()-1) * (input - MinInputValue) * OOMaxMinusMin;
|
||
|
float input0 = WWMath::Floor(normalized_input);
|
||
|
|
||
|
int index0 = WWMath::Float_To_Long(input0);
|
||
|
int index1 = index0+1;
|
||
|
float lerp = normalized_input - input0;
|
||
|
|
||
|
return OutputSamples[index0] + lerp * (OutputSamples[index1] - OutputSamples[index0]);
|
||
|
}
|
||
|
|
||
|
inline float LookupTableClass::Get_Value_Quick(float input)
|
||
|
{
|
||
|
if (input <= MinInputValue) {
|
||
|
return OutputSamples[0];
|
||
|
}
|
||
|
if (input >= MaxInputValue) {
|
||
|
return OutputSamples[OutputSamples.Length()-1];
|
||
|
}
|
||
|
|
||
|
int index = (OutputSamples.Length()-1) * WWMath::Float_To_Long((input - MinInputValue) * OOMaxMinusMin);
|
||
|
return OutputSamples[index];
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
** LookupTableMgrClass
|
||
|
** This class tracks all of the LookupTableClass's that have been loaded or installed.
|
||
|
** LookupTables can be created using the "SimpleGraph" tool. It basically allows you
|
||
|
** to edit a curve which will be used to generate the table. These curves are stored
|
||
|
** in .TBL files.
|
||
|
**
|
||
|
** NOTE: Use the SimpleGraph program to create lookup tables! Then just ask for them
|
||
|
** by filename and it will load the table for you (unless it is already loaded).
|
||
|
**
|
||
|
** NOTE: I add a table called "DefaultTable" so that you can revert to that if
|
||
|
** your table isn't found.
|
||
|
*/
|
||
|
class LookupTableMgrClass
|
||
|
{
|
||
|
public:
|
||
|
LookupTableMgrClass(void);
|
||
|
~LookupTableMgrClass(void);
|
||
|
|
||
|
// init and shutdown are automatically called from WWMath::Init, WWMath::Shutdown...
|
||
|
static void Init(void);
|
||
|
static void Shutdown(void);
|
||
|
|
||
|
static bool Add_Table(LookupTableClass * table);
|
||
|
static bool Remove_Table(LookupTableClass * table);
|
||
|
static LookupTableClass * Get_Table(const char * name,bool try_to_load = true);
|
||
|
|
||
|
static void Save_Table_Desc( ChunkSaveClass & csave,
|
||
|
Curve1DClass * curve,
|
||
|
const Vector2 & min,
|
||
|
const Vector2 & max );
|
||
|
|
||
|
static void Load_Table_Desc( ChunkLoadClass & cload,
|
||
|
Curve1DClass ** curve_ptr,
|
||
|
Vector2 * set_min = NULL,
|
||
|
Vector2 * set_max = NULL );
|
||
|
|
||
|
static void Reset(void);
|
||
|
|
||
|
protected:
|
||
|
|
||
|
static RefMultiListClass<LookupTableClass> Tables;
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif // LOOKUPTABLE_H
|