コード例 #1
0
//------------------------------------------------------------------------------
// 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;
}
コード例 #2
0
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;
}
コード例 #3
0
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;
}
コード例 #4
0
ファイル: ESceneAIMapControls.cpp プロジェクト: 2asoft/xray
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;
}
コード例 #5
0
ファイル: ESceneWayControls.cpp プロジェクト: NeoAnomaly/xray
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;
}
コード例 #6
0
ファイル: ESceneShapeControls.cpp プロジェクト: 2asoft/xray
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;
}
コード例 #7
0
bool TUI_ControlWallmarkAdd::End(TShiftState _Shift)
{
	if (!_Shift.Contains(ssAlt))ResetActionToSelect();
	if (wm_cnt)	    			Scene->UndoSave		();
	return true;
}
コード例 #8
0
ファイル: ESceneAIMapControls.cpp プロジェクト: 2asoft/xray
bool TUI_ControlAIMapNodeAdd::End(TShiftState _Shift)
{
	if (!_Shift.Contains(ssAlt)) ResetActionToSelect();
    if (append_nodes) Scene->UndoSave();
	return true;
}
コード例 #9
0
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;
}