This commit is contained in:
runette committed 2024-04-22 15:52:51 +01:00
commit e0afef912e
1285 files changed
+83219

No files matched your search

@@ -0,0 +1,26 @@
namespace Mapbox.Unity.MeshGeneration.Filters
{
using UnityEngine;
using Mapbox.Unity.MeshGeneration.Data;
using System;
public interface ILayerFeatureFilterComparer
{
bool Try(VectorFeatureUnity feature);
}
public class FilterBase : ILayerFeatureFilterComparer
{
public virtual string Key { get { return ""; } }
public virtual bool Try(VectorFeatureUnity feature)
{
return true;
}
public virtual void Initialize()
{
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 7495b32b05d97be4a8666ab6af32cdee
timeCreated: 1485210126
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,32 @@
namespace Mapbox.Unity.MeshGeneration.Filters
{
using UnityEngine;
using Mapbox.Unity.MeshGeneration.Data;
public class HeightFilter : FilterBase
{
public enum HeightFilterOptions
{
Above,
Below
}
public override string Key { get { return "height"; } }
[SerializeField]
private float _height;
[SerializeField]
private HeightFilterOptions _type;
public override bool Try(VectorFeatureUnity feature)
{
var hg = System.Convert.ToSingle(feature.Properties[Key]);
if (_type == HeightFilterOptions.Above && hg > _height)
return true;
if (_type == HeightFilterOptions.Below && hg < _height)
return true;
return false;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: ae03e6a279b82f94a81883a2698db813
timeCreated: 1485210126
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+580
View File
@@ -0,0 +1,580 @@
namespace Mapbox.Unity.MeshGeneration.Filters
{
using UnityEngine;
using Mapbox.Unity.MeshGeneration.Data;
using System;
using System.Linq;
using System.Collections.Generic;
using Mapbox.Unity.Map;
public class TypeFilter : FilterBase
{
public override string Key { get { return "type"; } }
[SerializeField]
private string[] _types;
[SerializeField]
private TypeFilterType _behaviour;
public override bool Try(VectorFeatureUnity feature)
{
var check = false;
for (int i = 0; i < _types.Length; i++)
{
if (_types[i].ToLowerInvariant() == feature.Properties["type"].ToString().ToLowerInvariant())
{
check = true;
}
}
return _behaviour == TypeFilterType.Include ? check : !check;
}
public enum TypeFilterType
{
Include,
Exclude
}
}
public enum LayerFilterOperationType
{
Contains,
IsEqual,
IsGreater,
IsLess,
IsInRange,
}
public enum LayerFilterCombinerOperationType
{
Any,
All,
None,
}
[Serializable]
public class LayerFilterCombiner : ILayerFeatureFilterComparer
{
public List<ILayerFeatureFilterComparer> Filters;
public LayerFilterCombinerOperationType Type;
public bool Try(VectorFeatureUnity feature)
{
switch (Type)
{
case LayerFilterCombinerOperationType.Any:
return Filters.Any(m => m.Try(feature));
case LayerFilterCombinerOperationType.All:
return Filters.All(m => m.Try(feature));
case LayerFilterCombinerOperationType.None:
return !Filters.Any(m => m.Try(feature));
default:
return false;
}
}
}
public class LayerFilterComparer : ILayerFeatureFilterComparer
{
public virtual bool Try(VectorFeatureUnity feature)
{
return true;
}
public static ILayerFeatureFilterComparer AnyOf(params ILayerFeatureFilterComparer[] filters)
{
return new LayerFilterCombiner
{
Type = LayerFilterCombinerOperationType.Any,
Filters = filters.ToList(),
};
}
public static ILayerFeatureFilterComparer AllOf(params ILayerFeatureFilterComparer[] filters)
{
return new LayerFilterCombiner
{
Type = LayerFilterCombinerOperationType.All,
Filters = filters.ToList(),
};
}
public static ILayerFeatureFilterComparer NoneOf(params ILayerFeatureFilterComparer[] filters)
{
return new LayerFilterCombiner
{
Type = LayerFilterCombinerOperationType.None,
Filters = filters.ToList(),
};
}
public static ILayerFeatureFilterComparer HasProperty(string property)
{
return new LayerHasPropertyFilterComparer
{
Key = property
};
}
public static ILayerFeatureFilterComparer HasPropertyInRange(string property, double min, double max)
{
return new LayerPropertyInRangeFilterComparer
{
Key = property,
Min = min,
Max = max
};
}
public static ILayerFeatureFilterComparer HasPropertyGreaterThan(string property, double min)
{
return new LayerPropertyIsGreaterFilterComparer
{
Key = property,
Min = min,
};
}
public static ILayerFeatureFilterComparer HasPropertyLessThan(string property, double min)
{
return new LayerPropertyIsLessFilterComparer
{
Key = property,
Min = min,
};
}
public static ILayerFeatureFilterComparer HasPropertyIsEqual(string property, double min)
{
return new LayerPropertyIsEqualFilterComparer
{
Key = property,
Min = min,
};
}
public static ILayerFeatureFilterComparer PropertyContainsValue(string property, params object[] values)
{
return new LayerPropertyContainsFilterComparer
{
Key = property,
ValueSet = values.ToList()
};
}
}
[Serializable]
public class LayerHasPropertyFilterComparer : ILayerFeatureFilterComparer
{
public string Key;
public bool Try(VectorFeatureUnity feature)
{
object property;
if (feature.Properties.TryGetValue(Key, out property))
{
return PropertyComparer(property);
}
return false;
}
protected virtual bool PropertyComparer(object property)
{
return true;
}
}
[Serializable]
public class LayerPropertyInRangeFilterComparer : LayerHasPropertyFilterComparer
{
public double Min;
public double Max;
protected override bool PropertyComparer(object property)
{
if (property == null)
{
return false;
}
var propertyValue = Convert.ToDouble(property);
if (propertyValue < Min)
{
return false;
}
if (propertyValue >= Max)
{
return false;
}
return true;
}
}
[Serializable]
public class LayerPropertyIsGreaterFilterComparer : LayerHasPropertyFilterComparer
{
public double Min;
protected override bool PropertyComparer(object property)
{
var propertyValue = Convert.ToDouble(property);
if (property == null)
{
return false;
}
if (propertyValue > Min)
{
return true;
}
return false;
}
}
[Serializable]
public class LayerPropertyIsLessFilterComparer : LayerHasPropertyFilterComparer
{
public double Min;
protected override bool PropertyComparer(object property)
{
if (property == null)
{
return false;
}
var propertyValue = Convert.ToDouble(property);
if (propertyValue < Min)
{
return true;
}
return false;
}
}
[Serializable]
public class LayerPropertyIsEqualFilterComparer : LayerHasPropertyFilterComparer
{
public double Min;
protected override bool PropertyComparer(object property)
{
if (property == null)
{
return false;
}
var propertyValue = Convert.ToDouble(property);
if (Math.Abs(propertyValue - Min) < Mapbox.Utils.Constants.EpsilonFloatingPoint)
{
return true;
}
return false;
}
}
[Serializable]
public class LayerPropertyContainsFilterComparer : LayerHasPropertyFilterComparer
{
public List<object> ValueSet;
protected override bool PropertyComparer(object property)
{
foreach (var value in ValueSet)
{
if (property.ToString().ToLower().Contains(value.ToString()))
{
return true;
}
}
return false;
}
}
[Serializable]
public class LayerFilter : MapboxDataProperty, ILayerFilter
{
[Tooltip("Name of the property to use as key. This property is case sensitive.")]
public string Key;
[SerializeField]
[Tooltip("Description of the property defined as key.")]
private string KeyDescription;
[Tooltip("Value to match using the operator. ")]
public string PropertyValue = string.Empty;
[Tooltip("Value to match using the operator. ")]
public float Min, Max;
[Tooltip("Filter operator to apply. ")]
public LayerFilterOperationType filterOperator;
private char[] _delimiters = new char[] { ',' };
public LayerFilter(LayerFilterOperationType filterOperation = LayerFilterOperationType.Contains)
{
filterOperator = filterOperation;
}
public ILayerFeatureFilterComparer GetFilterComparer()
{
if (_delimiters == null)
{
_delimiters = new char[] { ',' };
}
ILayerFeatureFilterComparer filterComparer = new LayerFilterComparer();
switch (filterOperator)
{
case LayerFilterOperationType.IsEqual:
filterComparer = LayerFilterComparer.HasPropertyIsEqual(Key, Min);
break;
case LayerFilterOperationType.IsGreater:
filterComparer = LayerFilterComparer.HasPropertyGreaterThan(Key, Min);
break;
case LayerFilterOperationType.IsLess:
filterComparer = LayerFilterComparer.HasPropertyLessThan(Key, Min);
break;
case LayerFilterOperationType.Contains:
var matchList = PropertyValue.ToLower()
.Split(_delimiters, StringSplitOptions.RemoveEmptyEntries)
.Select(p => p.Trim())
.Where(p => !string.IsNullOrEmpty(p))
.ToArray();
filterComparer = LayerFilterComparer.PropertyContainsValue(Key, matchList);
break;
case LayerFilterOperationType.IsInRange:
filterComparer = LayerFilterComparer.HasPropertyInRange(Key, Min, Max);
break;
default:
break;
}
return filterComparer;
}
/// <summary>
/// Sets the string contains.
/// </summary>
/// <param name="key">Key.</param>
/// <param name="property">Property.</param>
public virtual void SetStringContains(string key, string property)
{
filterOperator = LayerFilterOperationType.Contains;
Key = key;
PropertyValue = property;
HasChanged = true;
}
/// <summary>
/// Sets the number is equal.
/// </summary>
/// <param name="key">Key.</param>
/// <param name="value">Value.</param>
public virtual void SetNumberIsEqual(string key, float value)
{
filterOperator = LayerFilterOperationType.IsEqual;
Key = key;
Min = value;
HasChanged = true;
}
/// <summary>
/// Sets the number is less than.
/// </summary>
/// <param name="key">Key.</param>
/// <param name="value">Value.</param>
public virtual void SetNumberIsLessThan(string key, float value)
{
filterOperator = LayerFilterOperationType.IsLess;
Key = key;
Min = value;
HasChanged = true;
}
/// <summary>
/// Sets the number is greater than.
/// </summary>
/// <param name="key">Key.</param>
/// <param name="value">Value.</param>
public virtual void SetNumberIsGreaterThan(string key, float value)
{
filterOperator = LayerFilterOperationType.IsGreater;
Key = key;
Min = value;
HasChanged = true;
}
/// <summary>
/// Sets the number is in range.
/// </summary>
/// <param name="key">Key.</param>
/// <param name="min">Minimum.</param>
/// <param name="max">Max.</param>
public virtual void SetNumberIsInRange(string key, float min, float max)
{
filterOperator = LayerFilterOperationType.IsInRange;
Key = key;
Min = min;
Max = max;
HasChanged = true;
}
/// <summary>
/// Gets the key.
/// </summary>
/// <returns>The key.</returns>
public virtual string GetKey
{
get
{
return Key;
}
}
/// <summary>
/// Gets the type of the filter operation.
/// </summary>
/// <returns>The filter operation type.</returns>
public virtual LayerFilterOperationType GetFilterOperationType
{
get
{
return filterOperator;
}
}
/// <summary>
/// Gets the property value.
/// </summary>
/// <returns>The property value.</returns>
public virtual string GetPropertyValue
{
get
{
return PropertyValue;
}
}
/// <summary>
/// Gets the minimum value.
/// </summary>
/// <returns>The minimum value.</returns>
public virtual float GetNumberValue
{
get
{
return Min;
}
}
/// <summary>
/// Gets the minimum value.
/// </summary>
/// <returns>The minimum value.</returns>
public virtual float GetMinValue
{
get
{
return Min;
}
}
/// <summary>
/// Gets the max value.
/// </summary>
/// <returns>The max value.</returns>
public virtual float GetMaxValue
{
get
{
return Max;
}
}
/// <summary>
/// Returns true if filter key contains a given string.
/// </summary>
/// <returns><c>true</c>, if key contains was filtered, <c>false</c> otherwise.</returns>
/// <param name="key">Key.</param>
public virtual bool FilterKeyContains(string key)
{
return Key.Contains(key);
}
/// <summary>
/// Returns true if filter key matches a given string exactly.
/// </summary>
/// <returns><c>true</c>, if key matches exact was filtered, <c>false</c> otherwise.</returns>
/// <param name="key">Key.</param>
public virtual bool FilterKeyMatchesExact(string key)
{
return Key == key;
}
/// <summary>
/// Returns true if filter uses a given operation type.
/// </summary>
/// <returns><c>true</c>, if uses operation type was filtered, <c>false</c> otherwise.</returns>
/// <param name="layerFilterOperationType">Layer filter operation type.</param>
public virtual bool FilterUsesOperationType(LayerFilterOperationType layerFilterOperationType)
{
return filterOperator == layerFilterOperationType;
}
/// <summary>
/// Returns true if filter property contains a given string.
/// </summary>
/// <returns><c>true</c>, if property contains was filtered, <c>false</c> otherwise.</returns>
/// <param name="property">Property.</param>
public virtual bool FilterPropertyContains(string property)
{
return PropertyValue.Contains(property);
}
/// <summary>
/// Returns true if filter property matches a given string exactly.
/// </summary>
/// <returns><c>true</c>, if property matches exact was filtered, <c>false</c> otherwise.</returns>
/// <param name="property">Property.</param>
public virtual bool FilterPropertyMatchesExact(string property)
{
return PropertyValue == property;
}
/// <summary>
/// Returns true if filter number value is equal to a given number.
/// </summary>
/// <returns><c>true</c>, if number value equals was filtered, <c>false</c> otherwise.</returns>
/// <param name="value">Value.</param>
public virtual bool FilterNumberValueEquals(float value)
{
return Mathf.Approximately(Min, value);
}
/// <summary>
/// Returns true if filter number value is greater than a given number.
/// </summary>
/// <returns><c>true</c>, if number value is greater than was filtered, <c>false</c> otherwise.</returns>
/// <param name="value">Value.</param>
public virtual bool FilterNumberValueIsGreaterThan(float value)
{
return Min > value;
}
/// <summary>
/// Returns true if filter number value is less than a given number.
/// </summary>
/// <returns><c>true</c>, if number value is less than was filtered, <c>false</c> otherwise.</returns>
/// <param name="value">Value.</param>
public virtual bool FilterNumberValueIsLessThan(float value)
{
return Min < value;
}
/// <summary>
/// Returns true if filter range values contain a given number.
/// </summary>
/// <returns><c>true</c>, if is in range value contains was filtered, <c>false</c> otherwise.</returns>
/// <param name="value">Value.</param>
public virtual bool FilterIsInRangeValueContains(float value)
{
return Min < value && value < Max;
}
}
}
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: cb49207f63da8544d9f0a3f790016544
timeCreated: 1485210126
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: