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; }
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); }