Moved entity light hash generation to YmapEntityDef and added Lights array to entity

This commit is contained in:
dexy
2021-05-02 04:57:24 +10:00
Unverified
parent 384ad0c9cb
commit e18cf990fe
4 changed files with 158 additions and 235 deletions
@@ -1681,6 +1681,9 @@ namespace CodeWalker.GameFiles
public object LodManagerRenderable = null;
public LightInstance[] Lights { get; set; }
public string Name
{
get
@@ -2069,6 +2072,129 @@ namespace CodeWalker.GameFiles
return _CEntityDef.ToString() + ((ChildList != null) ? (" (" + ChildList.Count.ToString() + " children) ") : " ") + _CEntityDef.lodLevel.ToString();
}
public void EnsureLights(DrawableBase db)
{
if (Lights != null) return;
if (Archetype == null) return;
if (db == null) return;
var dd = db as Drawable;
var fd = db as FragDrawable;
LightAttributes_s[] lightAttrs = null;
Bounds b = null;
if (dd != null)
{
lightAttrs = dd.LightAttributes?.data_items;
b = dd.Bound;
}
else if (fd != null)
{
lightAttrs = fd.OwnerFragment?.LightAttributes?.data_items;
b = fd.OwnerFragment?.PhysicsLODGroup?.PhysicsLOD1?.Bound;
}
if (lightAttrs == null) return;
var abmin = Vector3.Min(Archetype.BBMin, db.BoundingBoxMin);
var abmax = Vector3.Max(Archetype.BBMax, db.BoundingBoxMax);
if (b != null)
{
abmin = Vector3.Min(abmin, b.BoxMin);
abmax = Vector3.Max(abmax, b.BoxMax);
}
var bb = new BoundingBox(abmin, abmax).Transform(Position, Orientation, Scale);
var ints = new uint[7];
ints[0] = (uint)(bb.Minimum.X * 10.0f);
ints[1] = (uint)(bb.Minimum.Y * 10.0f);
ints[2] = (uint)(bb.Minimum.Z * 10.0f);
ints[3] = (uint)(bb.Maximum.X * 10.0f);
ints[4] = (uint)(bb.Maximum.Y * 10.0f);
ints[5] = (uint)(bb.Maximum.Z * 10.0f);
var lightInsts = new LightInstance[lightAttrs.Length];
for (int i = 0; i < lightAttrs.Length; i++)
{
ints[6] = (uint)(i + 1);
var li = new LightInstance();
li.Attributes = lightAttrs[i];
li.Hash = ComputeLightHash(ints);
lightInsts[i] = li;
}
Lights = lightInsts;
}
public static uint ComputeLightHash(uint[] ints, uint seed = 0)
{
var a2 = ints.Length;
var v3 = a2;
var v5 = (uint)(seed + 0xDEADBEEF + 4 * ints.Length);
var v6 = v5;
var v7 = v5;
var c = 0;
for (var i = 0; i < (ints.Length - 4) / 3 + 1; i++, v3 -= 3, c += 3)
{
var v9 = ints[c + 2] + v5;
var v10 = ints[c + 1] + v6;
var v11 = ints[c] - v9;
var v13 = v10 + v9;
var v14 = (v7 + v11) ^ BitUtil.RotateLeft(v9, 4);
var v15 = v10 - v14;
var v17 = v13 + v14;
var v18 = v15 ^ BitUtil.RotateLeft(v14, 6);
var v19 = v13 - v18;
var v21 = v17 + v18;
var v22 = v19 ^ BitUtil.RotateLeft(v18, 8);
var v23 = v17 - v22;
var v25 = v21 + v22;
var v26 = v23 ^ BitUtil.RotateLeft(v22, 16);
var v27 = v21 - v26;
var v29 = v27 ^ BitUtil.RotateRight(v26, 13);
var v30 = v25 - v29;
v7 = v25 + v26;
v6 = v7 + v29;
v5 = v30 ^ BitUtil.RotateLeft(v29, 4);
}
if (v3 == 3)
{
v5 += ints[c + 2];
}
if (v3 >= 2)
{
v6 += ints[c + 1];
}
if (v3 >= 1)
{
var v34 = (v6 ^ v5) - BitUtil.RotateLeft(v6, 14);
var v35 = (v34 ^ (v7 + ints[c])) - BitUtil.RotateLeft(v34, 11);
var v36 = (v35 ^ v6) - BitUtil.RotateRight(v35, 7);
var v37 = (v36 ^ v34) - BitUtil.RotateLeft(v36, 16);
var v38 = BitUtil.RotateLeft(v37, 4);
var v39 = (((v35 ^ v37) - v38) ^ v36) - BitUtil.RotateLeft((v35 ^ v37) - v38, 14);
return (v39 ^ v37) - BitUtil.RotateRight(v39, 8);
}
return v5;
}
[TypeConverter(typeof(ExpandableObjectConverter))]
public class LightInstance
{
public LightAttributes_s Attributes { get; set; } //just for display purposes!
public uint Hash { get; set; }
public override string ToString()
{
return Hash.ToString() + ": " + Attributes.Type.ToString();
}
}
}