Files
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
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.
2026-06-24 21:28:16 -05:00

107 lines
3.3 KiB
C++

//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 02/27/98 DPB Initial coding. //
//---------------------------------------------------------------------------//
// Copyright (C) 1997, Virtual World Entertainment, Inc. //
// All Rights reserved worldwide. //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#include "stdafx.h"
#include "MW4GameEd.h"
#include "RotateCommand.h"
#include "Selection.h"
#include "EditorWayPoint.h"
using namespace Adept;
RotateCommand::RotateCommand()
: Command()
{
deltaPitch = 0;
deltaYaw = 0;
deltaRoll = 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
RotateCommand::~RotateCommand()
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
RotateCommand::Undo()
{
Rotate((0 - deltaPitch), (0 - deltaYaw), (0 - deltaRoll));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
RotateCommand::Rotate(Scalar pitchchange, Scalar yawchange, Scalar rollchange)
{
CSelectionNode *selection_node;
Entity *entity;
YawPitchRoll starting_rotation;
LinearMatrix4D new_local_to_world;
Scalar new_pitch, new_yaw, new_roll;
if (!selectedEntities.IsEmpty())
{
ChainIteratorOf<CSelectionNode*> iterator(&selectedEntities);
iterator.First();
while((selection_node = iterator.ReadAndNext()) != NULL)
{
entity = selection_node->selectedEntity;
Check_Object(entity);
#if 0 // remove node radius changing
if (entity->IsDerivedFrom(EditorLatticeNode::DefaultData))
{
// lattice nodes don't rotate, they change the size of their radius
EditorLatticeNode* node;
node = Cast_Object(EditorLatticeNode*,entity);
node->railNode->Radius(node->railNode->Radius() + yawchange * 100);
}
else
#endif
{
starting_rotation = entity->GetLocalToParent();
new_pitch = starting_rotation.pitch + pitchchange;
new_yaw = starting_rotation.yaw + yawchange;
new_roll = starting_rotation.roll + rollchange;
YawPitchRoll new_rotation(new_yaw, new_pitch, new_roll);
Point3D translation;
translation = entity->GetLocalToParent();
new_local_to_world.BuildRotation(new_rotation);
new_local_to_world.BuildTranslation(translation);
entity->SetNewLocalToParent(new_local_to_world);
entity->SyncMatrices(true);
deltaPitch += pitchchange;
deltaYaw += yawchange;
deltaRoll += rollchange;
if (entity->IsDerivedFrom (EditorDropZonePoint::DefaultData))
{
EditorDropZonePoint *drop;
drop = Cast_Object (EditorDropZonePoint *,entity);
Check_Object (drop->dropNode);
drop->dropNode->UpdatePoints ();
}
else if (entity->IsDerivedFrom (EditorDropNode::DefaultData))
{
EditorDropNode *drop;
drop = Cast_Object (EditorDropNode *,entity);
drop->UpdatePoints ();
}
}
}
}
}