mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2026-05-14 15:45:42 +08:00
Moved entity light hash generation to YmapEntityDef and added Lights array to entity
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user