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/Commando/mainmenutransition.cpp

292 lines
8.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 : Combat *
* *
* $Archive:: /Commando/Code/commando/mainmenutransition.cpp $*
* *
* Author:: Patrick Smith *
* *
* $Modtime:: 12/20/01 7:25p $*
* *
* $Revision:: 8 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "mainmenutransition.h"
#include "camera.h"
#include "stylemgr.h"
#include "assetmgr.h"
#include "hanim.h"
#include "rendobj.h"
#include "ww3d.h"
#include "dialogresource.h"
#include "render2d.h"
#include "dialogcontrol.h"
#include "dialogbase.h"
#include "resource.h"
#include "wwaudio.h"
////////////////////////////////////////////////////////////////
// Local constants
////////////////////////////////////////////////////////////////
static const float IN_START_FRAME = 27.0F;
static const float IN_END_FRAME = 65.0F;
static const float OUT_START_FRAME = 66.0F;
static const float OUT_END_FRAME = 99.0F;
static const char *ANIM_NAME = "IF_TITLETRANS.IF_TITLETRANS";
////////////////////////////////////////////////////////////////
//
// MainMenuTransitionClass
//
////////////////////////////////////////////////////////////////
MainMenuTransitionClass::MainMenuTransitionClass (void) :
Model (NULL),
Dialog (NULL),
OtherDlg (NULL),
Camera (NULL),
CurrentFrame (0),
TargetFrame (0),
TransitionAnim (NULL)
{
return ;
}
////////////////////////////////////////////////////////////////
//
// ~MainMenuTransitionClass
//
////////////////////////////////////////////////////////////////
MainMenuTransitionClass::~MainMenuTransitionClass (void)
{
REF_PTR_RELEASE (Model);
REF_PTR_RELEASE (TransitionAnim);
return ;
}
////////////////////////////////////////////////////////////////
//
// Set_Dialogs
//
////////////////////////////////////////////////////////////////
void
MainMenuTransitionClass::Set_Dialogs (DialogBaseClass *dialog, DialogBaseClass *other_dlg)
{
Dialog = dialog;
OtherDlg = other_dlg;
return ;
}
////////////////////////////////////////////////////////////////
//
// Set_Model
//
////////////////////////////////////////////////////////////////
void
MainMenuTransitionClass::Set_Model (RenderObjClass *model)
{
REF_PTR_SET (Model, model);
if (TransitionAnim == NULL) {
TransitionAnim = WW3DAssetManager::Get_Instance ()->Get_HAnim (ANIM_NAME);
}
return ;
}
////////////////////////////////////////////////////////////////
//
// Set_Type
//
////////////////////////////////////////////////////////////////
void
MainMenuTransitionClass::Set_Type (TYPE type)
{
DialogTransitionClass::Set_Type (type);
if (type == SCREEN_IN) {
CurrentFrame = IN_START_FRAME;
TargetFrame = IN_END_FRAME;
WWAudioClass::Get_Instance ()->Simple_Play_2D_Sound_Effect ("interface_mainmove.wav", 1.0F, 0.8F);
} else if (type == SCREEN_OUT) {
CurrentFrame = OUT_START_FRAME;
TargetFrame = OUT_END_FRAME;
WWAudioClass::Get_Instance ()->Simple_Play_2D_Sound_Effect ("interface_movezoom.wav", 1.0F, 0.8F);
}
return ;
}
////////////////////////////////////////////////////////////////
//
// On_Frame_Update
//
////////////////////////////////////////////////////////////////
void
MainMenuTransitionClass::On_Frame_Update (void)
{
if (Model != NULL && TransitionAnim != NULL) {
//
// Do we need to keep animating?
//
if (CurrentFrame < TargetFrame) {
//
// Get the frame rate
//
float frame_rate = TransitionAnim->Get_Frame_Rate ();
//
// Adjust the current frame counter
//
CurrentFrame += (frame_rate * (WW3D::Get_Frame_Time () / 1000.0F));
CurrentFrame = min (CurrentFrame, TargetFrame);
//
// Update the animation
//
Model->Set_Animation (TransitionAnim, CurrentFrame);
//
// Move the controls with the animation
//
Update_Controls ();
//
// Remove the model if we've finished animating
//
if (CurrentFrame >= TargetFrame && Type == SCREEN_OUT) {
Model->Remove ();
}
}
}
DialogTransitionClass::On_Frame_Update ();
return ;
}
////////////////////////////////////////////////////////////////
//
// Update_Controls
//
////////////////////////////////////////////////////////////////
void
MainMenuTransitionClass::Update_Controls (void)
{
const int ENTRIES = 6;
const int ControlIDArray[ENTRIES] =
{
IDC_MENU_START_SP_GAME_BUTTON,
//C_MENU_START_SKIRMISH_GAME_BUTTON,
IDC_MENU_MP_INTERNET_GAME_BUTTON,
IDC_MENU_MP_LAN_GAME_BUTTON,
IDC_MENU_START_PRACTICE_GAME_BUTTON,
IDC_MENU_OPTIONS_BUTTON,
IDC_MENU_QUIT_BUTTON
};
//
// Get the half dimensions of the screen
//
const RectClass &screen_rect = Render2DClass::Get_Screen_Resolution ();
float half_width = screen_rect.Width () / 2.0F;
float half_height = screen_rect.Height () / 2.0F;
//
// Update the position of each control
//
for (int index = 0; index < ENTRIES; index ++) {
//
// Get the current position of the bone
//
StringClass bone_name;
bone_name.Format ("IF_MMTF%d", index + 1);
const Matrix3D &tm = Model->Get_Bone_Transform (bone_name);
//
// Transform the position into screen space
//
Vector3 cam_space_pos (0, 0, 0);
Camera->Transform_To_View_Space (cam_space_pos, tm.Get_Translation ());
Vector3 new_pos (0, 0, 0);
Camera->Project_Camera_Space_Point (new_pos, cam_space_pos);
//
// Convert the normalized screen space position to pixel coordinates
//
new_pos.X = half_width * (new_pos.X + 1.0F);
new_pos.Y = half_height * (1.0F - new_pos.Y);
//
// Move each control to the left of the bone a little
//
new_pos.X -= StyleMgrClass::Get_X_Scale () * 100.0F;
//
// Move the dialog control
//
DialogControlClass *control = Dialog->Get_Dlg_Item (ControlIDArray[index]);
const RectClass &control_rect = control->Get_Window_Rect ();
new_pos.Y -= (control_rect.Height () / 2);
control->Set_Window_Pos (Vector2 (new_pos.X, new_pos.Y));
}
return ;
}
////////////////////////////////////////////////////////////////
//
// Is_Valid
//
////////////////////////////////////////////////////////////////
bool
MainMenuTransitionClass::Is_Valid (void) const
{
bool retval = false;
//
// Check to see if the model and animation are valid
//
if (Model != NULL && TransitionAnim != NULL) {
retval = true;
}
return retval;
}