| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- /*
- ** 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/staticaabtreecull.h $*
- * *
- * Original Author:: Greg Hjelstrom *
- * *
- * $Author:: Greg_h $*
- * *
- * $Modtime:: 4/19/01 2:41p $*
- * *
- * $Revision:: 5 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #if defined(_MSC_VER)
- #pragma once
- #endif
- #ifndef STATICAABTREECULL_H
- #define STATICAABTREECULL_H
- #include "always.h"
- #include "physaabtreecull.h"
- #include "wwdebug.h"
- #include "physlist.h"
- class VisTableClass;
- class CameraClass;
- class VisRenderContextClass;
- class VisSampleClass;
- class ChunkLoadClass;
- class ChunkSaveClass;
- /*
- ** StaticAABTreeCullClass
- ** This is a derived axis-aligned bounding box tree for culling static objects.
- ** It adds the visibility code to the basic AAB-Tree culling system
- */
- class StaticAABTreeCullClass : public PhysAABTreeCullClass
- {
- public:
- StaticAABTreeCullClass(PhysicsSceneClass * pscene);
- ~StaticAABTreeCullClass(void);
- /*
- ** StaticAABTreeCullClass over-rides the add and remove methods in order to add
- ** vis-data support.
- ** NOTE: the objects added should be derived from StaticPhysClass's. This is
- ** asserted internally.
- */
- virtual void Add_Object(PhysClass * obj,int cull_node_id = -1);
- virtual void Remove_Object(PhysClass * obj);
- virtual void Update_Culling(CullableClass * obj);
- /*
- ** PhysAABTreeCullClass adds a new collect function which takes the pvs data
- ** into account. It also puts objects into one of two lists, separating
- ** world-space-meshes from the other objects.
- */
- void Collect_Visible_Objects( const FrustumClass & frustum,
- VisTableClass * pvs,
- RefPhysListClass & visobjlist,
- RefPhysListClass & wsmeshlist );
- /*
- ** Save/Load system.
- */
- virtual void Save_Static_Data(ChunkSaveClass & csave);
- virtual void Load_Static_Data(ChunkLoadClass & cload);
-
- protected:
- /*
- ** VisObjCollectContextClass - this object is passed into the recursive function that collects
- ** the visible objects each frame.
- */
- class VisObjCollectContextClass
- {
- public:
- VisObjCollectContextClass
- (
- const FrustumClass & frustum,
- VisTableClass & pvs,
- RefPhysListClass & visobjlist,
- RefPhysListClass & wsmeshlist
- ) :
- Frustum(frustum),
- PVS(pvs),
- VisObjList(visobjlist),
- WSMeshList(wsmeshlist),
- PlanesPassed(0)
- {
- }
-
- const FrustumClass & Frustum;
- VisTableClass & PVS;
- RefPhysListClass & VisObjList;
- RefPhysListClass & WSMeshList;
- int PlanesPassed;
- };
- /*
- ** Run-time visiblity support
- */
- void Collect_Visible_Objects_Recursive(AABTreeNodeClass * node,VisObjCollectContextClass & context);
- void Collect_Visible_Objects_No_HVis_Recursive(AABTreeNodeClass * node,VisObjCollectContextClass & context);
- int Get_Vis_Sector_ID(const Vector3 & sample_point);
- StaticPhysClass * Find_Vis_Tile(const Vector3 & sample_point);
- /*
- ** Visibility Preprocessing support
- */
- void Assign_Vis_IDs(void);
-
- void Evaluate_Occluder_Visibility(VisRenderContextClass & context,VisSampleClass & sample);
- void Evaluate_Non_Occluder_Visibility(VisRenderContextClass & context,VisSampleClass & sample);
-
- void Render_Occluders(AABTreeNodeClass * node,VisRenderContextClass & context);
- void Collect_Non_Occluders(AABTreeNodeClass * node,VisRenderContextClass & context,RefPhysListClass & non_occluder_list);
- void Propogate_Hierarchical_Visibility(VisTableClass * pvs);
- void Propogate_Hierarchical_Visibility_Recursive(AABTreeNodeClass * node,VisTableClass * pvs);
- bool Is_Child_Visible(AABTreeNodeClass * node,VisTableClass * pvs);
- /*
- ** Visibility Optimization support (preprocessing still)
- */
- void Merge_Vis_Object_IDs(uint32 id0,uint32 id1);
- void Merge_Vis_Sector_IDs(uint32 id0,uint32 id1);
- /*
- ** Making Physics Scene a friend so that some of the more ugly vis-system interfaces
- ** can be accessed by it without exposing them to everyone else...
- */
- friend class PhysicsSceneClass;
- };
- #endif //STATICAABTREECULL_H
|