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

326 lines
10 KiB
C++

#include "stdafx.h"
#include "MW4GameEd.h"
#include "AddCommand.h"
#include "TransDlg.h"
#include <Adept\Player.hpp>
#include <Adept\Interface.hpp>
#include <Adept\Entity.hpp>
#include <Adept\EntityManager.hpp>
#include <Adept\Map.hpp>
#include <Adept\VideoRenderer.hpp>
#include <mw4\NavPoint.hpp>
#include <Adept\CameraComponent.hpp>
#include "InstanceWindow.h"
#include "DisplayWindow.h"
#include "OverviewWindow.h"
#include "EditorWaypoint.h"
extern CMW4GameEdApp theApp;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
AddCommand::AddCommand(Entity *object)
: Command()
{
Check_Object(object);
addedObject = object;
Check_Pointer(theApp.instanceWindow);
if (!object->IsDerivedFrom(EditorPathNode::DefaultData))
theApp.instanceWindow->ResetInstanceLists();
if (object->IsDerivedFrom(NavPoint::DefaultData))
{
NavPoint*node = Cast_Object(NavPoint*,object);
node->SetToDisplay();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
AddCommand::~AddCommand()
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
AddCommand::Execute()
{
Move();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
AddCommand::Undo()
{
Check_Object(addedObject);
if (addedObject->IsDerivedFrom(EditorPathNode::DefaultData))
{
EditorPathNode* node;
node = Cast_Object(EditorPathNode*,addedObject);
node->pathSlot.GetCurrent()->pathSlot.GetCurrent()->ErasePoint(node->index);
if (node->prevnode)
{
node->prevnode->m_PathLinkPointData[1] = node->prevnode->m_PathLinkPointData[0];
node->prevnode->nextnode = NULL;
node->prevnode->UpdateLinkPointData();
}
if(node->m_PathLinkLineCloud)
{
Unregister_Pointer(node->m_PathLinkLineCloud);
delete node->m_PathLinkLineCloud;
node->m_PathLinkLineCloud=NULL;
}
if(node->pathSlot.GetCurrent()->pathSlot.GetCurrent()->pathPoints.size() == 0)
{
Check_Object(NameTable::Instance);
NameTable::Instance->RemoveEntry(node->pathSlot.GetCurrent()->objectID);
Map::Instance->RemoveChild(node->pathSlot.GetCurrent()->pathSlot.GetCurrent());
NameTable::Instance->RemoveEntry(node->pathSlot.GetCurrent()->pathSlot.GetCurrent()->objectID);
theApp.instanceWindow->RemoveInstance(node->pathSlot.GetCurrent());
theApp.instanceWindow->RemoveInstance(node->pathSlot.GetCurrent()->pathSlot.GetCurrent());
node->pathSlot.GetCurrent()->pathSlot.GetCurrent()->SentenceToDeathRow();
node->pathSlot.GetCurrent()->SentenceToDeathRow();
NameTable::Instance->IsValid();
}
node->SentenceToDeathRow();
theApp.m_CurPath = NULL;
}
else if (addedObject->IsDerivedFrom(EditorLatticeNode::DefaultData))
{
EditorLatticeNode* latticeNode;
latticeNode = Cast_Object(EditorLatticeNode*,addedObject);
if (latticeNode->railNode)
MW4AI::g_MissionGraph->DeleteNode(latticeNode->railNode->ID());
}
else if (addedObject->IsDerivedFrom(EditorDropNode::DefaultData))
{
EditorDropNode* node;
node = Cast_Object(EditorDropNode*,addedObject);
Check_Object(NameTable::Instance);
NameTable::Instance->RemoveEntry(node->dropZone->objectID);
NameTable::Instance->IsValid();
node->dropZone->SentenceToDeathRow();
}
else if (addedObject->IsDerivedFrom(EditorDropZonePoint::DefaultData))
{
EditorDropZonePoint* node;
node = Cast_Object(EditorDropZonePoint*,addedObject);
node->dropNode->pointChain.Remove(node);
node->dropNode->UpdatePoints();
}
else if (addedObject->IsDerivedFrom(EditorObjectiveMarker::DefaultData))
{
theApp.m_NumObjectives--;
EditorObjectiveMarker* node;
node = Cast_Object(EditorObjectiveMarker*,addedObject);
Check_Object(NameTable::Instance);
NameTable::Instance->RemoveEntry(node->objective->objectID);
NameTable::Instance->IsValid();
node->objective->SentenceToDeathRow();
}
else if (addedObject->IsDerivedFrom(EditorCameraShip::DefaultData))
{
EditorCameraShip* node;
node = Cast_Object(EditorCameraShip*,addedObject);
Check_Object(NameTable::Instance);
NameTable::Instance->RemoveEntry(node->cameraShip->objectID);
Verify(NameTable::Instance->IsValid());
node->cameraShip->SentenceToDeathRow();
Map::Instance->RemoveChild(node->cameraShip);
}
Check_Object(NameTable::Instance);
Entity *parent=addedObject->GetParentEntity();
parent->RemoveChild(addedObject);
NameTable::Instance->RemoveEntry(addedObject->objectID);
NameTable::Instance->IsValid();
Check_Pointer(theApp.instanceWindow);
// theApp.instanceWindow->RemoveInstance(addedObject);
theApp.instanceWindow->ResetInstanceLists();
theApp.overviewWindow->DrawWindow();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
AddCommand::Move()
{
Check_Object(addedObject);
Check_Object(Map::Instance);
Check_Pointer(this);
Point3D target_in_world;
YawPitchRoll current_rotation;
LinearMatrix4D new_local_to_world = LinearMatrix4D::Identity;
Point3D translation = Point3D::Identity, lastPoint;
lastPoint = addedObject->GetLocalToWorld();
int x_down = GetAsyncKeyState(KEY_X) & 0x8000;
int y_down = GetAsyncKeyState(KEY_Y) & 0x8000;
int z_down = GetAsyncKeyState(KEY_Z) & 0x8000;
Check_Object(Player::Instance);
Check_Object(Player::Instance->playerInterface);
Entity *reticule;
reticule = Player::Instance->playerInterface->reticuleEntity.GetCurrent();
if(reticule && reticule == Map::Instance)
{
Point3D world_offset = Player::Instance->playerInterface->reticuleOffset;
LinearMatrix4D new_local_to_parent = LinearMatrix4D::Identity;
new_local_to_parent.Multiply(reticule->GetLocalToParent(), world_offset);
translation = new_local_to_parent;
if (theApp.gridOn)
theApp.GetGridCoords(translation);
}
else if (!y_down)
return; // must be pointing at the sky
bool x_blocked = false, y_blocked = true, z_blocked = false;
if (x_down || y_down || z_down)
{
x_blocked = !x_down;
y_blocked = !y_down;
z_blocked = !z_down;
}
if (x_blocked)
translation.x = lastPoint.x;
if (z_blocked)
translation.z = lastPoint.z;
if (!y_blocked)
{
Vector2DOf<Scalar> cursor;
gos_GetMouseInfo(&cursor.x, &cursor.y, NULL, NULL, NULL, NULL);
// Clean out the interface data
Check_Object(VideoRenderer::Instance);
EntityComponentWeb *web =
Cast_Object(EntityComponentWeb*,VideoRenderer::Instance->GetSceneCamera()->GetComponentWeb());
Interface *intface = Cast_Object(Interface*, web->GetEntity());
intface->reticuleEntity.Remove();
// Figure out the eyeline
Line3D world_line;
VideoRenderer::Instance->GetSceneCamera()->ComputeEyeLine(&world_line, cursor);
Point3D point,y_offset;
point = addedObject->GetLocalToWorld();
Vector3D vector(world_line.m_direction.x,0,world_line.m_direction.z);
Normal3D plane_normal;
plane_normal.Normalize(vector);
Stuff::Plane plane(plane_normal,plane_normal * point);
Scalar axis;
Scalar length = world_line.GetDistanceTo(plane,&axis);
world_line.Project(length,&y_offset);
translation.y = y_offset.y;
}
current_rotation = addedObject->GetLocalToParent();
new_local_to_world.BuildTranslation(translation);
new_local_to_world.BuildRotation(current_rotation);
addedObject->SetNewLocalToParent(new_local_to_world);
addedObject->SyncMatrices(true);
// EntityManager::Instance->RequestPostCollisionExecution(addedObject);
Map::Instance->UpdateZone(addedObject);
if (addedObject->GetCollisionMask() == Entity::EditorIsMovingFlag)
{
if (addedObject->IsMultiZone())
addedObject->GetElement()->SetCallbackIndex(ElementRenderer::Element::DrawRedBounds);
else if (addedObject->IsMultiTile())
addedObject->GetElement()->SetCallbackIndex(ElementRenderer::Element::DrawYellowBounds);
else
addedObject->GetElement()->SetCallbackIndex(ElementRenderer::Element::DrawGreenBounds);
}
else
addedObject->GetElement()->SetCallbackIndex(ElementRenderer::Element::DrawGreenBounds);
if (addedObject->IsDerivedFrom(EditorLatticeNode::DefaultData))
{
EditorLatticeNode* node;
node = Cast_Object(EditorLatticeNode*,addedObject);
target_in_world = new_local_to_world;
node->railNode->Location(target_in_world);
node->railNode->UpdateRadiusPointData();
}
else if (addedObject->IsDerivedFrom(EditorPathNode::DefaultData))
{
EditorPathNode* node;
node = Cast_Object(EditorPathNode*,addedObject);
target_in_world = new_local_to_world;
Check_Object(node->pathSlot.GetCurrent());
node->pathSlot.GetCurrent()->pathSlot.GetCurrent()->pathPoints[node->index] = target_in_world;
node->UpdateLinkPointData();
node->SetLinkColor(Stuff::RGBAColor(1.0f,1.0f,0.0f,0.0f));
}
else if (addedObject->IsDerivedFrom(EditorDropNode::DefaultData))
{
EditorDropNode* node;
node = Cast_Object(EditorDropNode*,addedObject);
node->dropZone->SetNewLocalToParent(new_local_to_world);
node->dropZone->SyncMatrices(true);
}
else if (addedObject->IsDerivedFrom(EditorDropZonePoint::DefaultData))
{
EditorDropZonePoint* node;
node = Cast_Object(EditorDropZonePoint*,addedObject);
node->SetNewLocalToParent(new_local_to_world);
node->SyncMatrices(true);
node->UpdateLinkPointData();
Point3D newPoint;
newPoint = new_local_to_world;
node->offset = node->dropNode->GetLocalToWorld();
node->offset -= newPoint;
node->dropNode->UpdatePoints();
}
else if (addedObject->IsDerivedFrom(EditorObjectiveMarker::DefaultData))
{
EditorObjectiveMarker* node;
node = Cast_Object(EditorObjectiveMarker*,addedObject);
node->objective->SetNewLocalToParent(new_local_to_world);
node->objective->SyncMatrices(true);
}
else if (addedObject->IsDerivedFrom(EditorPointLight::DefaultData) ||
addedObject->IsDerivedFrom(EditorSpotLight::DefaultData))
{
EditorLight* light;
light = Cast_Object(EditorLight*,addedObject);
light->SetLightToWorldMatrix(light->GetLocalToWorld());
}
else if (addedObject->IsDerivedFrom(EditorCameraShip::DefaultData))
{
EditorCameraShip* node;
node = Cast_Object(EditorCameraShip*,addedObject);
node->cameraShip->SetNewLocalToParent(new_local_to_world);
node->cameraShip->SyncMatrices(true);
}
}