Skip to content

Instantly share code, notes, and snippets.

@mzaks
Last active July 24, 2019 10:45
Show Gist options
  • Save mzaks/fbdf810109cbf4061b26b2b3d2c65d69 to your computer and use it in GitHub Desktop.
Save mzaks/fbdf810109cbf4061b26b2b3d2c65d69 to your computer and use it in GitHub Desktop.
public static class EntityDiff
{
public static ComponentDiffResult<T1> Diff<T1, T2>(this Entity entity, World world = null)
where T1: struct, IComponentData, IEquatable<T1>
where T2: struct, IDiffComponent<T1>
{
if (world == null)
{
world = World.Active;
}
var hasCurrent = entity.HasComponent<T1>(world);
var hasOld = entity.HasComponent<T2>(world);
if (hasCurrent == false && hasOld == false)
{
return new ComponentDiffResult<T1>
{
Type = ChangeType.NotPresent
};
}
if (hasCurrent && hasOld == false)
{
var component = entity.GetComponentData<T1>(world);
return new ComponentDiffResult<T1>
{
Type = ChangeType.Added,
Old = component,
Current = component
};
}
if (hasCurrent == false)
{
var component = entity.GetComponentData<T2>(world).Value;
return new ComponentDiffResult<T1>
{
Type = ChangeType.Removed,
Old = component,
Current = component
};
}
var before = entity.GetComponentData<T2>(world).Value;
var after = entity.GetComponentData<T1>(world);
if (before.Equals(after))
{
return new ComponentDiffResult<T1>
{
Type = ChangeType.NothingChanged,
Old = before,
Current = after
};
}
return new ComponentDiffResult<T1>
{
Type = ChangeType.Updated,
Old = before,
Current = after
};
}
public static ComponentDiffResult<T1> Balance<T1, T2>(this Entity entity, World world = null)
where T1 : struct, IComponentData, IEquatable<T1>
where T2 : struct, IDiffComponent<T1>
{
if (world == null)
{
world = World.Active;
}
var diffResult = entity.Diff<T1, T2>();
switch (diffResult.Type)
{
case ChangeType.Added:
case ChangeType.Updated:
entity.AddComponentData(new T2{Value = diffResult.Current});
break;
case ChangeType.Removed:
entity.RemoveComponent<T2>();
break;
case ChangeType.NothingChanged:
case ChangeType.NotPresent:
break;
}
return diffResult;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment