Exemplo n.º 1
0
        public static bool RateConditionMatchesInternal(Conditions conditions,
                                                        CachedTraitCollection traits, ConditionRatingsData ratings)
        {
            conditions.TryGetType(out ICondition <System.Int32>[] intConditions);
            if (!RateConditionType(intConditions, traits, ratings[typeof(System.Int32)]))
            {
                return(false);
            }

            conditions.TryGetType(out ICondition <System.Single>[] floatConditions);
            if (!RateConditionType(floatConditions, traits, ratings[typeof(System.Single)]))
            {
                return(false);
            }

            conditions.TryGetType(out ICondition <System.String>[] stringConditions);
            if (!RateConditionType(stringConditions, traits, ratings[typeof(System.String)]))
            {
                return(false);
            }

            conditions.TryGetType(out ICondition <UnityEngine.Pose>[] poseConditions);
            if (!RateConditionType(poseConditions, traits, ratings[typeof(UnityEngine.Pose)]))
            {
                return(false);
            }

            conditions.TryGetType(out ICondition <UnityEngine.Vector2>[] vector2Conditions);
            if (!RateConditionType(vector2Conditions, traits, ratings[typeof(UnityEngine.Vector2)]))
            {
                return(false);
            }

            return(true);
        }
        public void Modify(QueryMatchID id, int index, SetChildArgs args)
        {
            Assert.IsTrue(MatchIdToIndex.ContainsKey(id) &&
                          QueryMatchIds[index].Equals(id) &&
                          ValidIndices.Contains(index),
                          $"Invalid query match id {id} or invalid index {index}");

            Exclusivities[index]       = args.tryBestMatchArgs.exclusivity;
            Required[index]            = args.required;
            BestMatchDataIds[index]    = (int)ReservedDataIDs.Invalid;
            CachedTraits[index]        = new CachedTraitCollection(args.tryBestMatchArgs.conditions);
            Conditions[index]          = args.tryBestMatchArgs.conditions;
            TraitRequirements[index]   = args.TraitRequirements;
            RelationMemberships[index] = null;
            ConditionRatings[index].Recycle();
            ConditionRatings[index] = Pools.ConditionRatings.Get().Initialize(args.tryBestMatchArgs.conditions);
            ReducedConditionRatings[index].Clear();
            ConditionMatchSets[index].Clear();
            QueryResults[index] = new QueryResult {
                queryMatchId = id
            };

            AcquiringIndices.Add(index);
            UpdatingIndices.Remove(index);
        }
        int Add(QueryMatchID matchId,
                IMRObject objectRef,
                Exclusivity exclusivity,
                int bestMatchDataId,
                bool isRequired,
                CachedTraitCollection traitCache,
                ProxyConditions condition,
                ProxyTraitRequirements requirements,
                ConditionRatingsData rating,
                HashSet <int> matchSet,
                Dictionary <int, float> flatRatings,
                QueryResult result)
        {
            var index = GetInsertionIndex();

            QueryMatchIds[index]           = matchId;
            ObjectReferences[index]        = objectRef;
            Exclusivities[index]           = exclusivity;
            Required[index]                = isRequired;
            BestMatchDataIds[index]        = bestMatchDataId;
            CachedTraits[index]            = traitCache;
            Conditions[index]              = condition;
            TraitRequirements[index]       = requirements;
            RelationMemberships[index]     = null;
            ConditionRatings[index]        = rating;
            ReducedConditionRatings[index] = flatRatings;
            ConditionMatchSets[index]      = matchSet;
            QueryResults[index]            = result;

            m_Count++;
            ValidIndices.Add(index);
            return(index);
        }
        void SetupObject(GameObject go)
        {
            var rwo = go.AddComponent <Proxy>();

            m_Conditions       = ProxyConditions.FromGenericIMRObject(rwo);
            m_ConditionRatings = new ConditionRatingsData(m_Conditions);
            m_TraitCache       = new CachedTraitCollection(m_Conditions);
            m_Db.FindTraitCollections(m_Conditions, m_TraitCache);
        }
Exemplo n.º 5
0
        internal static bool RateConditionType(ICondition <UnityEngine.Pose>[] typeConditions,
                                               CachedTraitCollection traitCollections, List <Dictionary <int, float> > ratings)
        {
            if (typeConditions.Length == 0)
            {
                return(true);
            }

            if (!traitCollections.TryGetType(out List <Dictionary <int, UnityEngine.Pose> > traits))
            {
                return(false);
            }

            return(RateConditionMatches(typeConditions, traits, ratings));
        }
Exemplo n.º 6
0
        internal static bool RateConditionMatches(ProxyConditions conditions, CachedTraitCollection traitCache,
                                                  ConditionRatingsData resultData)
        {
            if (conditions.Count <= 0)
            {
                return(false);
            }

            conditions.TryGetType(out ISemanticTagCondition[] semanticTagConditions);
            traitCache.TryGetType(out List <Dictionary <int, bool> > semanticTagTraits);

            var semanticTagsMatched = RateSemanticTagConditionMatches(semanticTagConditions,
                                                                      semanticTagTraits, resultData[typeof(bool)], resultData.MatchRuleIndexes);

            return(semanticTagsMatched && RateConditionMatchesInternal(conditions, traitCache, resultData));
        }
Exemplo n.º 7
0
        internal bool DataIdPassesAll(ProxyConditions conditions, CachedTraitCollection traitCache, int dataId)
        {
            conditions.TryGetType(out ISemanticTagCondition[] semanticTagConditions);
            traitCache.TryGetType(out List <Dictionary <int, bool> > semanticTagTraits);

            for (var i = 0; i < semanticTagConditions.Length; i++)
            {
                var tagCondition       = semanticTagConditions[i];
                var tagTraitCollection = semanticTagTraits[i];

                if (!tagTraitCollection.TryGetValue(dataId, out var traitValue))
                {
                    switch (tagCondition.matchRule)
                    {
                    case SemanticTagMatchRule.Exclude:
                        continue;

                    case SemanticTagMatchRule.Match:
                        return(false);
                    }
                }

                var rating = tagCondition.RateDataMatch(ref traitValue);

                switch (tagCondition.matchRule)
                {
                case SemanticTagMatchRule.Exclude:
                    if (rating > 0f)
                    {
                        return(false);
                    }

                    break;

                case SemanticTagMatchRule.Match:
                    if (rating <= 0f)
                    {
                        return(false);
                    }

                    break;
                }
            }

            return(DataPassesAllConditionsInternal(traitCache, dataId));
        }
Exemplo n.º 8
0
        public void Modify(QueryMatchID id, QueryArgs args)
        {
            if (!MatchIdToIndex.TryGetValue(id, out var index))
            {
                return;
            }

            Assert.IsTrue(QueryMatchIds[index].Equals(id),
                          $"{index} mismatch with {id}!");

            QueryArgs[index]        = args;
            Exclusivities[index]    = args.exclusivity;
            BestMatchDataIds[index] = (int)ReservedDataIDs.Invalid;

            TimeOuts[index]            = args.commonQueryData.timeOut;
            ReAcquireOnLoss[index]     = args.commonQueryData.reacquireOnLoss;
            Priority[index]            = args.commonQueryData.priority;
            UpdateMatchInterval[index] = args.commonQueryData.updateMatchInterval;

            CachedTraits[index]            = new CachedTraitCollection(args.conditions);
            TraitRequirements[index]       = args.traitRequirements;
            Conditions[index]              = args.conditions;
            ConditionRatings[index]        = Pools.ConditionRatings.Get().Initialize(args.conditions);
            ConditionMatchSets[index]      = Pools.DataIdHashSets.Get();
            ReducedConditionRatings[index] = Pools.Ratings.Get();
            QueryResults[index]            = new QueryResult {
                queryMatchId = id
            };

            AcquireHandlers[index] = args.onAcquire;
            UpdateHandlers[index]  = args.onMatchUpdate;
            LossHandlers[index]    = args.onLoss;
            TimeoutHandlers[index] = args.onTimeout;

            if (!AcquiringIndices.Contains(index))
            {
                AcquiringIndices.Add(index);
            }

            UpdatingIndices.Remove(index);
        }
Exemplo n.º 9
0
        public void Register(QueryMatchID id, QueryArgs args)
        {
            if (MatchIdToIndex.ContainsKey(id))
            {
                return; // query is already registered
            }

            var index = GetInsertionIndex();

            QueryMatchIds[index]    = id;
            QueryArgs[index]        = args;
            Exclusivities[index]    = args.exclusivity;
            BestMatchDataIds[index] = (int)ReservedDataIDs.Invalid;

            TimeOuts[index]            = args.commonQueryData.timeOut;
            ReAcquireOnLoss[index]     = args.commonQueryData.reacquireOnLoss;
            Priority[index]            = args.commonQueryData.priority;
            UpdateMatchInterval[index] = args.commonQueryData.updateMatchInterval;

            CachedTraits[index]            = new CachedTraitCollection(args.conditions);
            TraitRequirements[index]       = args.traitRequirements;
            Conditions[index]              = args.conditions;
            ConditionRatings[index]        = Pools.ConditionRatings.Get().Initialize(args.conditions);
            ConditionMatchSets[index]      = Pools.DataIdHashSets.Get();
            ReducedConditionRatings[index] = Pools.Ratings.Get();
            QueryResults[index]            = new QueryResult {
                queryMatchId = id
            };

            AcquireHandlers[index] = args.onAcquire;
            UpdateHandlers[index]  = args.onMatchUpdate;
            LossHandlers[index]    = args.onLoss;
            TimeoutHandlers[index] = args.onTimeout;

            m_Count++;
            ValidIndices.Add(index);
            MatchIdToIndex.Add(id, index);
            AcquiringIndices.Add(index);
        }
        internal void FillQueryResult(int dataId, ProxyConditions conditions, CachedTraitCollection traits,
                                      ProxyTraitRequirements requirements, QueryMatchID matchId, QueryResult result)
        {
            result.queryMatchId = matchId;
            result.SetDataId(dataId);

            FillRequiredTraitsAction(dataId, requirements, result);

            FillQueryResultInternal(dataId, conditions, traits, matchId, result);

            conditions.TryGetType(out ICondition <Pose>[] poseConditions);
            traits.TryGetType(out List <Dictionary <int, Pose> > poseCollections);

            for (var i = 0; i < poseConditions.Length; i++)
            {
                var poseCollection = poseCollections[i];
                var nonOffsetValue = poseCollection[dataId];
                var poseValue      = applyOffsetToPose(nonOffsetValue);
                var refiner        = poseConditions[i] as IPoseRefiner;
                if (refiner != null)
                {
                    poseValue = refiner.RefinePose(poseValue, true);
                }
                result.SetTrait(poseConditions[i].traitName, poseValue);
            }

            if (!conditions.TryGetType(out ISemanticTagCondition[] semanticTagConditions))
            {
                return;
            }

            // tags can take a shortcut with query filling - they're really just a test for presence or absence,
            // so if that test has already been passed, we can just assign a bool representing the result
            foreach (var condition in semanticTagConditions)
            {
                var isExcluding = condition.matchRule == SemanticTagMatchRule.Exclude;
                result.SetTrait(condition.traitName, !isExcluding);
            }
        }
Exemplo n.º 11
0
        internal static void FillQueryResultInternal(int dataId, Conditions conditions, CachedTraitCollection traits,
                                                     QueryMatchID matchId, QueryResult result)
        {
            traits.TryGetType(out List <Dictionary <int, System.Int32> > intCollections);
            conditions.TryGetType(out ICondition <System.Int32>[] intConditions);
            FillQueryResult <System.Int32>(dataId, intConditions, intCollections, result);

            traits.TryGetType(out List <Dictionary <int, System.Single> > floatCollections);
            conditions.TryGetType(out ICondition <System.Single>[] floatConditions);
            FillQueryResult <System.Single>(dataId, floatConditions, floatCollections, result);

            traits.TryGetType(out List <Dictionary <int, System.String> > stringCollections);
            conditions.TryGetType(out ICondition <System.String>[] stringConditions);
            FillQueryResult <System.String>(dataId, stringConditions, stringCollections, result);

            traits.TryGetType(out List <Dictionary <int, UnityEngine.Pose> > poseCollections);
            conditions.TryGetType(out ICondition <UnityEngine.Pose>[] poseConditions);
            FillQueryResult <UnityEngine.Pose>(dataId, poseConditions, poseCollections, result);

            traits.TryGetType(out List <Dictionary <int, UnityEngine.Vector2> > vector2Collections);
            conditions.TryGetType(out ICondition <UnityEngine.Vector2>[] vector2Conditions);
            FillQueryResult <UnityEngine.Vector2>(dataId, vector2Conditions, vector2Collections, result);
        }