diff --git a/Assets/IATK/Editor/VisualisationEditor.cs b/Assets/IATK/Editor/VisualisationEditor.cs index fb684926..54013c55 100644 --- a/Assets/IATK/Editor/VisualisationEditor.cs +++ b/Assets/IATK/Editor/VisualisationEditor.cs @@ -827,7 +827,7 @@ static void CreateCSVDataSourcePrefab() [MenuItem("GameObject/IATK/Realtime Data Source", false, 10)] static void CreateRealtimeDataSourcePrefab() { - GameObject obj = new GameObject("[IATK] New Data Source"); + GameObject obj = new GameObject("[IATK] New Realtime Data Source"); obj.AddComponent(); Selection.activeGameObject = obj; } diff --git a/Assets/IATK/Scenes/ReatimeDataDemoScene.unity b/Assets/IATK/Scenes/ReatimeDataDemoScene.unity index fa7b6596..5fb4514a 100644 --- a/Assets/IATK/Scenes/ReatimeDataDemoScene.unity +++ b/Assets/IATK/Scenes/ReatimeDataDemoScene.unity @@ -334,6 +334,6 @@ MonoBehaviour: m_GameObject: {fileID: 522362264} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1ec03e67883d44248b0c15d6342fe69e, type: 3} + m_Script: {fileID: 11500000, guid: d34400e3345d47e40ab2c99948614677, type: 3} m_Name: m_EditorClassIdentifier: diff --git a/Assets/IATK/Scripts/Controller/Replicator.cs b/Assets/IATK/Scripts/Controller/Replicator.cs index bea869e4..26cc14e5 100644 --- a/Assets/IATK/Scripts/Controller/Replicator.cs +++ b/Assets/IATK/Scripts/Controller/Replicator.cs @@ -3,7 +3,6 @@ //20210708, initial working version using System; -using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -290,136 +289,118 @@ public void UpdateReplicas(string uid, string payload) public void UpdateDatasource(string uid, string payload) { Debug.Log("Replicator::UpdateDatasource uid= " + uid + ", payload=" + payload); - if (uid.Length > 0) + if (uid.Length <= 0 || !replicas.ContainsKey(uid) || payload.Length <= 0) return; + + var vis = replicas[uid].vis; + //TODO apply ds hee to vis + var dsInfo = JsonUtility.FromJson(payload); + Debug.Log("Replicator::UpdateDatasource dsInfo => " + dsInfo); + if (dsInfo == null || dsInfo.dataSourceDefinitions.Count <= 0) return; + + var dsName = dsInfo.dataSourceName; + var dsTypeStr = dsInfo.dataSourceType; + Type dsType = Type.GetType(dsTypeStr); + + Debug.Log("Replicator::UpdateDatasource type " + dsTypeStr + " vs " + dsType); + if (dsType == null || !dsType.Equals(typeof(RealtimeDataSource))) return; + + + + var dsGo = GameObject.Find("replique-" + dsName); //TODO check if it already exists + if (dsGo == null) { - if (replicas.ContainsKey(uid)) + dsGo = new GameObject("replique-" + dsName); + dsGo.AddComponent(dsType); + } + Component ds = dsGo.GetComponent(dsType); + + + + Debug.Log("Replicator::UpdateDatasource created ds ..."); + + vis.dataSource = ds as RealtimeDataSource; + Debug.Log("Replicator::UpdateDatasource set ds to vis ..."); + + Debug.Log("Replicator::UpdateDatasource found #defs = " + dsInfo.dataSourceDefinitions.Count); + foreach (var dsdef in dsInfo.dataSourceDefinitions) + { + if (dsdef.isSetUp) { - var vis = replicas[uid].vis; - if (payload.Length > 0) - { - //TODO apply ds hee to vis - var dsInfo = JsonUtility.FromJson(payload); - Debug.Log("Replicator::UpdateDatasource dsInfo => " + dsInfo); + continue; + } + var dKey = dsdef.accessKey; + var dDimName = dsdef.dimensionName; + var dPayload = dsdef.payload; - if (dsInfo != null) - { - var dsName = dsInfo.dataSourceName; - var dsTypeStr = dsInfo.dataSourceType; - Type dsType = Type.GetType(dsTypeStr); + Debug.Log("Replicator::UpdateDatasource adding defs => " + dKey + ", " + dDimName); - Debug.Log("Replicator::UpdateDatasource type " + dsTypeStr + " vs " + dsType); + var rtds = ds as RealtimeDataSource; + vis.dataSource = rtds; - if (dsType != null) - { - Component ds = null; - var dsGo = GameObject.Find("replique-" + dsName); //TODO check if it already exists - if (dsGo == null) - { - dsGo = new GameObject("replique-" + dsName); - ds = dsGo.AddComponent(dsType); - } - ds = dsGo.GetComponent(dsType); + //rtds.AddDefaultIdDimension(); + rtds.AddDimension("id", 0, 100); + for (var i = 0; i < 100; i++) + { + rtds.SetData("id", i); + } + rtds.AddDimension(dDimName, 0, 100); //was dKey + vis.updateView(0); - Debug.Log("Replicator::UpdateDatasource created ds ..."); + Debug.Log("Replicator::UpdateDatasource before calling GetStreamData"); - if (dsType.Equals(typeof(RealtimeDataSource))) - { - vis.dataSource = ds as RealtimeDataSource; - Debug.Log("Replicator::UpdateDatasource set ds to vis ..."); - - Debug.Log("Replicator::UpdateDatasource found #defs = " + dsInfo.dataSourceDefinitions.Count); - if (dsInfo.dataSourceDefinitions.Count > 0) - { - foreach (var dsdef in dsInfo.dataSourceDefinitions) - { - if (dsdef.isSetUp) - { - continue; - } - var dKey = dsdef.accessKey; - var dDimName = dsdef.dimensionName; - var dPayload = dsdef.payload; - - Debug.Log("Replicator::UpdateDatasource adding defs => " + dKey + ", " + dDimName); - - var rtds = ds as RealtimeDataSource; - vis.dataSource = rtds; - - //rtds.AddDefaultIdDimension(); - rtds.AddDimension("id", 0, 100); - for (var i = 0; i < 100; i++) - { - rtds.SetData("id", i); - } - rtds.AddDimension(dDimName, 0, 100); //was dKey - vis.updateView(0); - - Debug.Log("Replicator::UpdateDatasource before calling GetStreamData"); - - if (GetStreamData != null) - { - GetStreamData(dPayload, (string topic, string content) => - { - try - { - Debug.Log("Replicator::UpdateDatasource OnNewData => " + content); - //TODO add here json parser of your choice + if (GetStreamData == null) return; + GetStreamData(dPayload, (string topic, string content) => + { + try + { + Debug.Log("Replicator::UpdateDatasource OnNewData => " + content); + //TODO add here json parser of your choice #if true - var parsed = new Dictionary(); //this is only a placeholder for a json parser + var parsed = new Dictionary(); //this is only a placeholder for a json parser #else - object parsed = Json.JSON.Parse(content); + object parsed = Json.JSON.Parse(content); #endif - var val = parsed[dKey]; - - Debug.Log("Replicator::UpdateDatasource OnNewData parsed[" + dKey + "]=" + val); - - if (val != null && val.ToString().Length > 0) - { - double fVal; - bool isNum = double.TryParse(val.ToString(), out fVal); - if (isNum) - { - if (rtds != null) - { - //rtds.AddDataByStr(dDimName, (float)fVal); - rtds.SetData(dDimName, (float)fVal); - } - else - { - Debug.Log("Replicator::UpdateDatasource rtds is NULL!"); - } - } - else - { - //TODO handle string types here - } - - if (vis != null) - { - vis.updateView(0); - } - else - { - Debug.Log("Replicator::UpdateDatasource vis is NULL!"); - } - } - } - catch (Exception err) - { - Debug.Log("Replicator::UpdateDatasource ERROR => " + err); - } - return ""; - }); - } - dsdef.isSetUp = true; - } - } + var val = parsed[dKey]; + + Debug.Log("Replicator::UpdateDatasource OnNewData parsed[" + dKey + "]=" + val); + + if (val != null && val.ToString().Length > 0) + { + double fVal; + bool isNum = double.TryParse(val.ToString(), out fVal); + if (isNum) + { + if (rtds != null) + { + rtds.SetData(dDimName, (float)fVal); } + else + { + Debug.Log("Replicator::UpdateDatasource rtds is NULL!"); + } + } + else + { + //TODO handle string types here + } + if (vis != null) + { + vis.updateView(0); + } + else + { + Debug.Log("Replicator::UpdateDatasource vis is NULL!"); } } } - } + catch (Exception err) + { + Debug.Log("Replicator::UpdateDatasource ERROR => " + err); + } + return ""; + }); + dsdef.isSetUp = true; } } diff --git a/Assets/IATK/Scripts/Controller/Visualisation Util Classes/CreationConfiguration.cs b/Assets/IATK/Scripts/Controller/Visualisation Util Classes/CreationConfiguration.cs index f139d933..dd2c98bb 100644 --- a/Assets/IATK/Scripts/Controller/Visualisation Util Classes/CreationConfiguration.cs +++ b/Assets/IATK/Scripts/Controller/Visualisation Util Classes/CreationConfiguration.cs @@ -85,7 +85,7 @@ public void Serialize(string serializedObjectPath, CreationConfiguration cf) VisualisationHeight = cf.VisualisationHeight; VisualisationDepth = cf.VisualisationDepth; - //added for replication hook + // Replication hook this.UID = cf.uid; if (cf.ReplicationNotification != null) { cf.ReplicationNotification?.Invoke(cf.uid, JsonUtility.ToJson(this)); @@ -162,7 +162,7 @@ public enum Axis Z } - //added report to replication function + // Report to replication function public Func ReplicationNotification = null; public string uid; diff --git a/Assets/IATK/Scripts/Controller/Visualisations/ScatterplotVisualisation.cs b/Assets/IATK/Scripts/Controller/Visualisations/ScatterplotVisualisation.cs index fc05141f..483530c1 100644 --- a/Assets/IATK/Scripts/Controller/Visualisations/ScatterplotVisualisation.cs +++ b/Assets/IATK/Scripts/Controller/Visualisations/ScatterplotVisualisation.cs @@ -76,7 +76,10 @@ public override void CreateVisualisation() { for (int i = 0; i < viewList.Count; i++) { - viewList[i].SetColors(mapColoursPalette(visualisationReference.dataSource[visualisationReference.colorPaletteDimension].Data, visualisationReference.coloursPalette)); + if (viewList[i] != null && visualisationReference?.dataSource[visualisationReference?.colorPaletteDimension]?.Data != null) + { + viewList[i].SetColors(mapColoursPalette(visualisationReference.dataSource[visualisationReference.colorPaletteDimension].Data, visualisationReference.coloursPalette)); + } } } else if (viewList.Count > 0 && visualisationReference.colour != null) @@ -212,7 +215,10 @@ public override void UpdateVisualisation(PropertyType propertyType){ { for (int i = 0; i < viewList.Count; i++) { - viewList[i].SetColors(mapColoursPalette(visualisationReference.dataSource[visualisationReference.colorPaletteDimension].Data, visualisationReference.coloursPalette)); + if (viewList[i] != null && visualisationReference?.dataSource[visualisationReference?.colorPaletteDimension]?.Data != null) + { + viewList[i].SetColors(mapColoursPalette(visualisationReference.dataSource[visualisationReference.colorPaletteDimension].Data, visualisationReference.coloursPalette)); + } } } else diff --git a/Assets/IATK/Scripts/Demo/RTDS_Replicator_Test.unity b/Assets/IATK/Scripts/Demo/RTDS_Replicator_Test.unity index c423a97f..e4e02d16 100644 --- a/Assets/IATK/Scripts/Demo/RTDS_Replicator_Test.unity +++ b/Assets/IATK/Scripts/Demo/RTDS_Replicator_Test.unity @@ -38,7 +38,7 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: @@ -96,7 +96,6 @@ LightmapSettings: m_PVRFilteringAtrousPositionSigmaAO: 1 m_ExportTrainingData: 0 m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 m_LightingDataAsset: {fileID: 0} m_UseShadowmask: 1 --- !u!196 &4 @@ -146,9 +145,8 @@ Light: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 115723569} m_Enabled: 1 - serializedVersion: 10 + serializedVersion: 9 m_Type: 1 - m_Shape: 0 m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} m_Intensity: 1 m_Range: 10 @@ -229,7 +227,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!114 &343646976 MonoBehaviour: m_ObjectHideFlags: 0 @@ -355,7 +353,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!4 &522362265 Transform: m_ObjectHideFlags: 0 diff --git a/Assets/IATK/Scripts/Demo/RealtimeDataDemo.cs b/Assets/IATK/Scripts/Demo/RealtimeDataDemo.cs index ca99abfd..c8ec3f21 100644 --- a/Assets/IATK/Scripts/Demo/RealtimeDataDemo.cs +++ b/Assets/IATK/Scripts/Demo/RealtimeDataDemo.cs @@ -4,22 +4,12 @@ using IATK; using System; using System.Collections; -using System.Collections.Generic; using UnityEngine; namespace IATKTest { public class RealtimeDataDemo : MonoBehaviour { - // Start is called before the first frame update - int n; - float[] myValsX; - float[] myValsY; - float[] myValsZ; - float[] mySizes; - Color[] myColors; - View view = null; - ViewBuilder vb; GameObject visGo = null; Visualisation vis = null; RealtimeDataSource rtds = null; @@ -28,7 +18,6 @@ public class RealtimeDataDemo : MonoBehaviour void Start() { - //CreateCodeBasedDummy(); StartCoroutine(DelayedInit()); } @@ -50,13 +39,6 @@ void CreateWithRTDataSource() rtds.AddDimension("DimC", 0, 100); rtds.AddDimension("DimD", 0, 100); - /* - rtds.AddStrDataByStr("names", "DimA"); - rtds.AddStrDataByStr("names", "DimB"); - rtds.AddStrDataByStr("names", "DimC"); - rtds.AddStrDataByStr("names", "DimD"); - */ - rtds.SetData("DimA", 75f); rtds.SetData("DimA", 50f); rtds.SetData("DimA", 25f); @@ -142,13 +124,12 @@ Visualisation CreateVisFromSource() IEnumerator SimulPoints() { yield return new WaitForSeconds(5f); - //view = visGo.GetComponentInChildren(); while (true) { yield return new WaitForSeconds(0.01f); try { - if (rtds) + if (rtds != null) { rtds.SetData("DimA", UnityEngine.Random.value * 100f); rtds.SetData("DimB", UnityEngine.Random.value * 100f); @@ -158,8 +139,6 @@ IEnumerator SimulPoints() { Debug.Log("-- SimulPoints before vis ..."); - //view.TweenPosition(); - //vb.updateView(); vis.updateView(0); Debug.Log("-- SimulPoints after vis ..."); } diff --git a/Assets/IATK/Scripts/Demo/RealtimeDataReplicationDemo.cs b/Assets/IATK/Scripts/Demo/RealtimeDataReplicationDemo.cs index e04aa788..a9401f42 100644 --- a/Assets/IATK/Scripts/Demo/RealtimeDataReplicationDemo.cs +++ b/Assets/IATK/Scripts/Demo/RealtimeDataReplicationDemo.cs @@ -15,15 +15,6 @@ namespace IATKTest { public class RealtimeDataReplicationDemo : MonoBehaviour { - // Start is called before the first frame update - int n; - float[] myValsX; - float[] myValsY; - float[] myValsZ; - float[] mySizes; - Color[] myColors; - View view = null; - ViewBuilder vb; GameObject visGo = null; Visualisation vis = null; RealtimeDataSource rtds = null; @@ -32,7 +23,6 @@ public class RealtimeDataReplicationDemo : MonoBehaviour void Start() { - //CreateCodeBasedDummy(); StartCoroutine(DelayedInit()); } @@ -57,13 +47,6 @@ void CreateWithRTDataSource() rtds.AddDimension("DimC", 0, 100); rtds.AddDimension("DimD", 0, 100); - /* - rtds.AddStrDataByStr("names", "DimA"); - rtds.AddStrDataByStr("names", "DimB"); - rtds.AddStrDataByStr("names", "DimC"); - rtds.AddStrDataByStr("names", "DimD"); - */ - rtds.SetData("DimA", 75f); rtds.SetData("DimA", 50f); rtds.SetData("DimA", 25f); @@ -91,8 +74,8 @@ public VisHolder(Visualisation vis) Dictionary replicas = new Dictionary(); public void ConsumeReplicas() { - string t = "rr/vis/replication/#"; #if USE_MQTT + string t = "rr/vis/replication/#"; Vizario.MQTTManager.Subscribe(t); Vizario.MQTTManager.RegisterCallbackTopicCs( (string topic, string payload) => @@ -154,11 +137,19 @@ void SpawnReplicatedVis(string uid, string payload) void SyncVis(Visualisation vis) { + vis.geometry = vis.theVisualizationObject.creationConfiguration.Geometry; vis.theVisualizationObject.visualisationReference.geometry = vis.theVisualizationObject.creationConfiguration.Geometry; - vis.theVisualizationObject.visualisationReference.xDimension = vis.theVisualizationObject.creationConfiguration.Axies[CreationConfiguration.Axis.X]; - vis.theVisualizationObject.visualisationReference.yDimension = vis.theVisualizationObject.creationConfiguration.Axies[CreationConfiguration.Axis.Y]; - vis.theVisualizationObject.visualisationReference.zDimension = vis.theVisualizationObject.creationConfiguration.Axies[CreationConfiguration.Axis.Z]; + + if(vis.theVisualizationObject.creationConfiguration.Axies.ContainsKey(CreationConfiguration.Axis.X)) + vis.theVisualizationObject.visualisationReference.xDimension = vis.theVisualizationObject.creationConfiguration.Axies[CreationConfiguration.Axis.X]; + + if(vis.theVisualizationObject.creationConfiguration.Axies.ContainsKey(CreationConfiguration.Axis.Y)) + vis.theVisualizationObject.visualisationReference.yDimension = vis.theVisualizationObject.creationConfiguration.Axies[CreationConfiguration.Axis.Y]; + + if(vis.theVisualizationObject.creationConfiguration.Axies.ContainsKey(CreationConfiguration.Axis.Z)) + vis.theVisualizationObject.visualisationReference.zDimension = vis.theVisualizationObject.creationConfiguration.Axies[CreationConfiguration.Axis.Z]; + vis.theVisualizationObject.visualisationReference.sizeDimension = vis.theVisualizationObject.creationConfiguration.SizeDimension; vis.theVisualizationObject.visualisationReference.dimensionColour = vis.theVisualizationObject.creationConfiguration.colourKeys; vis.theVisualizationObject.visualisationReference.colourDimension = vis.theVisualizationObject.creationConfiguration.ColourDimension; @@ -226,10 +217,6 @@ Visualisation CreateVisFromSource() } vis.dataSource = rtds; - //vis.xDimension = "DimA"; - //vis.yDimension = "DimB"; - //vis.zDimension = "DimC"; - //vis.sizeDimension = "DimD"; vis.CreateVisualisation(AbstractVisualisation.VisualisationTypes.SCATTERPLOT); vis.geometry = AbstractVisualisation.GeometryType.Bars; @@ -269,11 +256,6 @@ Visualisation CreateVisFromSource() abstractVisualisation.visualisationReference.colourDimension = "DimD"; abstractVisualisation.UpdateVisualisation(AbstractVisualisation.PropertyType.Colour); - //abstractVisualisation.visualisationReference.colorPaletteDimension = "DimD"; - //abstractVisualisation.UpdateVisualisation(AbstractVisualisation.PropertyType.Colour); - - - Debug.Log("Init vis 6"); isVisReady = true; } @@ -283,13 +265,12 @@ Visualisation CreateVisFromSource() IEnumerator SimulPoints() { yield return new WaitForSeconds(5f); - //view = visGo.GetComponentInChildren(); while (true) { yield return new WaitForSeconds(0.01f); try { - if (rtds) + if (rtds != null) { rtds.SetData("DimA", UnityEngine.Random.value * 100f); rtds.SetData("DimB", UnityEngine.Random.value * 100f); @@ -297,12 +278,7 @@ IEnumerator SimulPoints() rtds.SetData("DimD", UnityEngine.Random.value * 100f); if (isVisReady && vis != null) { - - //Debug.Log("-- SimulPoints before vis ..."); - //view.TweenPosition(); - //vb.updateView(); vis.updateView(0); - //Debug.Log("-- SimulPoints after vis ..."); } } } diff --git a/Assets/IATK/Scripts/Demo/ReplicatorTest.cs b/Assets/IATK/Scripts/Demo/ReplicatorTest.cs index 1761f77b..d3717cd1 100644 --- a/Assets/IATK/Scripts/Demo/ReplicatorTest.cs +++ b/Assets/IATK/Scripts/Demo/ReplicatorTest.cs @@ -7,7 +7,6 @@ using IATK; using System; using System.Collections; -using System.Collections.Generic; using UnityEngine; namespace IATKTest diff --git a/Assets/IATK/Scripts/Model/RealtimeDataSource.cs b/Assets/IATK/Scripts/Model/RealtimeDataSource.cs index dd104114..60787cbf 100644 --- a/Assets/IATK/Scripts/Model/RealtimeDataSource.cs +++ b/Assets/IATK/Scripts/Model/RealtimeDataSource.cs @@ -10,10 +10,7 @@ namespace IATK { public class RealtimeDataSource : DataSource { - /* - The max amount of data that can be displayed at a single time, - will loop back around (replacing older data) when it goes over this limit - */ + // The max amount of data entries that can be displayed at a single time per dimension private int dimensionSizeLimit = 100; private List dimensionPointers = new List(); @@ -21,44 +18,61 @@ will loop back around (replacing older data) when it goes over this limit private List dimensionData = new List(); - private Dictionary> textualDimensionsList = new Dictionary>(); - private Dictionary> textualDimensionsListReverse = new Dictionary>(); + private Dictionary> textualDimensionsList = + new Dictionary>(); + private Dictionary> textualDimensionsListReverse = + new Dictionary>(); + private Dictionary autoBoundaryScaleList = + new Dictionary(); - private float[] GetDefaultArray() + +#region Add Dimension + /// + /// Creates a new data dimension with unknown min/max values and auto boundary scaleing enabled + /// + /// Sets the dimension name, used to identify the dimension (Must be unique). + /// The data type of the dimension + /// True if successfully added, false otherwise + public bool AddDimension(string dimensionName, DataType type = DataType.String) { - var dataArray = new float[dimensionSizeLimit]; - for (int i = 0; i < dimensionSizeLimit; i++) - { - dataArray[i] = 0; - } - return dataArray; + return AddDimension(dimensionName, 0, 0, type, true); } /// - /// Creates a dimension that can later have data set to it + /// Creates a new data dimension /// /// Sets the dimension name, used to identify the dimension (Must be unique). /// The data type of categories (unique values) in the data /// The data type of the dimension + /// Should the auto min/max boundary scaleing be enabled /// True if successfully added, false otherwise - public bool AddDimension(string dimensionName, float numberOfCategories, DataType type = DataType.String) + public bool AddDimension(string dimensionName, float numberOfCategories, + DataType type = DataType.String, bool autoBoundaryScale = false) { - return AddDimension(dimensionName, 0, numberOfCategories - 1f, type); + return AddDimension(dimensionName, 0, numberOfCategories - 1f, type, autoBoundaryScale); } /// - /// Creates a dimension that can later have data set to it + /// Creates a new data dimension /// /// Sets the dimension name, used to identify the dimension (Must be unique). /// The minimum value the dimension can hold /// The maximum value the dimension can hold /// The data type of the dimension + /// Should the auto min/max boundary scaleing be enabled /// True if successfully added, false otherwise - public bool AddDimension(string dimensionName, float minVal, float maxVal, DataType type = DataType.Float) + public bool AddDimension(string dimensionName, float minVal, float maxVal, + DataType type = DataType.Float, bool autoBoundaryScale = false) { // Don't add the dimension if it already exists if (textualDimensionsList.ContainsKey(dimensionName)) return false; + if (maxVal < minVal) + { + Debug.LogError("maxVal must be larger than or equal to minVal"); + return false; + } + var metaData = new DimensionData.Metadata(); metaData.minValue = minVal; metaData.maxValue = maxVal; @@ -68,16 +82,28 @@ public bool AddDimension(string dimensionName, float minVal, float maxVal, DataT textualDimensionsList.Add(dimensionName, new Dictionary()); textualDimensionsListReverse.Add(dimensionName, new Dictionary()); + autoBoundaryScaleList.Add(dimensionName, autoBoundaryScale); var dd = new DimensionData(dimensionName, index, metaData); dd.setData(GetDefaultArray(), textualDimensionsList); dimensionData.Add(dd); dimensionPointers.Add(0); - //Debug.Log("RTDS AddDimension => " + dd.Identifier + ", " + dd.Index); return true; } + private float[] GetDefaultArray() + { + var dataArray = new float[dimensionSizeLimit]; + for (int i = 0; i < dimensionSizeLimit; i++) + { + dataArray[i] = 0; + } + return dataArray; + } +#endregion + +#region Set Data /// /// Sets a data value by index /// @@ -88,30 +114,7 @@ public bool SetData(int index, float val) { return SetData(this[index].Identifier, val); } - - - /// - /// This is important otherwise the overloading can NOT be resolved from outside (eg JS) - /// - /// - /// - /// - public bool SetDataStrVal(string dimensionName, float val) - { - //Debug.Log("RTDS SetDataStrVal => " + dimensionName + ", " + val); - return SetData(dimensionName, val); - } - - /// - /// This is important otherwise the overloading can NOT be resolved from outside (eg JS) - /// - /// - /// - /// - public bool SetDataStrStr(string dimensionName, string val) - { - return SetData(dimensionName, val); - } + /// /// Sets a data value by dimension name (identifier) /// @@ -122,37 +125,10 @@ public bool SetData(string dimensionName, float val) { try { - var dd = this[dimensionName]; - - //this is needed since we do not know the data - //auto scale start - bool dirty = false; - var minV = dd.MetaData.minValue; - var maxV = dd.MetaData.minValue; - if (dd.MetaData.minValue > val) - { - minV = (float)Math.Floor(val); - dirty = true; - } - - if (dd.MetaData.maxValue < val) - { - maxV = (float)Math.Ceiling(val); - dirty = true; - } + DimensionData dd = this[dimensionName]; - if (dirty) - { - //Debug.Log("SetData updating min max => " + minV + ", " + maxV); - var metaData = new DimensionData.Metadata(); - metaData.minValue = minV; - metaData.maxValue = maxV; - metaData.type = DataType.Float; //maybe make that adjustable - dd.setMetadata(metaData); - } - //autoscale stop + if (autoBoundaryScaleList[dimensionName]) ExpandMinMaxToFitNewValue(dd, val); - //this is going to cut off values and not doind auto normalization for unknown data if (dd != null && dd.MetaData.minValue <= val && dd.MetaData.maxValue >= val && dd.Data.Length > 0) { SetDimensionData(dd, normaliseValue(val, dd.MetaData.minValue, dd.MetaData.maxValue, 0f, 1f)); @@ -206,6 +182,28 @@ public bool SetData(string dimensionName, string val) return false; } + /// + /// This is important otherwise the overloading can NOT be resolved from outside (eg JS) + /// + /// + /// + /// + public bool SetDataStrVal(string dimensionName, float val) + { + return SetData(dimensionName, val); + } + + /// + /// This is important otherwise the overloading can NOT be resolved from outside (eg JS) + /// + /// + /// + /// + public bool SetDataStrStr(string dimensionName, string val) + { + return SetData(dimensionName, val); + } + /// /// Sets a data value to a dimension /// @@ -217,11 +215,52 @@ private void SetDimensionData(DimensionData dd, float val) int ptr = dimensionPointers[dd.Index]; dd.Data[ptr] = val; ptr++; - if(ptr >= dimensionSizeLimit) ptr = 0; + if (ptr >= dimensionSizeLimit) ptr = 0; dimensionPointers[dd.Index] = ptr; } + /// + /// Scales the minValue and minValue filters of DimensionData's MetaData. Used with realtime data when there is an unknown min and max value. + /// + /// The dimension data to alter the metadata of + /// If this value is outside the current min/max values set in the metadata, the min/max values will be expanded to so this value fits inside. + private void ExpandMinMaxToFitNewValue(DimensionData dimensionData, float value) + { + try + { + bool dirty = false; + var minV = dimensionData.MetaData.minValue; + var maxV = dimensionData.MetaData.minValue; + + if (dimensionData.MetaData.minValue > value) + { + minV = (float)Math.Floor(value); + dirty = true; + } + + if (dimensionData.MetaData.maxValue < value) + { + maxV = (float)Math.Ceiling(value); + dirty = true; + } + + if (dirty) + { + var metaData = new DimensionData.Metadata(); + metaData.minValue = minV; + metaData.maxValue = maxV; + metaData.type = DataType.Float; //maybe make that adjustable + dimensionData.setMetadata(metaData); + } + } + catch (Exception e) + { + Debug.Log("SetData ERROR => " + e); + } + } +#endregion +#region Boilerplate overrides /// /// Gets the dimension data at the specified index. /// @@ -380,5 +419,6 @@ void OnApplicationQuit() { isQuitting = true; } +#endregion } } diff --git a/Assets/IATK/Scripts/View/BigMesh.cs b/Assets/IATK/Scripts/View/BigMesh.cs index 68640783..f935663f 100644 --- a/Assets/IATK/Scripts/View/BigMesh.cs +++ b/Assets/IATK/Scripts/View/BigMesh.cs @@ -887,6 +887,8 @@ void QueueTween() // returns false if complete, else true private bool DoTheTween() { + if (this.SharedMaterial == null) return false; + bool isTweening = false; _tweenPosition += Time.deltaTime; diff --git a/Assets/StreamingAssets/SerializedFields.meta b/Assets/StreamingAssets/SerializedFields.meta deleted file mode 100644 index 1d1e0552..00000000 --- a/Assets/StreamingAssets/SerializedFields.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ec0d5e1426c23124997ae0eb2b96f441 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/README.md b/README.md index 0b1ecca8..e9304d5c 100644 --- a/README.md +++ b/README.md @@ -173,7 +173,7 @@ View view = vb.updateView().apply(gameObject, mt); ## IATK Replicator The `Replicator` adds functionality to replicate a visualization either within the same application or to any other target. Depending on the distribution channel uni- and bidirectional connections are realizeable in either *1:1*, *1:n* or *m:n* setups. The core of the replication functionality is the `Replicator` class, which enables to produce and consume replications. -![Realtime DataSource showcase 1](iatkrunner/iatkreplicator.jpg) +![Realtime DataSource showcase 1](https://user-images.githubusercontent.com/1362512/129921726-81224232-9912-4094-ae47-7a14a3f1302f.jpg) Here we see to users using a Hololens each and consuming visualizations. The left one is in control of the replicas, whereas the right one receives the updates. ***Blue*** showns the prime visualization with its controls (MRTK). ***Green*** shows a local replica which behaves the same as remote replicas do. ***Yellow*** shows a replica consume by different user running on a different device running a different application with an active `Replicator`. ### Initialization @@ -320,8 +320,8 @@ In a near feature we will support: - more geometry (e.g. surfaces / volumes) ### IATK RealtimeDataSource -![Realtime DataSource showcase 1](iatkrunner/iatk_rtds_2.gif) -![Realtime DataSource showcase 1](iatkrunner/iatk_rtds_1.gif) +![Realtime DataSource showcase 1](https://user-images.githubusercontent.com/1362512/129921909-9325e8c8-ce6f-4b0b-81c4-0331dac586e3.gif) +![Realtime DataSource showcase 1](https://user-images.githubusercontent.com/1362512/129921937-1607a94c-21cb-4d31-afe2-764dfc9adec2.gif) ## Team diff --git a/iatkrunner/iatk_rtds_1.gif b/iatkrunner/iatk_rtds_1.gif deleted file mode 100644 index bf36b75b..00000000 Binary files a/iatkrunner/iatk_rtds_1.gif and /dev/null differ diff --git a/iatkrunner/iatk_rtds_2.gif b/iatkrunner/iatk_rtds_2.gif deleted file mode 100644 index 0c726ef6..00000000 Binary files a/iatkrunner/iatk_rtds_2.gif and /dev/null differ diff --git a/iatkrunner/iatkreplicator.jpg b/iatkrunner/iatkreplicator.jpg deleted file mode 100644 index ffefd29c..00000000 Binary files a/iatkrunner/iatkreplicator.jpg and /dev/null differ