Beispiel #1
0
 public ObjectRuleMap(InfiniteObject io, ScoreObjectCountRule r)
 {
     targetObject = io;
     rules = new List<ScoreObjectCountRule>();
     rules.Add(r);
 }
    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;
        if (avoidObjectRule) {
            appearanceRules = ((AppearanceRules)target).avoidObjectRuleMaps;
        } else {
            appearanceRules = ((AppearanceRules)target).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);
        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;
    }
Beispiel #3
0
    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;

        if (avoidObjectRule)
        {
            appearanceRules = ((AppearanceRules)target).avoidObjectRuleMaps;
        }
        else
        {
            appearanceRules = ((AppearanceRules)target).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);

        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 ObjectRuleMap(InfiniteObject io, ScoreObjectCountRule r)
 {
     targetObject = io;
     rules        = new List <ScoreObjectCountRule>();
     rules.Add(r);
 }