mirror of
https://github.com/electronicarts/CnC_Renegade.git
synced 2025-12-16 15:41:39 -05:00
Initial commit of Command & Conquer Renegade source code.
This commit is contained in:
292
Code/Commando/mainmenutransition.cpp
Normal file
292
Code/Commando/mainmenutransition.cpp
Normal file
@@ -0,0 +1,292 @@
|
||||
/*
|
||||
** 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user