public void DestoryController(object sender, EventArgs e) { OnDeleteReferences(this, EventArgs.Empty); view.OnParameterValueChanged -= ParameterValueChanged; view.OnSceneObjectValueChanged -= SceneObjectValueChanged; view.OnDestroyController -= DestoryController; view.OnDeleteSceneObject -= DeleteSceneObject; view.TestRandomize -= TestRandomize; if (model is CameraSceneObjectModel model1) { model1.OnCreateImage -= CreateImage; model1.OnSetMainCamera -= SetMainCamera; model1.OnSetDefaultCamera -= SetDefaultCamera; } foreach (var parameter in model.Parameter) { parameter.OnUpdateSceneObjectView -= UpdateSceneObjectView; } if (!IsViewNull()) { UnityEngine.Object.Destroy(view.GetGameObject()); } view = null; model = null; }
public SceneObjectController(AbstractSceneObjectModel model, ISceneObjectView view) { this.model = model; this.view = view; view.OnParameterValueChanged += ParameterValueChanged; view.OnSceneObjectValueChanged += SceneObjectValueChanged; view.OnDestroyController += DestoryController; view.TestRandomize += TestRandomize; view.OnDeleteSceneObject += DeleteSceneObject; foreach (var parameter in model.Parameter) { parameter.OnUpdateSceneObjectView += UpdateSceneObjectView; } }
private void LoadSceneObjects() { foreach (var model in model.ObjectsInScene) { GameObject sceneObject = new GameObject(); sceneObject = model.ItemModel.ApplyItemProperties(sceneObject); ISceneObjectView sceneObjectView = model.CreateView(sceneObject); ISceneObjectController sceneObjectController = new SceneObjectController(model, sceneObjectView); if (model is ModelSceneObjectModel || model is RegionSceneObjectModel) { sceneObject.layer = LayerMask.NameToLayer("SceneObject"); } else if (model is CameraSceneObjectModel) { sceneObject.layer = LayerMask.NameToLayer("Visualization"); ((CameraSceneObjectModel)model).OnCreateImage += sceneObjectController.CreateImage; ((CameraSceneObjectModel)model).OnSetMainCamera += sceneObjectController.SetMainCamera; ((CameraSceneObjectModel)model).OnSetDefaultCamera += sceneObjectController.SetDefaultCamera; } else if (model is AbstractLightSceneObjectModel) { sceneObject.layer = LayerMask.NameToLayer("Visualization"); } OnDestroyController += sceneObjectController.DestoryController; OnRequestSceneObjectParameter += sceneObjectController.RequestParameter; sceneObjectController.OnSendParameter += DisplaySceneObjectParameter; sceneObjectController.OnDeleteReferences += DeleteReferences; sceneObjectController.OnUpdateArrow += UpdateArrow; sceneObjectController.OnDeleteSceneObject += DeleteSelectionModel; foreach (var parameter in model.Parameter) { parameter.UpdateParameterOnSceneObject(sceneObject); } } }
private GameObject CreateSceneObject <T>(T model) where T : AbstractItemModel { GameObject sceneObject = new GameObject(); sceneObject = model.ApplyItemProperties(sceneObject); AbstractSceneObjectModel sceneObjectModel = model.CreateSceneObjectModel(); foreach (var parameter in sceneObjectModel.Parameter) { parameter.InitFromGameObject(sceneObject); } ISceneObjectView sceneObjectView = sceneObjectModel.CreateView(sceneObject); ISceneObjectController sceneObjectController = new SceneObjectController(sceneObjectModel, sceneObjectView); this.model.AddSceneObject(sceneObjectModel); OnDestroyController += sceneObjectController.DestoryController; OnRequestSceneObjectParameter += sceneObjectController.RequestParameter; sceneObjectController.OnSendParameter += DisplaySceneObjectParameter; sceneObjectController.OnDeleteReferences += DeleteReferences; sceneObjectController.OnUpdateArrow += UpdateArrow; sceneObjectController.OnDeleteSceneObject += DeleteSelectionModel; return(sceneObject); }
private void Update() { //Item selection if (state == State.Idle || state == State.ItemSelection) { if (Input.GetMouseButtonUp(0) && !IsMouseOverUI()) { RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, Mathf.Infinity, LayerMask.GetMask("SceneObject", "Visualization"))) { SceneObjectSelectedEventArgs args = new SceneObjectSelectedEventArgs(); args.Selection = hit.transform.gameObject; OnSceneObjectSelected(this, args); } else { if (Selection != null) { OnSceneObjectDeselected(); } } } } //Delete selected sceneobject with DeleteKey if (state == State.ItemSelection) { if (Input.GetKeyUp(KeyCode.Delete)) { ISceneObjectView view = Selection.GetComponent <ISceneObjectView>(); if (view != null) { SceneObjectSelectedEventArgs args = new SceneObjectSelectedEventArgs(); view.DeleteSceneObject(); args.Selection = Selection; OnHideParameter(this, args); Selection.GetComponent <SceneObjectView>().DestoyController(); } else { OnDefaultSunDeleted(); } Destroy(Selection); Arrow.SetActive(false); state = State.Idle; Selection = null; } } //During texture placement if (state == State.TexturePlacement) { if (!IsMouseOverUI()) { RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, Mathf.Infinity, LayerMask.GetMask("SceneObject"))) { Selection.transform.position = hit.point; if (Input.GetMouseButtonUp(0)) { ISceneObjectView view = hit.transform.GetComponent <ISceneObjectView>(); if (view != null) { StoreParameterEventArgs args = new StoreParameterEventArgs(Constants.SceneObjectParameter.TEXTURE); args.Value = Selection.GetComponent <Renderer>().material; view.ParameterValueChanged(this, args); } } } else { Vector3 pos = Input.mousePosition; pos.z = objectDistance; Selection.transform.position = Camera.main.ScreenToWorldPoint(pos); } } if (Input.GetMouseButtonUp(1)) { Destroy(Selection); Selection = null; state = State.Idle; } } //During moving with Arrow if (state == State.SelectionMovement) { if (Input.GetMouseButtonUp(0)) { Direction = Vector3.zero; state = State.ItemSelection; } else { Vector2 diff = Input.mousePosition - lastMousePosition; float movementSpeed = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift) ? 0.1f : 0.5f; Selection.transform.position += Direction * movementSpeed * (diff.x + diff.y); lastMousePosition = Input.mousePosition; Selection.GetComponent <ISceneObjectView>().SceneObjectValueChanged(Constants.SceneObjectParameter.POSITION, Selection.transform.position); MoveArrow(); } } //During placement of an item if (Selection != null && state == State.ItemPlacement) { //Dont show item above UI if (!IsMouseOverUI()) { RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, Mathf.Infinity, LayerMask.GetMask("SceneObject", "Visualization"))) { if (hit.transform.tag != "Arrow") { Selection.transform.position = hit.point; } } else { Vector3 pos = Input.mousePosition; pos.z = objectDistance; Selection.transform.position = Camera.main.ScreenToWorldPoint(pos); } MoveArrow(); Selection.GetComponent <ISceneObjectView>().SceneObjectValueChanged(Constants.SceneObjectParameter.POSITION, Selection.transform.position); if (Input.GetMouseButtonUp(0)) { OnPlaceItem(this, EventArgs.Empty); } if (Input.GetMouseButtonUp(1)) { Selection.GetComponent <ISceneObjectView>().DeleteSceneObject(); Selection.GetComponent <ISceneObjectView>().DestoyController(); Destroy(Selection); Arrow.SetActive(false); Selection = null; state = State.Idle; } } } }