/* ** Command & Conquer Generals Zero Hour(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: W3DPoliceCarDraw.cpp ///////////////////////////////////////////////////////////////////// // Author: Colin Day, May 2001 // Desc: W3DPoliceCarDraw /////////////////////////////////////////////////////////////////////////////////////////////////// // INCLUDES /////////////////////////////////////////////////////////////////////////////////////// #include #include "Common/STLTypedefs.h" #include "Common/Thing.h" #include "Common/Xfer.h" #include "GameClient/Drawable.h" #include "W3DDevice/GameClient/Module/W3DPoliceCarDraw.h" #include "W3DDevice/GameClient/W3DDisplay.h" #include "common/RandomValue.h" #include "WW3D2/HAnim.h" #include "W3DDevice/GameClient/W3DScene.h" // PRIVATE FUNCTIONS ////////////////////////////////////////////////////////////////////////////// //------------------------------------------------------------------------------------------------- /** Create a dynamic light for the search light */ //------------------------------------------------------------------------------------------------- W3DDynamicLight *W3DPoliceCarDraw::createDynamicLight( void ) { W3DDynamicLight *light = NULL; // get me a dynamic light from the scene light = W3DDisplay::m_3DScene->getADynamicLight(); if( light ) { light->setEnabled( TRUE ); light->Set_Ambient( Vector3( 0.0f, 0.0f, 0.0f ) ); // Use all ambient, and no diffuse. This produces a circle of light on // even and uneven ground. Diffuse lighting shows up ground unevenness, which looks // funny on a searchlight. So no diffuse. jba. light->Set_Diffuse( Vector3( 0.0f, 0.0f, 0.0f ) ); light->Set_Position( Vector3( 0.0f, 0.0f, 0.0f ) ); light->Set_Far_Attenuation_Range( 5, 15 ); } // end if return light; } // end createDynamicSearchLight // PUBLIC FUNCTIONS /////////////////////////////////////////////////////////////////////////////// //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- W3DPoliceCarDraw::W3DPoliceCarDraw( Thing *thing, const ModuleData* moduleData ) : W3DTruckDraw( thing, moduleData ) { m_light = NULL; m_curFrame = GameClientRandomValueReal(0, 10 ); } //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- W3DPoliceCarDraw::~W3DPoliceCarDraw( void ) { // disable the light ... the scene will re-use it later if( m_light ) { // Have it fade out over 5 frames. m_light->setFrameFade(0, 5); m_light->setDecayRange(); m_light->setDecayColor(); m_light = NULL; } // end if } //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- void W3DPoliceCarDraw::doDrawModule(const Matrix3D* transformMtx) { const Real floatAmt = 8.0f; const Real animAmt = 0.25; // get pointers to our render objects that we'll need RenderObjClass* policeCarRenderObj = getRenderObject(); if( policeCarRenderObj == NULL ) return; HAnimClass *anim = policeCarRenderObj->Peek_Animation(); if (anim) { Real frames = anim->Get_Num_Frames(); m_curFrame += animAmt; if (m_curFrame > frames-1) { m_curFrame = 0; } policeCarRenderObj->Set_Animation(anim, m_curFrame); } Real red = 0; Real green = 0; Real blue = 0; if (m_curFrame < 3) { red = 1; green = 0.5; } else if (m_curFrame < 6) { red = 1; } else if (m_curFrame < 7) { red = 1; green = 0.5; } else if (m_curFrame < 9) { red = 0.5+(9-m_curFrame)/4; blue = (m_curFrame-5)/6; } else if (m_curFrame < 12) { blue=1; } else if (m_curFrame <= 14) { green = (m_curFrame-11)/3; blue = (14-m_curFrame)/2; red = (m_curFrame-11)/3; } // make us a light if we don't already have one if( m_light == NULL ) m_light = createDynamicLight(); // if we have a search light, position it if( m_light ) { Coord3D pos = *getDrawable()->getPosition(); m_light->Set_Diffuse( Vector3( red, green, blue) ); m_light->Set_Ambient( Vector3( red/2, green/2, blue/2) ); m_light->Set_Far_Attenuation_Range( 3, 20 ); m_light->Set_Position( Vector3( pos.x,pos.y,pos.z+floatAmt ) ); } W3DTruckDraw::doDrawModule(transformMtx); } // ------------------------------------------------------------------------------------------------ /** CRC */ // ------------------------------------------------------------------------------------------------ void W3DPoliceCarDraw::crc( Xfer *xfer ) { // extend base class W3DTruckDraw::crc( xfer ); } // end crc // ------------------------------------------------------------------------------------------------ /** Xfer method * Version Info: * 1: Initial version */ // ------------------------------------------------------------------------------------------------ void W3DPoliceCarDraw::xfer( Xfer *xfer ) { // version XferVersion currentVersion = 1; XferVersion version = currentVersion; xfer->xferVersion( &version, currentVersion ); // extend base class W3DTruckDraw::xfer( xfer ); // John A says there is no data for these to save } // end xfer // ------------------------------------------------------------------------------------------------ /** Load post process */ // ------------------------------------------------------------------------------------------------ void W3DPoliceCarDraw::loadPostProcess( void ) { // extend base class W3DTruckDraw::loadPostProcess(); } // end loadPostProcess