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/WWMath/cullsys.h

201 lines
7.1 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 : WWMath *
* *
* $Archive:: /Commando/Code/wwmath/cullsys.h $*
* *
* Author:: Greg Hjelstrom *
* *
* $Modtime:: 5/08/01 6:33p $*
* *
* $Revision:: 5 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#if defined(_MSC_VER)
#pragma once
#endif
#ifndef CULLSYS_H
#define CULLSYS_H
#include "wwdebug.h"
#include "stdlib.h"
#include "refcount.h"
#include "aabox.h"
class CullableClass;
class CullSystemClass;
class FrustumClass;
/*
** CullLinkClass
** This class will serve as a base class for the various types of linkage information
** that the Cullable instances will need. Each CullableClass will have a pointer to
** a class derived from CullLinkClass where the different culling systems can store
** things.
*/
class CullLinkClass
{
public:
WWINLINE CullLinkClass(CullSystemClass * system) { System = system; WWASSERT(System); }
virtual ~CullLinkClass(void) { WWASSERT(System == NULL); }
WWINLINE void Set_Culling_System(CullSystemClass * sys) { System = sys; }
WWINLINE CullSystemClass * Get_Culling_System(void) { return System; }
protected:
CullSystemClass * System;
};
/*
** CullableClass
** This is the base class for any object that can be inserted into a culling system
** This class provides an axis aligned bounding box and some linkage variables which
** allow it to be processed by any culling system.
*/
class CullableClass : public RefCountClass
{
public:
CullableClass(void);
virtual ~CullableClass(void);
/*
** Access to the culling box for this object. When you set the cull box, you are
** basically guaranteeing that the object is contained within the given box. The
** object will automatically be updated in whatever culling system it is currently
** contained in (if any)
*/
WWINLINE const AABoxClass & Get_Cull_Box(void) const { return CullBox; }
void Set_Cull_Box(const AABoxClass & box,bool just_loaded = false);
/*
** These functions are used by various culling systems to manage the linkage
** pointers. *The average user should NEVER call these*
*/
void Set_Culling_System(CullSystemClass * sys);
CullSystemClass * Get_Culling_System(void) const;
WWINLINE void Set_Cull_Link(CullLinkClass * c) { CullLink = c; }
WWINLINE CullLinkClass * Get_Cull_Link(void) const { return CullLink; }
private:
WWINLINE void Set_Next_Collected(CullableClass * c) { NextCollected = c; }
WWINLINE CullableClass * Get_Next_Collected(void) { return NextCollected; }
/*
** Culling Data
** Each object can be linked into various types of culling systems.
** Each culling system can use its own linkage data structure (derived
** from CullLinkClass) to keep track of the object. The CullData pointer
** will point to one of the culling link objects and NULL
** if its not in any system.
*/
CullLinkClass * CullLink;
/*
** Bounding Box
** Any objects derived from Cullable should update the bounding box
** whenever the object moves or changes size. In order to do this,
** call Set_Cull_Box...
*/
AABoxClass CullBox;
/*
** NextCollected
** This pointer is used by the culling system to keep a singly linked
** list of cullable object that have been "collected".
*/
CullableClass * NextCollected;
// Not Implemented:
CullableClass(const CullableClass & src);
CullableClass & operator = (const CullableClass & src);
friend class CullSystemClass;
};
/*
** CullSystemClass
** Base class of any culling system. This interface exists so that things can
** be shuffled around without having explicit knowledge of what system they are in.
*/
class CullSystemClass
{
public:
CullSystemClass(void);
virtual ~CullSystemClass(void);
/*
** Collect_Objects. Updates the internal collection list with the
** objects that overlap the given primitive.
** WARNING: This builds an internal list that is only valid until
** another list is built, only one list can be valid at any time.
** WARNING: Always call Reset_Collection if you want to start a
** fresh collection!
*/
void Reset_Collection(void);
virtual void Collect_Objects(const Vector3 & point) = 0;
virtual void Collect_Objects(const AABoxClass & box) = 0;
virtual void Collect_Objects(const OBBoxClass & box) = 0;
virtual void Collect_Objects(const FrustumClass & frustum) = 0;
/*
** This object has moved or changed size, update it
*/
virtual void Update_Culling(CullableClass * obj) = 0;
protected:
/*
** Iterate through the collected objects
*/
CullableClass * Get_First_Collected_Object_Internal(void);
CullableClass * Get_Next_Collected_Object_Internal(CullableClass * obj);
CullableClass * Peek_First_Collected_Object_Internal(void);
CullableClass * Peek_Next_Collected_Object_Internal(CullableClass * obj);
/*
** Build the list of collected objects
*/
void Add_To_Collection(CullableClass * obj);
/*
** Pointer to the head of the current collection of objects
*/
CullableClass * CollectionHead;
friend class CullableClass;
};
#endif