/* ** 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: W3DTracerDraw.cpp //////////////////////////////////////////////////////////////////////// // Author: Colin Day, December 2001 // Desc: Tracer drawing /////////////////////////////////////////////////////////////////////////////////////////////////// // INCLUDES /////////////////////////////////////////////////////////////////////////////////////// #include #include "Common/Thing.h" #include "Common/ThingTemplate.h" #include "Common/Xfer.h" #include "GameClient/Drawable.h" #include "GameClient/GameClient.h" #include "GameLogic/GameLogic.h" #include "W3DDevice/GameClient/W3DDisplay.h" #include "W3DDevice/GameClient/Module/W3DTracerDraw.h" #include "WW3D2/Line3D.h" #include "W3DDevice/GameClient/W3DScene.h" #ifdef _INTERNAL // for occasional debugging... //#pragma optimize("", off) //#pragma MESSAGE("************************************** WARNING, optimization disabled for debugging purposes") #endif /////////////////////////////////////////////////////////////////////////////////////////////////// // PUBLIC FUNCTIONS /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- W3DTracerDraw::W3DTracerDraw( Thing *thing, const ModuleData* moduleData ) : DrawModule( thing, moduleData ) { // set opacity m_opacity = 1.0f; m_length = 20.0f; m_width = 0.5f; m_color.red = 0.9f; m_color.green = 0.8f; m_color.blue = 0.7f; m_speedInDistPerFrame = 1.0f; m_theTracer = NULL; } // end W3DTracerDraw //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- void W3DTracerDraw::setTracerParms(Real speed, Real length, Real width, const RGBColor& color, Real initialOpacity) { m_speedInDistPerFrame = speed; m_length = length; m_width = width; m_color = color; m_opacity = initialOpacity; if (m_theTracer) { Vector3 start( 0.0f, 0.0f, 0.0f ); Vector3 stop( m_length, 0.0f, 0.0f ); m_theTracer->Reset(start, stop, m_width); m_theTracer->Re_Color(m_color.red, m_color.green, m_color.blue); m_theTracer->Set_Opacity( m_opacity ); // these calls nuke the internal transform, so re-set it here m_theTracer->Set_Transform( *getDrawable()->getTransformMatrix() ); } } //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- W3DTracerDraw::~W3DTracerDraw( void ) { // remove tracer from the scene and delete if( m_theTracer ) { W3DDisplay::m_3DScene->Remove_Render_Object( m_theTracer ); REF_PTR_RELEASE( m_theTracer ); } } //------------------------------------------------------------------------------------------------- void W3DTracerDraw::reactToTransformChange( const Matrix3D *oldMtx, const Coord3D *oldPos, Real oldAngle ) { if( m_theTracer ) m_theTracer->Set_Transform( *getDrawable()->getTransformMatrix() ); } //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- void W3DTracerDraw::doDrawModule(const Matrix3D* transformMtx) { // create tracer if( m_theTracer == NULL ) { Vector3 start( 0.0f, 0.0f, 0.0f ); Vector3 stop( m_length, 0.0f, 0.0f ); // create tracer render object for us to manipulate // poolify m_theTracer = NEW Line3DClass( start, stop, m_width, // width m_color.red, // red m_color.green, // green m_color.blue, // blue m_opacity ); // transparency W3DDisplay::m_3DScene->Add_Render_Object( m_theTracer ); // set the transform for the tracer to that of the drawable m_theTracer->Set_Transform( *transformMtx ); } UnsignedInt expDate = getDrawable()->getExpirationDate(); if (expDate != 0) { Real decay = m_opacity / (expDate - TheGameLogic->getFrame()); m_opacity -= decay; m_theTracer->Set_Opacity( m_opacity ); } // set the position for the tracer if (m_speedInDistPerFrame != 0.0f) { Matrix3D pos = m_theTracer->Get_Transform(); pos.Translate( Vector3( m_speedInDistPerFrame, 0.0f, 0.0 ) ); m_theTracer->Set_Transform( pos ); } } // ------------------------------------------------------------------------------------------------ /** CRC */ // ------------------------------------------------------------------------------------------------ void W3DTracerDraw::crc( Xfer *xfer ) { // extend base class DrawModule::crc( xfer ); } // end crc // ------------------------------------------------------------------------------------------------ /** Xfer method * Version Info: * 1: Initial version */ // ------------------------------------------------------------------------------------------------ void W3DTracerDraw::xfer( Xfer *xfer ) { // version XferVersion currentVersion = 1; XferVersion version = currentVersion; xfer->xferVersion( &version, currentVersion ); // extend base class DrawModule::xfer( xfer ); // no data to save here, nobody will ever notice } // end xfer // ------------------------------------------------------------------------------------------------ /** Load post process */ // ------------------------------------------------------------------------------------------------ void W3DTracerDraw::loadPostProcess( void ) { // extend base class DrawModule::loadPostProcess(); } // end loadPostProcess