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

106 lines
3.2 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 "RevolveCommand.h"
#include "MW4GameEd.h"
#include "DisplayWindow.h"
#include "Selection.h"
extern CMW4GameEdApp theApp;
RevolveCommand::RevolveCommand()
: Command()
{
deltaRevolution = 0;
if (!selectedEntities.IsEmpty())
{
CSelectionNode *selection_node;
Entity *entity;
Point3D pos;
Scalar max_x = -1.0f, min_x = 999999.9f, max_z = -1.0f, min_z = 999999.9f;
ChainIteratorOf<CSelectionNode*> iterator(&selectedEntities);
iterator.First();
while((selection_node = iterator.ReadAndNext()) != NULL)
{
entity = selection_node->selectedEntity;
Check_Object(entity);
pos = entity->GetLocalToWorld();
if (pos.x > max_x) max_x = pos.x;
if (pos.x < min_x) min_x = pos.x;
if (pos.z > max_z) max_z = pos.z;
if (pos.z < min_z) min_z = pos.z;
}
origin.x = (min_x + max_x) / 2;
origin.z = (min_z + max_z) / 2;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
RevolveCommand::~RevolveCommand()
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
RevolveCommand::Undo()
{
Revolve(0 - deltaRevolution);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
RevolveCommand::Revolve(Scalar revolution)
{
CSelectionNode *selection_node;
Entity *entity;
Point3D starting_position;
YawPitchRoll starting_rotation;
LinearMatrix4D new_local_to_world;
Scalar new_x, new_y, new_z, off_x, off_z;
if (!selectedEntities.IsEmpty())
{
ChainIteratorOf<CSelectionNode*> iterator(&selectedEntities);
iterator.First();
while((selection_node = iterator.ReadAndNext()) != NULL)
{
entity = selection_node->selectedEntity;
Check_Object(entity);
starting_position = entity->GetLocalToParent();
starting_rotation = entity->GetLocalToParent();
off_x = starting_position.x - origin.x;
off_z = starting_position.z - origin.z;
new_x = origin.x + (Cos(revolution) * off_x + Sin(revolution) * off_z);
new_z = origin.z + (Cos(revolution) * off_z - Sin(revolution) * off_x);
new_y = theApp.displayWindow->GetMapPointVertical(new_x,new_z);
starting_rotation.yaw += revolution;
Point3D translation(new_x,new_y,new_z);
new_local_to_world = LinearMatrix4D::Identity;
new_local_to_world.BuildTranslation(translation);
new_local_to_world.BuildRotation(starting_rotation);
entity->SetNewLocalToParent(new_local_to_world);
entity->SyncMatrices(true);
deltaRevolution += revolution;
}
}
}