Files
firestorm/Gameleap/code/mw4/Libraries/Compost/FeatureGrid.hpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

353 lines
9.9 KiB
C++

#pragma once
#include "Compost.hpp"
#include "FeaturePool.hpp"
namespace Compost
{
struct FeatureInstance {
unsigned char StatFlags,Tag;
FeatureInstance() {
feature = NULL; feature_x_pos = feature_z_pos = 0;
texture_x_pos = texture_z_pos = 0;
currentTexturePtr = NULL; currentMask0Ptr = NULL; currentMask1Ptr = NULL;
StatFlags=0;
Tag=0;
}
void
LoadInstance(
Stuff::MemoryStream *stream,
FeaturePool*,
int version
);
void
SaveInstance(
Stuff::MemoryStream *stream, int xoffset=0, int zoffset=0
);
void
LoadInstance(
Stuff::Page *inst_page,
FeaturePool*,
int version
);
void
SaveInstance(
Stuff::Page *inst_page,int xoffset=0,int zoffset=0
);
bool
CalculateCurrentPtr(int, int, int=0);
int GetTextureXPos() {return texture_x_pos;}
int GetTextureZPos() {return texture_z_pos;}
void SetTextureXPos( unsigned short x) {texture_x_pos=x;}
void SetTextureZPos( unsigned short z) {texture_z_pos=z;}
// void
// AdvanceCurrentPtr();
Feature *feature;
FeatureInstance&
operator=(FeatureInstance&);
// position in pixel %256(&0xff) = position in tile, /256(>>8) tile
int feature_x_pos, feature_z_pos;
int texture_x_pos, texture_z_pos;
int position;
unsigned char *currentTexturePtr;
int countDownToBorder;
unsigned char *currentMask0Ptr;
int mask0_x_off, mask0_z_off;
unsigned char *currentMask1Ptr;
int mask1_x_off, mask1_z_off;
};
struct EdgeListPlug {
EdgeListPlug();
~EdgeListPlug();
bool
AddUp(FeatureInstance*, int row, int column, int gridSize=256);
int x_pos_start;
int x_pos_end;
int z_pos;
int count;
FeatureInstance *featureInstance;
bool key;
EdgeListPlug *next;
EdgeListPlug *prev;
};
struct ActiveEdgeListPlug {
ActiveEdgeListPlug () { elp = NULL; counter = 0; next = NULL; prev = NULL; }
EdgeListPlug *elp;
int counter;
ActiveEdgeListPlug *next;
ActiveEdgeListPlug *prev;
};
struct TextureHolder
{
TextureHolder() {
handle = -1; textureHandle = -1; priority = NULL; flags = Free; lastLine = -1;
elp = NULL; nextLineElp = NULL;
aelp = NULL; aelp_ptr = NULL; taelp = NULL;
pix_dest = NULL;
#ifdef LAB_ONLY
borderKey = false; borderColor = 0;
#endif
#ifdef _ARMOR
queuePosition = -1;
#endif
#ifdef _DEBUG
row = -1;
column = -1;
#endif
}
bool
ShutDown();
int handle;
int textureHandle;
BYTE *priority;
enum TextureHolderState {
Free = 0,
InWork = 1,
Done = 2
};
int flags;
int lastLine;
int linesToProcess;
EdgeListPlug *elp;
EdgeListPlug *nextLineElp;
ActiveEdgeListPlug *aelp;
ActiveEdgeListPlug *aelp_ptr;
ActiveEdgeListPlug *taelp;
unsigned char *pix_dest;
int pitch;
#ifdef _ARMOR
int queuePosition;
#endif
#ifdef LAB_ONLY
DWORD borderColor;
bool borderKey;
#endif
#ifdef _DEBUG
int row, column;
#endif
};
class TerrainTextureLogistic;
class FeatureGrid
{
friend class TerrainTextureLogistic;
public:
FeatureGrid(int, int, FeaturePool*, bool=false);
FeatureGrid(Stuff::MemoryStream *stream, FeaturePool*);
FeatureGrid(Stuff::NotationFile *note_file, FeaturePool*);
~FeatureGrid();
void
LoadGrid(
Stuff::MemoryStream *stream
);
void
SaveGrid(
Stuff::MemoryStream *stream,int xoffset=0,int zoffset=0
);
void
LoadGrid(
Stuff::NotationFile *stream
);
void
SaveGrid(
Stuff::NotationFile *stream,int xoffset=0,int zoffset=0
);
FeatureInstance *
Add(Feature*, unsigned short x_pos, unsigned short z_pos);
void
Remove(FeatureInstance*);
void
RedoFeaturePosition();
bool
ComposeGrid(int row, int column, unsigned char *dest, int downSample=0, int type=0);
bool
ComposeGrid(int row, int column, TextureHolder*, int downSample=0, int type=0);
int
GetRows()
{ return rows; }
int
GetColumns()
{ return columns; }
Stuff::DynamicArrayOf<FeatureInstance*>*
GetGridElement(int row, int column)
{ return &featureInstance[row*columns+column]; }
int
ShootRay(unsigned short x, unsigned short z);
int
ShootRectangle(
Stuff::DynamicArrayOf<FeatureInstance*>& list,
unsigned short x,
unsigned short z,
unsigned short width,
unsigned short height
);
static unsigned char depthColors[16][3];
void
LoadGridFromUnique();
void
LoadGridFromUnique(int row, int column);
void
LoadEdgeListFromGrid();
FeatureInstance*
GetCollectedNr(int nr)
{ return rayCollect[nr]; }
int
CountFeature(FeatureInstance *fI) { return CountFeature(fI->feature); }
int
CountFeature(Feature*);
const Stuff::DynamicArrayOf<FeatureInstance*> *
GetUniqueFeatureInstances(int& count)
{ count = used; return &uniqueFeatureInstance; }
int
GetGridSize() {return gridSize;}
int
GetGridShift() {return gridSizeShift;}
protected:
int
gridSize, gridSizeShift;
inline void
AddToRayCollect(FeatureInstance*, unsigned short&);
inline void
DeleteFromRayCollect(FeatureInstance*, unsigned short&);
inline void
AddToActiveEdgeList(ActiveEdgeListPlug**, EdgeListPlug*);
static void Blend555_1(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_TH(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_M0H(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_TH_M0H(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_TH(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_M0H(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_TH_M0H(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_M1H(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_TH_M1H(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_M0H_M1H(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_TH_M0H_M1H(FeatureInstance*, unsigned char*, int, int, int=0);
static void BlendSM(FeatureInstance*, unsigned char*, int, int, int=0);
static void BlendSM_M0H(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend4444(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend4444_TH(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_1(FeatureInstance*, unsigned char*, int, int, int, int, int=0);
static void Blend555_1_1_TH(FeatureInstance*, unsigned char*, int, int, int, int, int=0);
static void Blend555_1_1_M0H(FeatureInstance*, unsigned char*, int, int, int, int, int=0);
static void Blend555_1_1_TH_M0H(FeatureInstance*, unsigned char*, int, int, int, int, int=0);
static void Blend555_1_S(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_S_TH(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_S_M0H(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_S_TH_M0H(FeatureInstance*, unsigned char*, int, int, int=0);
static void BlendSS(FeatureInstance*, unsigned char*, int, int, int=0);
//============================================================================================================
static void Blend555_1_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_TH_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_M0H_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_TH_M0H_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_TH_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_M0H_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_TH_M0H_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_M1H_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_TH_M1H_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_M0H_M1H_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_2_TH_M0H_M1H_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void BlendSM_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void BlendSM_M0H_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend4444_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend4444_TH_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_1_MAT(FeatureInstance*, unsigned char*, int, int, int, int, int=0);
static void Blend555_1_1_TH_MAT(FeatureInstance*, unsigned char*, int, int, int, int, int=0);
static void Blend555_1_1_M0H_MAT(FeatureInstance*, unsigned char*, int, int, int, int, int=0);
static void Blend555_1_1_TH_M0H_MAT(FeatureInstance*, unsigned char*, int, int, int, int, int=0);
static void Blend555_1_S_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_S_TH_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_S_M0H_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void Blend555_1_S_TH_M0H_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
static void BlendSS_MAT(FeatureInstance*, unsigned char*, int, int, int=0);
//============================================================================================================
int rows, columns;
FeaturePool* featurePool;
FeatureInstance* rayCollect[MAX_NUMBER_LAYERS];
int max, used;
Stuff::DynamicArrayOf<FeatureInstance*> uniqueFeatureInstance;
Stuff::DynamicArrayOf<FeatureInstance*> *featureInstance;
Stuff::DynamicArrayOf<EdgeListPlug*> edgeList;
};
}