This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/wwphys/vistable.h

174 lines
No EOL
5.6 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/wwphys/vistable.h $*
* *
* Author:: Greg Hjelstrom *
* *
* $Modtime:: 8/13/00 11:43a $*
* *
* $Revision:: 16 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#if defined(_MSC_VER)
#pragma once
#endif
#ifndef VISTABLE_H
#define VISTABLE_H
#include "vector.h"
#include "bittype.h"
#include "refcount.h"
#include "multilist.h"
#include "wwdebug.h"
class ChunkLoadClass;
class ChunkSaveClass;
class CompressedVisTableClass;
/*
** VisTableClass
** This is a bit vector which contains a bit for each static node in the world indicating
** whether that node can be seen from the current "vis-sector"
*/
class VisTableClass : public RefCountClass, public MultiListObjectClass
{
public:
VisTableClass(unsigned bitcount,int id);
VisTableClass(CompressedVisTableClass * ctable,int bitcount,int id);
VisTableClass(const VisTableClass & that);
~VisTableClass(void);
VisTableClass & operator = (const VisTableClass & that);
int Get_Bit_Count(void) const { return BitCount; }
void Reset_All(void);
void Set_All(void);
int Get_Bit(int i) const;
void Set_Bit(int i,bool onoff);
void Delete_Bit(int i);
void Merge(const VisTableClass & that);
void Invert(void);
bool Is_Equal_To(const VisTableClass & that);
int Count_Differences(const VisTableClass & that);
int Count_True_Bits(void);
float Match_Fraction(const VisTableClass & that);
void Set_Vis_Sector_ID(int id) { VisSectorID = id; }
int Get_Vis_Sector_ID(void) { return VisSectorID; }
void Set_Time_Stamp(int timestamp) { Timestamp = timestamp; }
int Get_Time_Stamp(void) const { return Timestamp; }
protected:
void Alloc_Buffer(int bitcount);
int Get_Byte_Count(void) const;
int Get_Long_Count(void) const;
uint8 * Get_Bytes(void) const;
uint32 * Get_Longs(void) const;
int BitCount;
uint32 * Buffer;
int VisSectorID;
int Timestamp;
// Not implemented:
bool operator == (const VisTableClass & that);
friend class CompressedVisTableClass;
};
/*
** CompressedVisTableClass
** This is the form that pvs data is stored in memory when it is not being used. It
** is basically a wrapper around an allocated array with functions to compress and
** decompress to/from a VisTableClass and functions for saving and loading.
*/
class CompressedVisTableClass
{
public:
CompressedVisTableClass(void);
CompressedVisTableClass(VisTableClass * bits);
CompressedVisTableClass(const CompressedVisTableClass &that);
~CompressedVisTableClass(void);
const CompressedVisTableClass &operator= (const CompressedVisTableClass &that);
void Load(void* hfile);
void Save(void* hfile);
void Load(ChunkLoadClass & cload);
void Save(ChunkSaveClass & csave);
protected:
int Get_Byte_Count(void) const;
uint8 * Get_Bytes(void);
void Compress(uint8 * src_buffer,int src_size);
void Decompress(uint8 * decomp_buffer,int decomp_size);
int BufferSize;
uint8 * Buffer;
// Not implemented:
bool operator == (const CompressedVisTableClass & that);
friend class VisTableClass;
};
inline int VisTableClass::Get_Bit(int i) const
{
WWASSERT(Buffer != NULL);
WWASSERT(i < BitCount);
return (Buffer[i>>5] & (0x80000000u >> (i & 0x1F)));
}
inline void VisTableClass::Set_Bit(int i,bool onoff)
{
WWASSERT(Buffer != NULL);
WWASSERT(i < BitCount);
if (onoff) {
Buffer[i>>5] |= (0x80000000u >> (i & 0x01F));
} else {
Buffer[i>>5] &= ~(0x80000000u >> (i & 0x01F));
}
}
#endif