// EdGUIObject.cpp: implementation of the EdGUIObject class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "MW4GameEd2.h" #include "EdGUIObject.h" #include "ObjPanelDlg.h" #include "DrawInfo.h" #include "GuiObjPanel.h" #include "TNPanel.h" #include "GuiObjectList.h" #include "ObjManListCtrl.h" #include "UndoManager.h" #include "NameManager.h" #include "GameInterface.h" #include "ObjProps.h" #include "DrawInfo.h" void BaseEdObject::RotateBy(UnitQuaternion &rot) { UnitQuaternion new_mat; new_mat.Multiply(rot,RotQuat); SetRot(new_mat); } void BaseEdObject::RotateAround(Point3D &pnt,UnitQuaternion &vct) { LinearMatrix4D m1,m2; m1.Multiply(GetMat(),LinearMatrix4D(Point3D(-pnt.x,-pnt.y,-pnt.z))); m2.Multiply(m1,LinearMatrix4D(vct)); m1.Multiply(m2,LinearMatrix4D(pnt)); SetMat(m1); } LinearMatrix4D BaseEdObject::GetMat() { LinearMatrix4D mat(RotQuat); mat.BuildTranslation(Pos); return mat; } void BaseEdObject::SetMat(const LinearMatrix4D &mat) { RotQuat=mat; Pos=mat; UpdateMat(); } void BaseEdObject::Copy( BaseEdObject &obj) { RotQuat=obj.RotQuat; Pos=obj.Pos; } ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// EdGUIObject::EdGUIObject(CString name,Point3D l) { LineCount=0; LineList=NULL; HoverElevation=0.0f; SetPos(l); ScreenDiv=100; RadiusSqu=0.0f; Selected=false; Visual=true; Hidden=false; InMap=false; Frozen=false; DrawPen=DrawInfo::HelperPen; SelPen=DrawInfo::SelectPen; Parent=NULL; ReferenceCount=0; // TestData LineCount=0; LineList=NULL; SetName(name); } void EdGUIObject::SetPen(DrawInfo &dinf) { if(IsSelected()) dinf.SetPen(SelPen); else dinf.SetPen(DrawPen); } void EdGUIObject::BuildRadius() { if(!IsVisual()) return; int cl; Scalar gdist=0,dist=0; Point3D p1,p2,loc; loc=GetPos(); for(cl=0;clgdist?dist:gdist; dist=(p2.x-loc.x)*(p2.x-loc.x)+(p2.z-loc.z)*(p2.z-loc.z); gdist=dist>gdist?dist:gdist; } RadiusSqu=gdist; } bool EdGUIObject::InRadius( Point3D &pnt) { if(IsHidden()) return false; Point3D loc=GetPos(); Scalar dist=(pnt.x-loc.x)*(pnt.x-loc.x)+(pnt.z-loc.z)*(pnt.z-loc.z); return dist<=RadiusSqu; } EdGUIObject::~EdGUIObject() { // Verify(ReferenceCount==0); NameManager::Instance->RemoveString(Name); if(LineList) delete LineList; } void EdGUIObject::GetLine(int idx,Point3D *start,Point3D *end) { Verify(idxy=0.0f; *end=LineList[idx].End; *end*=mat; end->y=0.0f; } Scalar EdGUIObject::GetRadius() { return (Scalar)sqrt(RadiusSqu); } bool EdGUIObject::InsideBox( Point3D &tl, Point3D &br) { if(IsHidden()) return false; Scalar rad=GetRadius(); Point3D loc=GetPos(); if(tl.x=(loc.x+rad) && br.z>=(loc.z+rad) ); } else { return ( br.x<=(loc.x-rad) && br.z<=(loc.z-rad) && tl.x>=(loc.x+rad) && tl.z>=(loc.z+rad) ); } } bool EdGUIObject::IntersectsBox( Point3D &tl, Point3D &br) { if(IsHidden()) return false; Scalar rad=GetRadius(); Point3D loc=GetPos(); if(tl.xbr.z || (loc.x+rad)br.x) ; } else { return !( (loc.z+rad)tl.z || (loc.x+rad)tl.x) ; } } bool EdGUIObject::InDisplayRegion(DrawInfo &dinf) { Point3D tl,br; dinf.vinf.GetViewLimits(&tl,&br); return IntersectsBox(tl,br); } EdGUIObject *EdGUIObject::Clone() { EdGUIObject *obj=new EdGUIObject; obj->Copy(*this); return obj; } void EdGUIObject::Copy( EdGUIObject &obj) { BaseEdObject::Copy(obj); LineCount=obj.LineCount; Selected=obj.Selected; RadiusSqu=obj.RadiusSqu; SetName(obj.Name); if(LineList) {delete LineList; LineList=NULL;} if(LineCount>0) LineList=new GUILine[LineCount]; for(int i=0;i