/*
** Command & Conquer Generals(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 .
*/
////////////////////////////////////////////////////////////////////////////////
// //
// (c) 2001-2003 Electronic Arts Inc. //
// //
////////////////////////////////////////////////////////////////////////////////
// FILE: W3DScene.h ///////////////////////////////////////////////////////////
//
// Scene manger for display using W3DDispaly. A scene manager can customize
// the rendering process, culling, material passes ...
//
// Author: Colin Day, April 2001
//
///////////////////////////////////////////////////////////////////////////////
#pragma once
#ifndef __W3DSCENE_H_
#define __W3DSCENE_H_
// SYSTEM INCLUDES ////////////////////////////////////////////////////////////
// USER INCLUDES //////////////////////////////////////////////////////////////
#include "WW3D2/Scene.h"
#include "WW3D2/RInfo.h"
#include "WW3D2/Coltest.h"
#include "WW3D2/lightenvironment.h"
///////////////////////////////////////////////////////////////////////////////
// PROTOTYPES /////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
class W3DDynamicLight;
class LightClass;
class Drawable;
enum CustomScenePassModes;
class MaterialPassClass;
class W3DShroudMaterialPassClass;
class W3DMaskMaterialPassClass;
//-----------------------------------------------------------------------------
// RTS3DScene
//-----------------------------------------------------------------------------
/** Scene management for 3D RTS game */
//-----------------------------------------------------------------------------
class RTS3DScene : public SimpleSceneClass, public SubsystemInterface
{
public:
RTS3DScene(); ///< RTSScene constructor
~RTS3DScene(); ///< RTSScene desctructor
/// ray picking against objects in scene
Bool castRay(RayCollisionTestClass & raytest, Bool testAll, Int collisionType);
/// customizable renderer for the RTS3DScene
virtual void Customized_Render( RenderInfoClass &rinfo );
virtual void Visibility_Check(CameraClass * camera);
virtual void Render(RenderInfoClass & rinfo);
void setCustomPassMode (CustomScenePassModes mode) {m_customPassMode = mode;}
CustomScenePassModes getCustomPassMode (void) {return m_customPassMode;}
void Flush(RenderInfoClass & rinfo); //draw queued up models.
/// Drawing control method
void drawTerrainOnly(Bool draw) {m_drawTerrainOnly = draw;};
/// Drawing control method
void renderSpecificDrawables(RenderInfoClass &rinfo, Int numDrawables, Drawable **theDrawables) ;
/// Lighting methods
void addDynamicLight(W3DDynamicLight * obj);
void removeDynamicLight(W3DDynamicLight * obj);
RefRenderObjListIterator * createLightsIterator(void);
void destroyLightsIterator(RefRenderObjListIterator * it);
RefRenderObjListClass *getDynamicLights(void) {return &m_dynamicLightList;};
W3DDynamicLight *getADynamicLight(void);
void setGlobalLight(LightClass *pLight,Int lightIndex=0);
LightEnvironmentClass &getDefaultLightEnv(void) {return m_defaultLightEnv;}
void init() {}
void update() {}
void draw();
void reset(){}
void doRender(CameraClass * cam);
protected:
void renderOneObject(RenderInfoClass &rinfo, RenderObjClass *robj, Int localPlayerIndex);
void updateFixedLightEnvironments(RenderInfoClass & rinfo);
void flushTranslucentObjects(RenderInfoClass & rinfo);
void flushOccludedObjects(RenderInfoClass & rinfo);
void flagOccludedObjects(CameraClass * camera);
void flushOccludedObjectsIntoStencil(RenderInfoClass & rinfo);
void updatePlayerColorPasses(void);
protected:
RefRenderObjListClass m_dynamicLightList;
Bool m_drawTerrainOnly;
LightClass *m_globalLight[LightEnvironmentClass::MAX_LIGHTS]; ///< The global directional light (sun, moon) Applies to objects.
LightClass *m_scratchLight; ///< a workspace for copying global lights and modifying // MLorenzen
Vector3 m_infantryAmbient; ///