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

375 lines
8.2 KiB
C++

// GUIDropZone.cpp: implementation of the GUIDropZone class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MW4GameEd2.h"
#include "GUIDropZone.h"
#include "DrawInfo.h"
#include "GUINode.h"
#include "GameInterface.h"
#include "GroupProps.h"
#include "ObjPanelDlg.h"
#include <Adept\DropZone.hpp>
#include <Stuff\Stuff.hpp>
#include <Adept\Resource.hpp>
#include <Adept\Map.hpp>
using namespace Stuff;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
GUIDropZone::GUIDropZone(CString name,Point3D pnt):GUIObjectList(name)
{
InMap=false;
Build();
SetPos(pnt);
Name="";
SetName(name);
MyDropZone->instanceName=(LPCSTR)GetName();
Check_Object(NameTable::GetInstance());
RemoveFromMap();
AddToMap();
ExistEmpty=true;
Visual=false;
ScreenDiv=100;
}
GUIDropZone::GUIDropZone():GUIObjectList("DropZone")
{
MyDropZone=NULL;
Build();
Visual=false;
ScreenDiv=100;
InMap=false;
}
void GUIDropZone::Build()
{
Adept::Resource res((LPCSTR)"Misc\\DropZone\\DropZone.Instance");
res.LoadData();
Check_Object(Connection::Local);
ReplicatorID base_id = Connection::Local->GetNextReplicatorID();
MyDropZone = Cast_Object(DropZone*,Entity::CreateEntity(&res,&base_id));
Check_Object(MyDropZone);
}
EdGUIObject *GUIDropZone::Clone()
{
GUIDropZone *obj=new GUIDropZone;
obj->Copy(*this);
return obj;
}
void GUIDropZone::Copy(GUIDropZone &obj)
{
if(MyDropZone)
{
RemoveFromMap();
delete Cast_Object(Stuff::Plug *,MyDropZone);
MyDropZone=NULL;
Build();
}
GUIObjectList::Copy(obj);
Check_Object(MyDropZone);
for(int i=0;i<GetObjectCount();i++)
{
LinearMatrix4D loc(GetObject(i)->GetMat());
PlugOf<LinearMatrix4D> *plug;
plug = new PlugOf<LinearMatrix4D>(loc);
MyDropZone->origDropMats.Add(plug);
}
Verify(MyDropZone->origDropMats.GetSize()==GetObjectCount());
}
void GUIDropZone::Draw(DrawInfo &dinf)
{
if(IsHidden()) return;
SetPen(dinf);
int rad=GetScreenRadius(dinf.vinf);
CPoint pnt=dinf.vinf.DataToScreen(GetPos());
CRect rct;
rct.left=pnt.x-rad;
rct.right=pnt.x+rad;
rct.top=pnt.y-rad;
rct.bottom=pnt.y+rad;
dinf.GetDC()->MoveTo(rct.left,rct.top);
dinf.GetDC()->LineTo(rct.right,rct.bottom);
dinf.GetDC()->MoveTo(rct.left,rct.bottom);
dinf.GetDC()->LineTo(rct.right,rct.top);
dinf.GetDC()->Ellipse(&rct);
CPoint newpnt;
for(int i=0;i<GetObjectCount();i++)
{
newpnt=dinf.vinf.DataToScreen(GetObject(i)->GetPos());
dinf.GetDC()->MoveTo(pnt);
dinf.GetDC()->LineTo(newpnt);
}
GUIObjectList::Draw(dinf);
}
void GUIDropZone::AssociateTo(DropZone *dzone)
{
MyDropZone=NULL;
InMap=false;
SnapToGround=false;
SetMat(dzone->GetLocalToParent());
MyDropZone=dzone;
Check_Object(MyDropZone);
InMap=true;
EdGUIObject::SetName(CString((char *)MyDropZone->instanceName));
GUINode *node;
CString node_name=GetName()+"_DropPoint";
ChainIteratorOf<DropZone::MatrixPlug *> iterator(&MyDropZone->origDropMats);
DropZone::MatrixPlug *drop_point;
LinearMatrix4D mat;
while((drop_point = iterator.ReadAndNext()) != NULL)
{
node=new GUINode(node_name);
node->SetMat(drop_point->GetItem());
AddObject(node);
}
}
void GUIDropZone::SetName(CString &name)
{
Check_Object(MyDropZone);
EdGUIObject::SetName(name);
if(InMap)
SetEntityName(MyDropZone,GetName());
// MyDropZone->instanceName=(LPCSTR)name;
}
EdGUIObject *GUIDropZone::AddDropPoint(Point3D &pnt)
{
if(IsHidden()) return NULL;
GUINode *ret=new GUINode(GetName()+"_"+"DropPoint",pnt);
AddObject(ret);
if(MyDropZone!=NULL)
{
Check_Object(MyDropZone);
LinearMatrix4D loc(pnt);
PlugOf<LinearMatrix4D> *plug;
plug = new PlugOf<LinearMatrix4D>(loc);
MyDropZone->origDropMats.Add(plug);
Verify(MyDropZone->origDropMats.GetSize()==GetObjectCount());
SyncDataToNodes();
}
return ret;
}
EdGUIObject *GUIDropZone::AddNodeIfSelected(Point3D &pnt,bool insert)
{
if(IsHidden()) return NULL;
if(!IsSelected()) return NULL;
return AddDropPoint(pnt);
}
void GUIDropZone::SyncNodesToData()
{
Check_Object(MyDropZone);
int size=MyDropZone->origDropMats.GetSize();
Verify(size==GetObjectCount());
GUINode *node;
ChainIteratorOf<DropZone::MatrixPlug *> iterator(&MyDropZone->origDropMats);
DropZone::MatrixPlug *drop_point;
LinearMatrix4D mat;
int count=0;
while((drop_point = iterator.ReadAndNext()) != NULL)
{
node=(GUINode *)GetObject(count++);
node->SetMat(drop_point->GetItem());
}
}
void GUIDropZone::DrawTag(DrawInfo &dinf, unsigned long tag_flags)
{
if(IsHidden()) return;
DrawTagInternal(dinf,tag_flags);
}
void GUIDropZone::SyncDataToNodes()
{
Check_Object(MyDropZone);
int size=MyDropZone->origDropMats.GetSize();
Verify(size==GetObjectCount());
ChainIteratorOf<DropZone::MatrixPlug *> iterator(&MyDropZone->origDropMats);
iterator.DeletePlugs();
SortChildren();
for(int i=0;i<GetObjectCount();i++)
{
MyDropZone->origDropMats.Add(new PlugOf<LinearMatrix4D>(GetObject(i)->GetMat()));
}
}
void GUIDropZone::OffsetSelection(Point3D &vct)
{
if(IsHidden()) return;
if(IsSelected()) EdGUIObject::OffsetBy(vct);
if(GetObjectCount()>0)
{
for(int i=0;i<GetObjectCount();i++)
GetObject(i)->OffsetSelection(vct);
}
SyncDataToNodes();
}
void GUIDropZone::RotateSelection(UnitQuaternion &rot)
{
if(IsHidden()) return;
if(IsSelected()) EdGUIObject::RotateBy(rot);
if(GetObjectCount()>0)
{
for(int i=0;i<GetObjectCount();i++)
GetObject(i)->RotateSelection(rot);
}
SyncDataToNodes();
}
void GUIDropZone::RemoveObject(int idx)
{
GUIObjectList::RemoveObject(idx);
Check_Object(MyDropZone);
MyDropZone->origDropMats.Remove(Cast_Object(DropZone::MatrixPlug *,MyDropZone->origDropMats.GetNthItem(0)));
SyncDataToNodes();
}
void GUIDropZone::RemoveFromMap()
{
if(MyDropZone && InMap)
{
RemoveEntityFromMap(MyDropZone);
InMap=false;
}
//GUIObjectList::RemoveFromMap();
}
void GUIDropZone::AddToMap()
{
if(MyDropZone && !InMap)
{
AddEntityToMap(MyDropZone,GetMat());
InMap=true;
}
//GUIObjectList::AddToMap();
}
void GUIDropZone::Select()
{
EdGUIObject::Select();
for(int i=0;i<GetObjectCount();i++) GetObject(i)->Select();
}
GUIDropZone::~GUIDropZone()
{
DeleteAllObjects();
if(MyDropZone)
{
Map::GetInstance()->RemoveChild(MyDropZone);
RemoveEntityFromNameTable(MyDropZone);
delete Cast_Object(Stuff::Plug *,MyDropZone);
}
}
void GUIDropZone::SaveTextInfo(NotationFile *not_file)
{
Page *page=not_file->SetPage((char *)(LPCSTR)GetName());
page->SetEntry("Type","DropZone");
}
EdGUIObject *GUIDropZone::GetObjAtPoint(Point3D &pnt)
{
EdGUIObject *gobj=EdGUIObject::GetObjAtPoint(pnt);
if(gobj==NULL) gobj=GUIObjectList::GetObjAtPoint(pnt);
return gobj;
}
void GUIDropZone::GetExtents(Point3D *tl,Point3D *br)
{
Point3D tl2,br2;
EdGUIObject::GetExtents(tl,br);
GUIObjectList::GetExtents(&tl2,&br2);
tl->x=tl->x<tl2.x?tl->x:tl2.x;
tl->z=tl->z<tl2.z?tl->z:tl2.z;
br->x=br->x>br2.x?br->x:br2.x;
br->z=br->z>br2.z?br->z:br2.z;
}
int GUIDropZone::Select(Point3D &pnt)
{
if(IsHidden()) return 0;
int selcount=0;
for(int i=0;i<GetObjectCount();i++) selcount+=GetObject(i)->Select(pnt);
return selcount+EdGUIObject::Select(pnt);
}
void GUIDropZone::AddPanel(CObjPanelDlg *pnl,UndoCommand **cmd)
{
EdGUIObject::AddPanel(pnl,cmd);
pnl->AddPanel(new CGroupProps(this,cmd));
}
int GUIDropZone::Select(Point3D &topleft,Point3D &bottomright)
{
if(IsHidden()) return 0;
int selcount=0;
for(int i=0;i<GetObjectCount();i++) selcount+=GetObject(i)->Select(topleft,bottomright);
return selcount+EdGUIObject::Select(topleft,bottomright);
}
void GUIDropZone::OffsetBy( Point3D &pnt)
{
if(IsHidden()) return;
GUIObjectList::OffsetBy(pnt);
SyncDataToNodes();
}
void GUIDropZone::RotateBy(UnitQuaternion &rot)
{
if(IsHidden()) return;
GUIObjectList::RotateBy(rot);
SyncDataToNodes();
}
void GUIDropZone::UpdateMat()
{
RemoveFromMap();
GUIObjectList::UpdateMat();
AddToMap();
}