Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
362 lines
9.5 KiB
C++
362 lines
9.5 KiB
C++
// GUIObjPanel.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "MW4GameEd2.h"
|
|
#include "GUIObjPanel.h"
|
|
#include "EdGUIObject.h"
|
|
#include "UndoManager.h"
|
|
#include "CameraController.h"
|
|
#include "Refresher.h"
|
|
#include "ObjProps.h"
|
|
|
|
#define Round(x) floor((x)+.5f)
|
|
#define TruncateFloat(x) ( Round( (x)*10000.0f)/10000.0f)
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// GUIObjPanel dialog
|
|
|
|
|
|
GUIObjPanel::GUIObjPanel(EdGUIObject *gobj,UndoCommand **cmd,CWnd* pParent /*=NULL*/)
|
|
: CPanelDlg(GUIObjPanel::IDD, pParent)
|
|
{
|
|
MyObj=gobj;
|
|
CmdLst=cmd;
|
|
MyMultiProps=NULL;
|
|
//{{AFX_DATA_INIT(GUIObjPanel)
|
|
m_HElevation = 0.0f;
|
|
m_SnapGround = FALSE;
|
|
m_Pitch = 0.0f;
|
|
m_PosX = 0.0f;
|
|
m_PosY = 0.0f;
|
|
m_PosZ = 0.0f;
|
|
m_Roll = 0.0f;
|
|
m_Yaw = 0.0f;
|
|
//}}AFX_DATA_INIT
|
|
}
|
|
|
|
GUIObjPanel::GUIObjPanel(CObjProps *gobj,CWnd* pParent): CPanelDlg(GUIObjPanel::IDD, pParent) // standard constructor
|
|
{
|
|
MyMultiProps=gobj;
|
|
MyObj=NULL;
|
|
CmdLst=NULL;
|
|
|
|
m_HElevation = 0.0f;
|
|
m_SnapGround = FALSE;
|
|
m_Pitch = 0.0f;
|
|
m_PosX = 0.0f;
|
|
m_PosY = 0.0f;
|
|
m_PosZ = 0.0f;
|
|
m_Roll = 0.0f;
|
|
m_Yaw = 0.0f;
|
|
|
|
}
|
|
|
|
void GUIObjPanel::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CPanelDlg::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(GUIObjPanel)
|
|
DDX_Text(pDX, IDC_ELEVATION, m_HElevation);
|
|
DDV_MinMaxFloat(pDX, m_HElevation, -10000.f, 10000.f);
|
|
DDX_Check(pDX, IDC_SNAP, m_SnapGround);
|
|
DDX_Text(pDX, IDC_PITCH, m_Pitch);
|
|
DDX_Text(pDX, IDC_POSX, m_PosX);
|
|
DDV_MinMaxFloat(pDX, m_PosX, -1.e+008f, 1.e+008f);
|
|
DDX_Text(pDX, IDC_POSY, m_PosY);
|
|
DDV_MinMaxFloat(pDX, m_PosY, -10000.f, 10000.f);
|
|
DDX_Text(pDX, IDC_POSZ, m_PosZ);
|
|
DDV_MinMaxFloat(pDX, m_PosZ, -1.e+008f, 1.e+008f);
|
|
DDX_Text(pDX, IDC_ROLL, m_Roll);
|
|
DDX_Text(pDX, IDC_YAW, m_Yaw);
|
|
//}}AFX_DATA_MAP
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(GUIObjPanel, CPanelDlg)
|
|
//{{AFX_MSG_MAP(GUIObjPanel)
|
|
ON_BN_CLICKED(IDC_CLEARROT, OnClearrot)
|
|
ON_BN_CLICKED(IDC_CAMERA_LOOKAT, OnCameraLookAt)
|
|
ON_BN_CLICKED(IDC_CAMERA_LOOKFROM, OnCameraLookFrom)
|
|
ON_BN_CLICKED(IDC_MOVEOBJECT_TOFOV, OnMoveObjectToFOV)
|
|
ON_BN_CLICKED(IDC_MOVEOBJECT_TOCAMERA, OnMoveObjectToCamera)
|
|
ON_EN_KILLFOCUS(IDC_POSX, OnKillfocusPosx)
|
|
ON_EN_KILLFOCUS(IDC_POSY, OnKillfocusPosy)
|
|
ON_EN_KILLFOCUS(IDC_POSZ, OnKillfocusPosz)
|
|
ON_EN_KILLFOCUS(IDC_ELEVATION, OnKillfocusElevation)
|
|
ON_EN_CHANGE(IDC_PITCH, OnChangePitch)
|
|
ON_EN_CHANGE(IDC_POSX, OnChangePosx)
|
|
ON_EN_CHANGE(IDC_POSY, OnChangePosy)
|
|
ON_EN_CHANGE(IDC_POSZ, OnChangePosz)
|
|
ON_EN_CHANGE(IDC_ROLL, OnChangeRoll)
|
|
ON_EN_CHANGE(IDC_YAW, OnChangeYaw)
|
|
ON_EN_CHANGE(IDC_ELEVATION, OnChangeElevation)
|
|
ON_BN_CLICKED(IDC_SNAP, OnSnap)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// GUIObjPanel message handlers
|
|
BOOL GUIObjPanel::OnInitDialog()
|
|
{
|
|
CPanelDlg::OnInitDialog();
|
|
Point3D loc;
|
|
YawPitchRoll rot;
|
|
|
|
Verify(!(MyMultiProps && MyObj));
|
|
if(MyMultiProps==NULL)
|
|
{
|
|
m_HElevation=MyObj->GetHoverElevation();
|
|
m_SnapGround=MyObj->GetSnapToGround();
|
|
|
|
m_SavedMatrix = MyObj->GetMat();
|
|
|
|
if (CameraController::GetInstance() != 0)
|
|
{
|
|
m_SavedYPR = CameraController::GetInstance()->GetYawPitchRange();
|
|
m_SavedLookAt = CameraController::GetInstance()->GetLookAt();
|
|
}
|
|
|
|
m_SavedSnapToGround = MyObj->GetSnapToGround();
|
|
|
|
loc=MyObj->GetPos();
|
|
rot=(YawPitchRoll)MyObj->GetRot();
|
|
}
|
|
else
|
|
{
|
|
m_HElevation=MyMultiProps->GetHoverElev();
|
|
m_SnapGround=MyMultiProps->GetSnap();
|
|
|
|
loc=MyMultiProps->GetPos();
|
|
rot=MyMultiProps->GetRot();
|
|
|
|
}
|
|
|
|
m_PosX=loc.x;
|
|
m_PosY=loc.y;
|
|
m_PosZ=loc.z;
|
|
m_Roll=rot.roll*Degrees_Per_Radian;
|
|
m_Yaw=rot.yaw*Degrees_Per_Radian;
|
|
m_Pitch=rot.pitch*Degrees_Per_Radian;
|
|
m_Roll=(float)TruncateFloat(m_Roll);
|
|
m_Yaw=(float)TruncateFloat(m_Yaw);
|
|
m_Pitch=(float)TruncateFloat(m_Pitch);
|
|
UpdateData(FALSE);
|
|
ElevationChange=PitchChange=RollChange=YawChange=PosXChange=PosYChange=PosZChange=SnapChange=false;
|
|
|
|
return TRUE; // return TRUE unless you set the focus to a control
|
|
// EXCEPTION: OCX Property Pages should return FALSE
|
|
}
|
|
|
|
void GUIObjPanel::OnOK()
|
|
{
|
|
UpdateData(TRUE);
|
|
|
|
Verify(!(MyMultiProps && MyObj));
|
|
if(MyMultiProps!=NULL)
|
|
{
|
|
|
|
if(ElevationChange) MyMultiProps->SetHoverElev(m_HElevation);
|
|
if(SnapChange) MyMultiProps->SetSnap(m_SnapGround==TRUE?true:false);
|
|
if(YawChange) MyMultiProps->SetYaw(m_Yaw*Radians_Per_Degree);
|
|
if(PitchChange) MyMultiProps->SetPitch(m_Pitch*Radians_Per_Degree);
|
|
if(RollChange) MyMultiProps->SetRoll(m_Roll*Radians_Per_Degree);
|
|
if(PosXChange) MyMultiProps->SetPosX(m_PosX);
|
|
if(PosYChange) MyMultiProps->SetPosY(m_PosY);
|
|
if(PosZChange) MyMultiProps->SetPosZ(m_PosZ);
|
|
|
|
}
|
|
else
|
|
{
|
|
UndoCommand *cmd=NULL;
|
|
|
|
MyObj->SetMat(m_SavedMatrix);
|
|
|
|
MyObj->SetHoverElevation(m_HElevation);
|
|
MyObj->SetSnapToGround(m_SnapGround==TRUE?true:false);
|
|
|
|
MyObj->SavePos(&cmd);
|
|
MyObj->SaveRot(&cmd);
|
|
|
|
YawPitchRoll newrot=YawPitchRoll(m_Yaw*Radians_Per_Degree,m_Pitch*Radians_Per_Degree,m_Roll*Radians_Per_Degree);
|
|
UnitQuaternion newrotquat;
|
|
newrotquat=newrot;
|
|
|
|
Point3D oldpos=MyObj->GetPos();
|
|
Point3D posoffset,newpos=Point3D(m_PosX,m_PosY,m_PosZ);
|
|
posoffset=newpos;
|
|
posoffset-=oldpos;
|
|
|
|
LinearMatrix4D mat(newpos);
|
|
mat.BuildRotation(newrotquat);
|
|
MyObj->SetMat(mat);
|
|
|
|
if(*CmdLst==NULL)
|
|
{
|
|
*CmdLst=cmd;
|
|
}
|
|
else
|
|
{
|
|
(*CmdLst)->Attach(cmd);
|
|
}
|
|
}
|
|
//CPanelDlg::OnOK();
|
|
}
|
|
|
|
void GUIObjPanel::OnCancel()
|
|
{
|
|
if(MyObj==NULL) return;
|
|
MyObj->SetMat(m_SavedMatrix);
|
|
|
|
if (CameraController::GetInstance() != 0)
|
|
{
|
|
CameraController::GetInstance()->SetYawPitchRange(m_SavedYPR);
|
|
CameraController::GetInstance()->SetLookAt(m_SavedLookAt,true);
|
|
}
|
|
|
|
MyObj->SetSnapToGround(m_SavedSnapToGround);
|
|
|
|
if (Refresher::Instance != 0)
|
|
{
|
|
Refresher::Instance->DrawRefresh();
|
|
}
|
|
// CDialog::OnCancel();
|
|
}
|
|
|
|
|
|
void GUIObjPanel::OnClearrot()
|
|
{
|
|
m_Pitch=m_Yaw=m_Roll=0.0f;
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void GUIObjPanel::OnCameraLookAt()
|
|
{
|
|
if(MyObj==NULL) return;
|
|
if ((CameraController::GetInstance() == 0) ||
|
|
(Refresher::Instance == 0))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (CameraController::GetInstance()->StaysInsideBounds(MyObj->GetPos(),
|
|
CameraController::GetInstance()->GetYawPitchRange()) == true)
|
|
{
|
|
CameraController::GetInstance()->SetLookAtMode(true);
|
|
CameraController::GetInstance()->SetLookAt(MyObj->GetPos(),false);
|
|
CameraController::GetInstance()->Update();
|
|
Refresher::Instance->DrawRefresh();
|
|
}
|
|
}
|
|
|
|
void GUIObjPanel::OnCameraLookFrom()
|
|
{
|
|
if(MyObj==NULL) return;
|
|
if ((CameraController::GetInstance() == 0) ||
|
|
(Refresher::Instance == 0))
|
|
{
|
|
return;
|
|
}
|
|
|
|
CameraController::GetInstance()->SetLookAtMode(false);
|
|
YawPitchRoll yawpitchroll(MyObj->GetRot());
|
|
|
|
YawPitchRange ypr(Two_Pi - yawpitchroll.yaw,
|
|
Two_Pi - yawpitchroll.pitch,
|
|
CameraController::GetInstance()->GetYawPitchRange().range);
|
|
|
|
Stuff::LinearMatrix4D matrix(MyObj->GetMat());
|
|
matrix.BuildLookFrom(ypr);
|
|
|
|
ypr.yaw = yawpitchroll.yaw;
|
|
ypr.pitch = yawpitchroll.pitch;
|
|
|
|
if (CameraController::GetInstance()->StaysInsideBounds((Point3D)matrix,ypr) == true)
|
|
{
|
|
CameraController::GetInstance()->SetYawPitchRange(ypr);
|
|
CameraController::GetInstance()->SetLookAt((Point3D)matrix,false);
|
|
CameraController::GetInstance()->Update();
|
|
Refresher::Instance->DrawRefresh();
|
|
}
|
|
}
|
|
|
|
void GUIObjPanel::OnMoveObjectToFOV()
|
|
{
|
|
if(MyObj==NULL) return;
|
|
if ((CameraController::GetInstance() == 0)||
|
|
(Refresher::Instance == 0))
|
|
{
|
|
return;
|
|
}
|
|
|
|
MyObj->SetPos(CameraController::GetInstance()->GetLookAt());
|
|
Refresher::Instance->DrawRefresh();
|
|
|
|
Stuff::YawPitchRoll ypr(MyObj->GetMat());
|
|
|
|
m_HElevation = 0;
|
|
m_PosX = MyObj->GetPos().x;
|
|
m_PosY = MyObj->GetPos().y;
|
|
m_PosZ = MyObj->GetPos().z;
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void GUIObjPanel::OnMoveObjectToCamera()
|
|
{
|
|
if(MyObj==NULL) return;
|
|
if ((CameraController::GetInstance() == 0) ||
|
|
(Refresher::Instance == 0))
|
|
{
|
|
return;
|
|
}
|
|
|
|
MyObj->SetSnapToGround(false);
|
|
|
|
Stuff::LinearMatrix4D matrix(CameraController::GetInstance()->GetLookAt());
|
|
matrix.BuildLookAt(CameraController::GetInstance()->GetYawPitchRange());
|
|
|
|
MyObj->SetMat(matrix);
|
|
Refresher::Instance->DrawRefresh();
|
|
|
|
m_SnapGround = false;
|
|
|
|
m_HElevation = 0;
|
|
m_Pitch = CameraController::GetInstance()->GetYawPitchRange().pitch * Degrees_Per_Radian;
|
|
m_PosX = MyObj->GetPos().x;
|
|
m_PosY = MyObj->GetPos().y;
|
|
m_PosZ = MyObj->GetPos().z;
|
|
m_Roll = 0;
|
|
m_Yaw = CameraController::GetInstance()->GetYawPitchRange().yaw * Degrees_Per_Radian;
|
|
|
|
UpdateData(FALSE);
|
|
}
|
|
|
|
void GUIObjPanel::OnKillfocusPosx()
|
|
{
|
|
UpdateData(TRUE); // Done here for range validation because of funny way that OnOK is called
|
|
}
|
|
|
|
void GUIObjPanel::OnKillfocusPosy()
|
|
{
|
|
UpdateData(TRUE); // Done here for range validation because of funny way that OnOK is called
|
|
}
|
|
|
|
void GUIObjPanel::OnKillfocusPosz()
|
|
{
|
|
UpdateData(TRUE); // Done here for range validation because of funny way that OnOK is called
|
|
}
|
|
|
|
void GUIObjPanel::OnKillfocusElevation()
|
|
{
|
|
UpdateData(TRUE); // Done here for range validation because of funny way that OnOK is called
|
|
}
|
|
|
|
void GUIObjPanel::OnChangePitch() {PitchChange=true;}
|
|
void GUIObjPanel::OnChangePosx() {PosXChange=true;}
|
|
void GUIObjPanel::OnChangePosy() {PosYChange=true;}
|
|
void GUIObjPanel::OnChangePosz() {PosZChange=true;}
|
|
void GUIObjPanel::OnChangeRoll() {RollChange=true;}
|
|
void GUIObjPanel::OnChangeYaw() {YawChange=true;}
|
|
void GUIObjPanel::OnChangeElevation() {ElevationChange=true;}
|
|
void GUIObjPanel::OnSnap() {SnapChange=true;}
|