Commit e639b710 authored by Sergey Paskhalov's avatar Sergey Paskhalov
Browse files

Merge branch 'ARStructureUI' into 'master'

Привзяка структур к местности в AR

See merge request avvy/mobile-app!51
parents 0258e847 29eb92d5
Showing with 1739 additions and 224 deletions
+1739 -224
......@@ -116,5 +116,13 @@ public class StructureBinderTest : MonoBehaviour
}
BindingsText.text = text;
}
public void LoadDom()
{
Debug.Log("Started");
structures.LoadDom("01b92e6e-5869-4c07-9372-d1bd2880bce0", (l) => Debug.Log($"Loaded"));
}
}
......@@ -336,6 +336,7 @@ RectTransform:
- {fileID: 1462747765}
- {fileID: 927021750}
- {fileID: 1183705281}
- {fileID: 2041833452}
- {fileID: 245223832}
- {fileID: 1732567434}
m_Father: {fileID: 0}
......@@ -460,7 +461,7 @@ RectTransform:
m_Children:
- {fileID: 1107021597}
m_Father: {fileID: 69652862}
m_RootOrder: 5
m_RootOrder: 6
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1}
......@@ -1450,7 +1451,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1}
m_AnchoredPosition: {x: 0, y: -982}
m_AnchoredPosition: {x: 0, y: -941}
m_SizeDelta: {x: 900, y: 140}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1183705282
......@@ -1622,6 +1623,87 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1191170383}
m_CullTransparentMesh: 0
--- !u!1 &1230906155
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1230906156}
- component: {fileID: 1230906158}
- component: {fileID: 1230906157}
m_Layer: 5
m_Name: Text
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1230906156
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1230906155}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 2041833452}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1230906157
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1230906155}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 708705254, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_RaycastTarget: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
m_FontData:
m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
m_FontSize: 72
m_FontStyle: 0
m_BestFit: 0
m_MinSize: 7
m_MaxSize: 72
m_Alignment: 4
m_AlignByGeometry: 0
m_RichText: 1
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: 'LoadDom
'
--- !u!222 &1230906158
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1230906155}
m_CullTransparentMesh: 0
--- !u!1 &1462747764
GameObject:
m_ObjectHideFlags: 0
......@@ -1782,7 +1864,7 @@ RectTransform:
m_Children:
- {fileID: 891397866}
m_Father: {fileID: 69652862}
m_RootOrder: 6
m_RootOrder: 7
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
......@@ -1936,3 +2018,132 @@ Transform:
m_Father: {fileID: 0}
m_RootOrder: 5
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &2041833451
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2041833452}
- component: {fileID: 2041833455}
- component: {fileID: 2041833454}
- component: {fileID: 2041833453}
m_Layer: 5
m_Name: LoadDom
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2041833452
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2041833451}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1230906156}
m_Father: {fileID: 69652862}
m_RootOrder: 5
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1}
m_AnchoredPosition: {x: 0, y: -1113}
m_SizeDelta: {x: 900, y: 140}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2041833453
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2041833451}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 1392445389, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 3
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 2041833454}
m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1924766678}
m_MethodName: LoadDom
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
m_TypeName: UnityEngine.UI.Button+ButtonClickedEvent, UnityEngine.UI, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null
--- !u!114 &2041833454
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2041833451}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: -765806418, guid: f70555f144d8491a825f0804e09c671c, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_TypeName: UnityEngine.UI.MaskableGraphic+CullStateChangedEvent, UnityEngine.UI,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
--- !u!222 &2041833455
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2041833451}
m_CullTransparentMesh: 0
This diff is collapsed.
using System;
public class NewClass
{
public NewClass()
{
}
}
......@@ -22,7 +22,7 @@ namespace AvvyLand.API
this.jsonSerializer = jsonSerializer;
}
public void AddStructure(Lot lot, Structure structure, Vector2d position, Vector3 rotation, Action<StructureBinding> onCompleate = null)
public void AddStructure(Lot lot, Structure structure, Vector2d position, Vector4 rotation, Action<StructureBinding> onCompleate = null)
{
try
{
......@@ -162,7 +162,7 @@ namespace AvvyLand.API
}
}
public void UpdateStructurePosition(StructureBinding sb, Vector2d position, Vector3 rotation, Action<StructureBinding> onCompleate = null)
public void UpdateStructurePosition(StructureBinding sb, Vector2d position, Vector4 rotation, Action<StructureBinding> onCompleate = null)
{
try
{
......@@ -198,13 +198,13 @@ namespace AvvyLand.API
public string StrucureId;
[JsonConverter(typeof(Vector2dAsCoordinateConverter))]
public Vector2d Position;
public Vector3 Rotation;
public Vector4 Rotation;
}
public interface IStructureBinder
{
void AddStructure(Lot lot, Structure structure, Vector2d position, Vector3 rotation, Action<StructureBinding> onCompleate = null);
void UpdateStructurePosition(StructureBinding sb, Vector2d position, Vector3 rotation, Action<StructureBinding> onCompleate = null);
void AddStructure(Lot lot, Structure structure, Vector2d position, Vector4 rotation, Action<StructureBinding> onCompleate = null);
void UpdateStructurePosition(StructureBinding sb, Vector2d position, Vector4 rotation, Action<StructureBinding> onCompleate = null);
void RemoveStructure(StructureBinding id, Action onCompleate = null);
void RemoveAllStructures(Lot lot, Action onCompleate = null);
void LoadAllStructuresInLot(Lot lot, Action<Dictionary<string, StructureBinding>> onCompleate);
......
......@@ -118,9 +118,9 @@ namespace AvvyLand.API
}
public void LoadDom(Structure structure, Action<Domido.Model.Structure> OnGetted)
public void LoadDom(string domId, Action<Domido.Model.Structure> OnGetted)
{
var path = WebUtils.Combine(APIConfig.DomModelsReference, structure.DOMId);
var path = WebUtils.Combine(APIConfig.DomModelsReference, domId);
FirebaseDatabase.DefaultInstance
.GetReference(path)
.GetValueAsync()
......@@ -142,12 +142,17 @@ namespace AvvyLand.API
}
catch (Exception e)
{
Debug.LogError($"Error while loading DOM {structure.DOMId}: {e.Message}\n{e.StackTrace}");
Debug.LogError($"Error while loading DOM {domId}: {e.Message}\n{e.StackTrace}");
}
}
}, TaskScheduler.FromCurrentSynchronizationContext());
}
public void LoadDom(Structure structure, Action<Domido.Model.Structure> OnGetted)
{
LoadDom(structure.DOMId, OnGetted);
}
public void SaveDom(Structure structure, Domido.Model.Structure DOM, Action<Structure> onSaved = null)
{
......@@ -190,6 +195,7 @@ namespace AvvyLand.API
void SaveStructure(Structure structure, Action<Structure> onSaved = null);
void LoadStructure(string id, Action<Structure> onLoaded);
void LoadDom(Structure structure, Action<Domido.Model.Structure> OnGetted);
void LoadDom(string domId, Action<Domido.Model.Structure> OnGetted);
void SaveDom(Structure structure, Domido.Model.Structure DOM, Action<Structure> onSaved = null);
}
}
using AvvyLand.Model;
using AvvyLand.UI;
using UnityEngine;
using UnityEngine.EventSystems;
using Zenject;
namespace AvvyLand.AR
{
public class ARPlayerIteractionListener : MonoBehaviour
{
private AddressBuilder addressBuilder;
private LotProfileFiller profileFiller;
private TKTapRecognizer recognizer;
private ICurrentLotProvider currentLotProvider;
[Inject]
void Init(AddressBuilder addressBuilder, LotProfileFiller profileFiller, ICurrentLotProvider currentLotProvider)
{
this.addressBuilder = addressBuilder;
this.profileFiller = profileFiller;
this.currentLotProvider = currentLotProvider;
}
private void OnEnable()
{
if (recognizer == null)
CreateRecognizer();
SetOn();
}
private void OnDisable()
{
SetOff();
}
private void CreateRecognizer()
{
recognizer = new TKTapRecognizer();
recognizer.gestureRecognizedEvent += r =>
{
if (!EventSystem.current.IsPointerOverGameObject())
{
OpenLotProfile();
}
};
}
private void SetOn()
{
TouchKit.addGestureRecognizer(recognizer);
}
private void SetOff()
{
TouchKit.removeGestureRecognizer(recognizer);
}
private void OpenLotProfile()
{
var viewer = currentLotProvider.CurrentLotVisualizer;
if (viewer == null)
return;
var lot = viewer.Lot;
var address = addressBuilder.Build(lot);
profileFiller.FillAndOpen(address, lot, () => SetOn());
SetOff();
}
}
}
fileFormatVersion: 2
guid: 9d1d609a413344cbeb2d94ad5d38867e
guid: c3c0b6c32a56245c9a1ff71cb44e255d
MonoImporter:
externalObjects: {}
serializedVersion: 2
......
......@@ -4,11 +4,13 @@ using System.Collections.Generic;
using System.Linq;
using AvvyLand.API;
using AvvyLand.Model;
using Domido.AppCore;
using Mapbox.Unity.Ar;
using Mapbox.Unity.Location;
using Mapbox.Unity.Map;
using Mapbox.Utils;
using TMPro;
using Unity.Mathematics;
using UnityEngine;
using Zenject;
......@@ -23,23 +25,28 @@ namespace AvvyLand.AR
public RectTransform arControlObjects;
public GameObject arAlignedObjects;
public Transform lotsContainer;
public Transform structuresContainer;
public int lotSquareSize;
}
public ARLotVisualizer CurrentLotVisualizer { get; set; }
public Lot CurrentLot => CurrentLotVisualizer?.Lot;
}
private ARStateMachine aRState;
private Settings settings;
private ILots lots;
private IStructureBinder structureBinder;
private IStructures structures;
private ARLotVisualizerBuilder lotViewBuilder;
private AbstractMap map;
private EntityFromDOMLoader entityLoader;
private ARStructBinder aRStructBinder;
private ILocationProvider locationProvider;
AbstractAlignmentStrategy alignmentStrategy;
public ARSceneController(AbstractMap map, ARStateMachine aRState, Settings settings, ILots lots, ARLotVisualizerBuilder lotViewBuilder, AbstractAlignmentStrategy alignmentStrategy)
public ARSceneController(AbstractMap map, ARStateMachine aRState, Settings settings,
ILots lots, ARLotVisualizerBuilder lotViewBuilder, AbstractAlignmentStrategy alignmentStrategy,
IStructureBinder structureBinder, EntityFromDOMLoader entityLoader,
IStructures structures, ARStructBinder aRStructBinder)
{
this.settings = settings;
this.aRState = aRState;
......@@ -48,6 +55,10 @@ namespace AvvyLand.AR
this.map = map;
this.lots = lots;
this.alignmentStrategy = alignmentStrategy;
this.structureBinder = structureBinder;
this.entityLoader = entityLoader;
this.structures = structures;
this.aRStructBinder = aRStructBinder;
}
......@@ -83,12 +94,31 @@ namespace AvvyLand.AR
view = loadedLotsDictionary[lot];
view.Lot = lot;
loadedLotsDictionary[lot] = view;
loadedLotsDictionary[lot] = view;
}
LoadStructuresForLots(d);
});
}
}
private void LoadStructuresForLots(Dictionary<string, Lot> targetLots)
{
structureBinder.LoadAllStructuresInLots(targetLots.Values.ToList(), (rez) =>
{
foreach (var sb in rez.Values)
{
structures.LoadDom(sb.DomModelId,(dom) =>
{
entityLoader.LoadEnity(dom, (entity) =>
{
aRStructBinder.AdjustStructureForSb(entity, sb);
});
});
}
}
);
}
void ARState_StateChanged(ARStateMachine.State obj)
{
if(obj == ARStateMachine.State.Ready)
......
using UnityEngine;
using System.Collections;
using AvvyLand.Model;
using UnityEngine.UI;
using System;
using AvvyLand.API;
using Zenject;
using Domido.AppCore;
using AvvyLand.Editor.Tools;
using Domido.Tools;
using Mapbox.Unity.Map;
using Unity.Mathematics;
using static AvvyLand.AR.ARSceneController;
namespace AvvyLand.AR
{
public class ARStructBinder : MonoBehaviour
{
[SerializeField]
private RectTransform structureBinderUI;
[SerializeField]
private Button addButton;
[SerializeField]
private Button cancelButton;
private IStructures structures;
private IStructureBinder structureBinder;
private EntityFromDOMLoader entityLoader;
private AbstractMap map;
private ARPlayerIteractionListener aRPlayerIteractionListener;
private Settings settings;
private Lot currentLot;
private Structure currentStructure;
// Use this for initialization
void Start()
{
addButton.onClick.AddListener(OnAddClick);
cancelButton.onClick.AddListener(OnCancelClick);
}
[Inject]
void Init(ILots lots, IStructures structures, IStructureBinder structureBinder,
EntityFromDOMLoader entityLoader, ARPlayerIteractionListener aRPlayerIteractionListener,
AbstractMap map, Settings settings)
{
this.settings = settings;
this.structures = structures;
this.structureBinder = structureBinder;
this.entityLoader = entityLoader;
this.map = map;
this.aRPlayerIteractionListener = aRPlayerIteractionListener;
}
void OnAddClick()
{
Hide();
structures.LoadDom(currentStructure, (obj) =>
{
entityLoader.LoadEnity(obj, ModelLoaded);
});
}
void ModelLoaded(Unity.Entities.Entity obj)
{
//расчитываем положение для объекта
var cameraTransform = Camera.main.transform;
var delta = Vector3.Normalize(new Vector3(cameraTransform.forward.x, 0, cameraTransform.forward.z));
var targetPos = cameraTransform.position + delta; //вычисляем позицию объекта как позицию камеры + смещение на 1 метр в сторону куда камера смотрит.
targetPos.y = map.transform.position.y;//"приземляем" позицию на землю (нужно только для корректного отображаения в начале)
var pos = map.WorldToGeoPosition(targetPos);
//сохраняем позицию объекта в базу
structureBinder.AddStructure(currentLot, currentStructure, pos, Vector4.zero, (s) =>
AdjustStructureForSb(obj, s));//когда структура будет "сохранена" в базу, добавляем объект в сцену
}
public void AdjustStructureForSb(Unity.Entities.Entity entity, StructureBinding sb)
{
//создаем GO для загруженной структуры
var go = new GameObject(sb.Id);
var targetPos = map.GeoToWorldPosition(sb.Position, false);
targetPos.y = map.transform.position.y;//"приземляем" позицию на землю (нужно только для корректного отображаения в начале)
//задаем нужную позицию и поворот для GO загруженной сущности
go.transform.position = targetPos;
go.transform.rotation = new quaternion(sb.Rotation);
//добавляем компонент TransformToEntityPositionController который будет копировать позицию объекта в сущность
var tCont = go.AddComponent<TransformToEntityPositionController>();
tCont.Entity = entity;
//на случай, если карта будет смещается задаем родителя. За счет этого структуры будут двигаться вместе с картой
go.transform.SetParent(settings.structuresContainer);
}
void OnCancelClick()
{
currentLot = null;
currentStructure = null;
Hide();
}
public void Hide()
{
structureBinderUI.gameObject.SetActive(false);
aRPlayerIteractionListener.enabled = true;
}
public void Show()
{
structureBinderUI.gameObject.SetActive(true);
aRPlayerIteractionListener.enabled = false;
}
public void AddNewStructure(Lot lot, Structure structure)
{
currentLot = lot;
currentStructure = structure;
Show();
}
}
}
fileFormatVersion: 2
guid: 87e816541ef44be44b468dc1562ea9f8
folderAsset: yes
DefaultImporter:
guid: cf79edd0869984c48bcf7bceef7ce750
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System;
using AvvyLand.Editor.Tools;
using Domido.AppCore;
using Domido.Model;
using Domido.Tools;
using Unity.Entities;
namespace AvvyLand.AR
{
public class EntityFromDOMLoader
{
private EntityBuilder entityBuilder;
private EditorTools editorTools;
private ICoroutineProvider coroutineProvider;
public EntityFromDOMLoader(EntityBuilder entityBuilder, EditorTools editorTools, ICoroutineProvider coroutineProvider)
{
this.entityBuilder = entityBuilder;
this.editorTools = editorTools;
this.coroutineProvider = coroutineProvider;
}
public void LoadEnity(Structure dom, Action<Entity> onLoaded)
{
var bom = editorTools.ConvertDomObjectModel(dom);
coroutineProvider.StartCoroutine(entityBuilder.Build(bom, onLoaded));
}
}
}
fileFormatVersion: 2
guid: a639db72264614035a8f191c525541f0
DefaultImporter:
guid: 257986c3436074838b1d0b780f010d41
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
#pragma warning disable 0649
using AvvyLand.Editor.Tools;
using Mapbox.Unity.Ar;
using Mapbox.Unity.Map;
using UnityEngine;
......@@ -17,16 +18,26 @@ namespace AvvyLand.AR
ARSceneController.Settings arSceneControllerSettings;
[SerializeField]
AbstractMap map;
[SerializeField]
ARStructBinder aRStructBinder;
[SerializeField]
SelectActiveLotOnEnter currentLotProvider;
public override void InstallBindings()
{
Container.Bind<ARCameraCompassAlignment>().FromInstance(aRCameraCompassAlignment);
Container.Bind<ARSceneController.Settings>().FromInstance(arSceneControllerSettings);
Container.Bind<AbstractAlignmentStrategy>().FromInstance(alignmentStrategy);
Container.Bind<AbstractMap>().FromInstance(map);
Container.Bind<ARCameraCompassAlignment>().FromInstance(aRCameraCompassAlignment).AsSingle();
Container.Bind<ARSceneController.Settings>().FromInstance(arSceneControllerSettings).AsSingle();
Container.Bind<AbstractAlignmentStrategy>().FromInstance(alignmentStrategy).AsSingle();
Container.Bind<ARStructBinder>().FromInstance(aRStructBinder).AsSingle();
Container.Bind<AbstractMap>().FromInstance(map).AsSingle();
Container.Bind<ICurrentLotProvider>().FromInstance(currentLotProvider).AsSingle();
Container.Bind(typeof(ARStateMachine), typeof(IInitializable)).To<ARStateMachine>().AsSingle();
Container.Bind(typeof(ARSceneController), typeof(IInitializable)).To<ARSceneController>().AsSingle().NonLazy();
Container.Bind(typeof(ARSceneController), typeof(IInitializable)).To<ARSceneController>().AsSingle().NonLazy();
Container.Bind<ARPlayerIteractionListener>().FromNewComponentOnNewGameObject().AsSingle().NonLazy();
Container.Bind<EntityFromDOMLoader>().AsSingle();
Container.Bind<EditorTools>().AsSingle();
}
}
}
\ No newline at end of file
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using AvvyLand.API;
using AvvyLand.AR;
using UnityEngine;
using Zenject;
public class MockStructureSelectMenu : MonoBehaviour
{
private ARStructBinder structBinder;
private IStructures structures;
private ICurrentLotProvider currentLotProvider;
private AvvyUserProvider userProvider;
[Inject]
void Init(IStructures structures, ICurrentLotProvider currentLotProvider, AvvyUserProvider userProvider, ARStructBinder structBinder)
{
this.structures = structures;
this.currentLotProvider = currentLotProvider;
this.userProvider = userProvider;
this.structBinder = structBinder;
}
public void SelectLastSctructure()
{
structures.GetUserStructures(userProvider.User,(structures) =>
{
var lot = currentLotProvider.CurrentLot;
var structure = structures.Values.Last();
structBinder.AddNewStructure(lot, structure);
});
}
}
fileFormatVersion: 2
guid: fc095558cb0c84488a33e76f0a000549
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System.Collections;
using System.Collections.Generic;
using AvvyLand.Model;
using UnityEngine;
using Zenject;
namespace AvvyLand.AR
{
public class SelectActiveLotOnEnter : MonoBehaviour
{
private ARSceneController aRSceneController;
public class SelectActiveLotOnEnter : MonoBehaviour, ICurrentLotProvider
{
[SerializeField]
private Color defaultColor;
[SerializeField]
private Color selectedColor;
[Inject]
void Init(ARSceneController aRSceneController)
{
this.aRSceneController = aRSceneController;
}
private Color selectedColor;
private void OnTriggerEnter(Collider other)
{
var arLotVisualizer = other.GetComponent<ARLotVisualizer>();
if (arLotVisualizer != null)
if (arLotVisualizer != null && CurrentLotVisualizer != arLotVisualizer)
{
DeselectLot(aRSceneController.CurrentLotVisualizer);
DeselectLot(CurrentLotVisualizer);
SelectLot(arLotVisualizer);
aRSceneController.CurrentLotVisualizer = arLotVisualizer;
CurrentLotVisualizer = arLotVisualizer;
}
}
......@@ -45,5 +38,14 @@ namespace AvvyLand.AR
aRLotVisualizer.Line.sortingOrder = 0;
}
}
public ARLotVisualizer CurrentLotVisualizer { get; set; }
public Lot CurrentLot => CurrentLotVisualizer?.Lot;
}
public interface ICurrentLotProvider
{
ARLotVisualizer CurrentLotVisualizer { get; set; }
Lot CurrentLot { get; }
}
}
......@@ -23,9 +23,10 @@ namespace AvvyLand.Editor
private GameObject blockPrefab;
private EntityManager entityManager;
private EntityBuilder entityBuilder;
private EntityManager entityManager;
private IProjectProvider projectProvider;
private EditorTools editorTools;
private EntityBuilder entityBuilder;
private IClient client;
private RaycastHit hit;
......@@ -42,12 +43,12 @@ namespace AvvyLand.Editor
[Zenject.Inject]
public void Init(IProjectProvider projectProvider,
EntityBuilder entityBuilder, EntityBuilderConfig config)
public void Init(IProjectProvider projectProvider, EntityBuilderConfig config, EditorTools editorTools, EntityBuilder entityBuilder)
{
this.projectProvider = projectProvider;
this.entityBuilder = entityBuilder;
this.projectProvider = projectProvider;
this.blockPrefab = config.BlockECSPrefab;
this.editorTools = editorTools;
this.entityBuilder = entityBuilder;
}
private void Start()
......@@ -97,8 +98,8 @@ namespace AvvyLand.Editor
var enumerator = entities.GetEnumerator();
entityManager.Instantiate(blockPrefab, entities);
if (coroutine == null)
{
yield return coroutine = StartCoroutine(entityBuilder.BuildEntity(construct, () => enumerator.MoveNext(), () => enumerator.Current, entityBuilder.ModelRoot, "Root/" + projectProvider.Root.Name));//projectProvider.Root.Name));
{
yield return coroutine = StartCoroutine(entityBuilder.BuildEntity(construct, () => enumerator.MoveNext(), () => enumerator.Current, editorTools.EditorModelRoot, "Root/" + projectProvider.Root.Name));//projectProvider.Root.Name));
coroutine = null;
}
entities.Dispose();
......
......@@ -4,6 +4,7 @@ using Newtonsoft.Json.Converters;
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.Entities;
using UnityEngine;
using Block = Domido.Model.Block;
......@@ -13,7 +14,20 @@ namespace AvvyLand.Editor.Tools
{
public Action OnAddCube;
private const string blockType = "basement-100-100-100";
public void ConvertDomObjectModel(DomObject domObject, Construction parent)
/// <summary>
/// Корень модели, которая сейчас редактируется в редакторе
/// </summary>
public Entity EditorModelRoot;
public BlockObjectModel ConvertDomObjectModel(DomObject domObject)
{
var bomModel = GetNewBOMModel();
FillConstructionFromDomObj(domObject, bomModel.root);
return bomModel;
}
public void FillConstructionFromDomObj(DomObject domObject, Construction parent)
{
if (domObject is Structure)
{
......@@ -26,7 +40,7 @@ namespace AvvyLand.Editor.Tools
parent.Items.Add(current);
foreach (var item in (domObject as Structure).Items)
{
ConvertDomObjectModel((DomObject)item, current);
FillConstructionFromDomObj((DomObject)item, current);
}
}
if (domObject is Block)
......
......@@ -37,13 +37,9 @@ namespace AvvyLand.Editor
public void CreateNewProject()
{
CreateNewProjectDomModel();
var bom = tools.GetNewBOMModel();
tools.ConvertDomObjectModel(projectProvider.Root, bom.root);
var bom = tools.ConvertDomObjectModel(projectProvider.Root);
entityBuilder.Clean();
coroutineProvider.StartCoroutine(entityBuilder.Build(bom));
coroutineProvider.StartCoroutine(entityBuilder.Build(bom, (m) => tools.EditorModelRoot = m));
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment