Пример #1
0
 public ScoreObjectCountRule(int md, bool mdsot, int mos, DistanceValue p, bool fo)
 {
     minDistance = md;
     minDistanceSameObjectType = mdsot;
     minObjectSeparation       = mos;
     probability    = p;
     forceOccurance = fo;
 }
        private int AddRule()
        {
            if (startDistance >= endDistance && useEndDistance) {
                return 1;
            }

            if (((!minDistanceSameObjectType || minObjectSeperation > 0) && targetObject == null))
                return 2;

            // no point in adding the rule if both of these values are zero
            if (minDistance == 0 && minObjectSeperation == 0)
                return 3;

            List<ObjectRuleMap> appearanceRules;
            AppearanceRules targetRules = target as AppearanceRules;
            if (avoidObjectRule) {
                if (targetRules.avoidObjectRuleMaps == null) {
                    targetRules.avoidObjectRuleMaps = new List<ObjectRuleMap>();
                }
                appearanceRules = targetRules.avoidObjectRuleMaps;
            } else {
                if (targetRules.probabilityAdjustmentMaps == null) {
                    targetRules.probabilityAdjustmentMaps = new List<ObjectRuleMap>();
                }
                appearanceRules = targetRules.probabilityAdjustmentMaps;
            }

            int ruleInsertIndex = 0;
            int subRuleInsertIndex = 0;
            bool parentBreak = false;
            bool infiniteObjectFound = false;
            for (; ruleInsertIndex < appearanceRules.Count; ++ruleInsertIndex) {
                if (targetObject == appearanceRules[ruleInsertIndex].targetObject) {
                    List<ScoreObjectCountRule> scoreObjectCountRules = appearanceRules[ruleInsertIndex].rules;
                    for (; subRuleInsertIndex < scoreObjectCountRules.Count; ++subRuleInsertIndex) {
                        // error if the current probability is overlapping an existing probability or within it
                        DistanceValue prob = scoreObjectCountRules[subRuleInsertIndex].probability;
                        if ((startDistance < prob.startDistance && endDistance > prob.startDistance) ||
                            (startDistance > prob.startDistance && endDistance < prob.endDistance) ||
                            (startDistance < prob.endDistance && endDistance > prob.endDistance) ||
                            (!prob.useEndDistance && startDistance > prob.startDistance) ||
                            (!useEndDistance && startDistance < prob.endDistance)) {
                            return 4;
                        }

                        // two probabilities can't ignore the end distance
                        if (!useEndDistance && !prob.useEndDistance) {
                            return 5;
                        }

                        // found our place
                        if (endDistance <= prob.startDistance) {
                            parentBreak = true;
                            break;
                        }
                    }
                    infiniteObjectFound = true;
                    break;
                }
                if (parentBreak)
                    break;
            }

            DistanceValue distanceProb = new DistanceValue(startDistance, startProbability, endDistance, endProbability, useEndDistance);
            ScoreObjectCountRule scoreObjectCountRule = new ScoreObjectCountRule(minDistance, minDistanceSameObjectType, minObjectSeperation, distanceProb, forceOccurance);
            if (infiniteObjectFound) {
                List<ScoreObjectCountRule> scoreObjectCountRules = appearanceRules[ruleInsertIndex].rules;
                scoreObjectCountRules.Insert(subRuleInsertIndex, scoreObjectCountRule);
            } else {
                ObjectRuleMap objectRuleMap = new ObjectRuleMap(targetObject, scoreObjectCountRule);
                appearanceRules.Insert(ruleInsertIndex, objectRuleMap);
            }

            EditorUtility.SetDirty(target);
            return 0;
        }
Пример #3
0
 public DistanceValueList(DistanceValue v)
 {
     values = new List<DistanceValue>();
     values.Add(v);
 }
        private int AddRule()
        {
            if (startDistance >= endDistance && useEndDistance)
            {
                return(1);
            }

            if (((!minDistanceSameObjectType || minObjectSeperation > 0) && targetObject == null))
            {
                return(2);
            }

            // no point in adding the rule if both of these values are zero
            if (minDistance == 0 && minObjectSeperation == 0)
            {
                return(3);
            }

            List <ObjectRuleMap> appearanceRules;
            AppearanceRules      targetRules = target as AppearanceRules;

            if (avoidObjectRule)
            {
                if (targetRules.avoidObjectRuleMaps == null)
                {
                    targetRules.avoidObjectRuleMaps = new List <ObjectRuleMap>();
                }
                appearanceRules = targetRules.avoidObjectRuleMaps;
            }
            else
            {
                if (targetRules.probabilityAdjustmentMaps == null)
                {
                    targetRules.probabilityAdjustmentMaps = new List <ObjectRuleMap>();
                }
                appearanceRules = targetRules.probabilityAdjustmentMaps;
            }

            int  ruleInsertIndex     = 0;
            int  subRuleInsertIndex  = 0;
            bool parentBreak         = false;
            bool infiniteObjectFound = false;

            for (; ruleInsertIndex < appearanceRules.Count; ++ruleInsertIndex)
            {
                if (targetObject == appearanceRules[ruleInsertIndex].targetObject)
                {
                    List <ScoreObjectCountRule> scoreObjectCountRules = appearanceRules[ruleInsertIndex].rules;
                    for (; subRuleInsertIndex < scoreObjectCountRules.Count; ++subRuleInsertIndex)
                    {
                        // error if the current probability is overlapping an existing probability or within it
                        DistanceValue prob = scoreObjectCountRules[subRuleInsertIndex].probability;
                        if ((startDistance < prob.startDistance && endDistance > prob.startDistance) ||
                            (startDistance > prob.startDistance && endDistance < prob.endDistance) ||
                            (startDistance < prob.endDistance && endDistance > prob.endDistance) ||
                            (!prob.useEndDistance && startDistance > prob.startDistance) ||
                            (!useEndDistance && startDistance < prob.endDistance))
                        {
                            return(4);
                        }

                        // two probabilities can't ignore the end distance
                        if (!useEndDistance && !prob.useEndDistance)
                        {
                            return(5);
                        }

                        // found our place
                        if (endDistance <= prob.startDistance)
                        {
                            parentBreak = true;
                            break;
                        }
                    }
                    infiniteObjectFound = true;
                    break;
                }
                if (parentBreak)
                {
                    break;
                }
            }

            DistanceValue        distanceProb         = new DistanceValue(startDistance, startProbability, endDistance, endProbability, useEndDistance);
            ScoreObjectCountRule scoreObjectCountRule = new ScoreObjectCountRule(minDistance, minDistanceSameObjectType, minObjectSeperation, distanceProb, forceOccurance);

            if (infiniteObjectFound)
            {
                List <ScoreObjectCountRule> scoreObjectCountRules = appearanceRules[ruleInsertIndex].rules;
                scoreObjectCountRules.Insert(subRuleInsertIndex, scoreObjectCountRule);
            }
            else
            {
                ObjectRuleMap objectRuleMap = new ObjectRuleMap(targetObject, scoreObjectCountRule);
                appearanceRules.Insert(ruleInsertIndex, objectRuleMap);
            }

            EditorUtility.SetDirty(target);
            return(0);
        }
        public void ShowAppearanceRules(List <ObjectRuleMap> appearanceRules, bool avoidObjectRules)
        {
            bool parentBreak = false;

            for (int i = 0; i < appearanceRules.Count; ++i)
            {
                if (appearanceRules[i].rules.Count == 0)
                {
                    continue;
                }

                GUILayout.BeginHorizontal();
                GUILayout.Label(string.Format("{0} Rules", (appearanceRules[i].targetObject != null ? appearanceRules[i].targetObject.name : "All")));
                if (GUILayout.Button("Remove"))
                {
                    appearanceRules.RemoveAt(i);
                    break;
                }
                GUILayout.EndHorizontal();

                List <ScoreObjectCountRule> scoreObjectCountRules = appearanceRules[i].rules;
                for (int j = 0; j < scoreObjectCountRules.Count; ++j)
                {
                    GUILayout.BeginHorizontal();
                    GUILayout.Label(string.Format("  Rule {0}", (j + 1)));
                    if (GUILayout.Button("Remove"))
                    {
                        scoreObjectCountRules.RemoveAt(j);
                        // Remove the parent as well if there are no sub-rules left
                        if (scoreObjectCountRules.Count == 0)
                        {
                            appearanceRules.RemoveAt(i);
                            parentBreak = true;
                        }
                        EditorUtility.SetDirty(target);
                        break;
                    }
                    GUILayout.EndHorizontal();

                    GUILayout.Label(string.Format("    Min Distance {0}", scoreObjectCountRules[j].minDistance));
                    if (scoreObjectCountRules[j].minDistanceSameObjectType)
                    {
                        GUILayout.Label("    Uses min distance for same object type");
                    }
                    else
                    {
                        GUILayout.Label("    Uses min distance for object specified");
                    }
                    GUILayout.Label(string.Format("    Min Object Separation {0}", scoreObjectCountRules[j].minObjectSeparation));

                    DistanceValue prob = scoreObjectCountRules[j].probability;
                    if (avoidObjectRules)
                    {
                        if (prob.useEndDistance)
                        {
                            GUILayout.Label(string.Format("    Affects Distance {0} - {1}", prob.startDistance, prob.endDistance));
                        }
                        else
                        {
                            GUILayout.Label(string.Format("    Affects Distance {0} - End", prob.startDistance));
                        }
                    }
                    else     // probability adjustment uses the full set of probability variables
                    {
                        if (prob.useEndDistance)
                        {
                            GUILayout.Label(string.Format("    Affects Distance {0} - {1}", prob.startDistance, prob.endDistance));
                            if (scoreObjectCountRules[j].forceOccurance)
                            {
                                GUILayout.Label("    With Forced Appearance");
                            }
                            else
                            {
                                GUILayout.Label(string.Format("    With Probability {0} - {1}", Math.Round(prob.startValue, 2), Math.Round(prob.endValue, 2)));
                            }
                        }
                        else
                        {
                            GUILayout.Label(string.Format("    Affects Distance {0} - End", prob.startDistance));
                            if (scoreObjectCountRules[j].forceOccurance)
                            {
                                GUILayout.Label("    With Forced Appearance");
                            }
                            else
                            {
                                GUILayout.Label(string.Format("    With Probability {0}", Math.Round(prob.startValue, 2)));
                            }
                        }
                    }
                }
                if (parentBreak)
                {
                    break;
                }
            }
        }
Пример #6
0
 public ScoreObjectCountRule(int md, bool mdsot, int mos, DistanceValue p, bool fo)
 {
     minDistance = md;
     minDistanceSameObjectType = mdsot;
     minObjectSeparation = mos;
     probability = p;
     forceOccurance = fo;
 }
Пример #7
0
 public DistanceValueList(DistanceValue v)
 {
     values = new List <DistanceValue>();
     values.Add(v);
 }