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; }
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; } } }
public ScoreObjectCountRule(int md, bool mdsot, int mos, DistanceValue p, bool fo) { minDistance = md; minDistanceSameObjectType = mdsot; minObjectSeparation = mos; probability = p; forceOccurance = fo; }
public DistanceValueList(DistanceValue v) { values = new List <DistanceValue>(); values.Add(v); }