//------------------------------------------------------------------------------ // add //------------------------------------------------------------------------------ CCustomObject* __fastcall TUI_CustomControl::DefaultAddObject(TShiftState Shift, TBeforeAppendCallback before, TAfterAppendCallback after) { if (Shift==ssRBOnly){ ExecCommand(COMMAND_SHOWCONTEXTMENU,parent_tool->ClassID); return 0;} Fvector p,n; CCustomObject* obj=0; if (LUI->PickGround(p,UI->m_CurrentRStart,UI->m_CurrentRNorm,1,&n)){ // before callback SBeforeAppendCallbackParams P; if (before&&!before(&P)) return 0; string256 namebuffer; Scene->GenObjectName(parent_tool->ClassID, namebuffer, P.name_prefix.c_str()); obj=Scene->GetOTools(parent_tool->ClassID)->CreateObject(P.data, namebuffer); if (!obj->Valid()){ xr_delete(obj); return 0; } // after callback if (after&&!after(Shift, obj)){ xr_delete(obj); return 0; } obj->MoveTo(p,n); Scene->SelectObjects(false,parent_tool->ClassID); Scene->AppendObject(obj); if (Shift.Contains(ssCtrl)) ExecCommand(COMMAND_SHOW_PROPERTIES); if (!Shift.Contains(ssAlt)) ResetActionToSelect(); } return obj; }
bool __fastcall TUI_ControlSpawnAdd::Start(TShiftState Shift) { TfraSpawn* F = (TfraSpawn*)parent_tool->pFrame; if (F->ebAttachObject->Down){ CCustomObject* from = Scene->RayPickObject(UI->ZFar(), UI->m_CurrentRStart, UI->m_CurrentRDir, OBJCLASS_DUMMY, 0, 0); if (from->ClassID!=OBJCLASS_SPAWNPOINT){ ObjectList lst; int cnt = Scene->GetQueryObjects(lst,OBJCLASS_SPAWNPOINT,1,1,0); if (1!=cnt) ELog.DlgMsg(mtError,"Select one shape."); else{ CSpawnPoint* base = dynamic_cast<CSpawnPoint*>(lst.back()); R_ASSERT(base); if (base->AttachObject(from)){ if (!Shift.Contains(ssAlt)){ F->ebAttachObject->Down = false; ResetActionToSelect (); } }else{ ELog.DlgMsg(mtError,"Attach impossible."); } } }else{ ELog.DlgMsg(mtError,"Attach impossible."); } }else{ DefaultAddObject(Shift,AppendCallback); } return false; }
bool __fastcall TUI_ControlWallmarkAdd::Start(TShiftState Shift) { ESceneWallmarkTools* S = (ESceneWallmarkTools*)parent_tool; S->SelectObjects (false); wm_cnt = 0; if (S->AddWallmark(UI->m_CurrentRStart,UI->m_CurrentRNorm)){ wm_cnt++; if (!Shift.Contains(ssAlt)){ Scene->UndoSave (); ResetActionToSelect (); return false; }else return true; } return false; }
bool __fastcall TUI_ControlAIMapNodeAdd::Start(TShiftState Shift) { append_nodes = 0; Fvector p; ESceneAIMapTool* S = (ESceneAIMapTool*)parent_tool; if (S->PickObjects(p,UI->m_CurrentRStart,UI->m_CurrentRNorm,UI->ZFar())){ S->SelectObjects (false); append_nodes = S->AddNode(p,((TfraAIMap*)S->pFrame)->ebIgnoreConstraints->Down,((TfraAIMap*)S->pFrame)->ebAutoLink->Down,S->m_BrushSize); if (!Shift.Contains(ssAlt)){ if (append_nodes) Scene->UndoSave(); ResetActionToSelect(); return false; }else return true; } return false; }
bool __fastcall TUI_ControlWayPointAdd::Start(TShiftState Shift) { ObjectList lst; Scene->GetQueryObjects(lst,OBJCLASS_WAY,1,1,-1); TfraWayPoint* frame=(TfraWayPoint*)parent_tool->pFrame; if (1!=lst.size()){ ELog.DlgMsg(mtInformation,"Select one WayObject."); return false; } Fvector p; if (LUI->PickGround(p,UI->m_CurrentRStart,UI->m_CurrentRNorm,1)){ CWayObject* obj = (CWayObject*)lst.front(); R_ASSERT(obj); CWayPoint* last_wp=obj->GetFirstSelected(); CWayPoint* wp=obj->AppendWayPoint(); wp->MoveTo(p); if (frame->ebAutoLink->Down){ if (last_wp) last_wp->AddSingleLink(wp); } Scene->UndoSave(); } if (!Shift.Contains(ssAlt)) ResetActionToSelect(); return false; }
bool __fastcall TUI_ControlShapeAdd::Start(TShiftState Shift) { TfraShape* F = (TfraShape*)parent_tool->pFrame; if (F->ebAttachShape->Down){ CEditShape* from = dynamic_cast<CEditShape*>(Scene->RayPickObject(UI->ZFar(),UI->m_CurrentRStart, UI->m_CurrentRNorm, OBJCLASS_SHAPE, 0, 0)); if (from){ ObjectList lst; int cnt = Scene->GetQueryObjects(lst,OBJCLASS_SHAPE,1,1,0); if (1!=cnt) ELog.DlgMsg(mtError,"Select one shape."); else{ CEditShape* base = dynamic_cast<CEditShape*>(lst.back()); R_ASSERT(base); if (base!=from){ base->Attach(from); if (!Shift.Contains(ssAlt)){ F->ebAttachShape->Down = false; ResetActionToSelect (); } } } } }else DefaultAddObject(Shift,0,AfterAppendCallback); return false; }
bool TUI_ControlWallmarkAdd::End(TShiftState _Shift) { if (!_Shift.Contains(ssAlt))ResetActionToSelect(); if (wm_cnt) Scene->UndoSave (); return true; }
bool TUI_ControlAIMapNodeAdd::End(TShiftState _Shift) { if (!_Shift.Contains(ssAlt)) ResetActionToSelect(); if (append_nodes) Scene->UndoSave(); return true; }
bool __fastcall TUI_ControlObjectAdd::Start(TShiftState Shift) { if (Shift==ssRBOnly){ ExecCommand(COMMAND_SHOWCONTEXTMENU,OBJCLASS_SCENEOBJECT); return false;} TfraObject* fraObject = (TfraObject*)parent_tool->pFrame; VERIFY(fraObject); Fvector p,n; if(!LUI->PickGround(p,UI->m_CurrentRStart,UI->m_CurrentRNorm,1,&n)) return false; { // pick already executed (see top) ESceneObjectTools* ot = dynamic_cast<ESceneObjectTools*>(parent_tool); LPCSTR N; if (ot->IsAppendRandomActive()&&ot->m_AppendRandomObjects.size()){ N = ot->m_AppendRandomObjects[Random.randI(ot->m_AppendRandomObjects.size())].c_str(); }else{ N = ((TfraObject*)parent_tool->pFrame)->Current(); if(!N){ ELog.DlgMsg(mtInformation,"Nothing selected."); return false; } } string256 namebuffer; Scene->GenObjectName(OBJCLASS_SCENEOBJECT, namebuffer, N); CSceneObject *obj = xr_new<CSceneObject>((LPVOID)0,namebuffer); CEditableObject* ref = obj->SetReference(N); if (!ref){ ELog.DlgMsg(mtError,"TUI_ControlObjectAdd:: Can't load reference object."); xr_delete(obj); return false; } /* if (ref->IsDynamic()){ ELog.DlgMsg(mtError,"TUI_ControlObjectAdd:: Can't assign dynamic object."); xr_delete(obj); return false; } */ if (ot->IsAppendRandomActive()){ Fvector S; if (ot->IsAppendRandomRotationActive()){ Fvector p; p.set( Random.randF(ot->m_AppendRandomMinRotation.x,ot->m_AppendRandomMaxRotation.x), Random.randF(ot->m_AppendRandomMinRotation.y,ot->m_AppendRandomMaxRotation.y), Random.randF(ot->m_AppendRandomMinRotation.z,ot->m_AppendRandomMaxRotation.z)); obj->PRotation = p; } if (ot->IsAppendRandomScaleActive()){ Fvector s; if (ot->IsAppendRandomScaleProportional()){ s.x = Random.randF(ot->m_AppendRandomMinScale.x,ot->m_AppendRandomMaxScale.x); s.set (s.x,s.x,s.x); }else{ s.set( Random.randF(ot->m_AppendRandomMinScale.x,ot->m_AppendRandomMaxScale.x), Random.randF(ot->m_AppendRandomMinScale.y,ot->m_AppendRandomMaxScale.y), Random.randF(ot->m_AppendRandomMinScale.z,ot->m_AppendRandomMaxScale.z)); } obj->PScale = s; } } obj->MoveTo(p,n); Scene->SelectObjects(false,OBJCLASS_SCENEOBJECT); Scene->AppendObject( obj ); if (Shift.Contains(ssCtrl)) ExecCommand(COMMAND_SHOW_PROPERTIES); if (!Shift.Contains(ssAlt)) ResetActionToSelect(); } return false; }