mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-11-29 18:32:55 +08:00
Adding interiors into space grid for later collisions use.
This commit is contained in:
parent
de582fee02
commit
54acb80033
@ -360,11 +360,11 @@ namespace CodeWalker.GameFiles
|
|||||||
public Quaternion Orientation { get; set; }
|
public Quaternion Orientation { get; set; }
|
||||||
public Vector3 BBMin { get; set; }
|
public Vector3 BBMin { get; set; }
|
||||||
public Vector3 BBMax { get; set; }
|
public Vector3 BBMax { get; set; }
|
||||||
public uint Unk11 { get; set; }
|
public float Unk11 { get; set; }
|
||||||
public uint Unk12 { get; set; }
|
public uint Unk12 { get; set; }
|
||||||
public uint Unk13 { get; set; }
|
public float Unk13 { get; set; }
|
||||||
public uint Unk14 { get; set; }
|
public uint Unk14 { get; set; }
|
||||||
public uint Unk15 { get; set; }
|
public float Unk15 { get; set; }
|
||||||
public uint Unk16 { get; set; }
|
public uint Unk16 { get; set; }
|
||||||
public uint Unk17 { get; set; }
|
public uint Unk17 { get; set; }
|
||||||
public uint Unk18 { get; set; }
|
public uint Unk18 { get; set; }
|
||||||
@ -380,11 +380,11 @@ namespace CodeWalker.GameFiles
|
|||||||
Orientation = new Quaternion(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
|
Orientation = new Quaternion(br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
|
||||||
BBMin = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
|
BBMin = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
|
||||||
BBMax = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
|
BBMax = new Vector3(br.ReadSingle(), br.ReadSingle(), br.ReadSingle());
|
||||||
Unk11 = br.ReadUInt32();//could be float
|
Unk11 = br.ReadSingle();
|
||||||
Unk12 = br.ReadUInt32();
|
Unk12 = br.ReadUInt32();
|
||||||
Unk13 = br.ReadUInt32();//could be float
|
Unk13 = br.ReadSingle();
|
||||||
Unk14 = br.ReadUInt32();
|
Unk14 = br.ReadUInt32();
|
||||||
Unk15 = br.ReadUInt32();//could be float
|
Unk15 = br.ReadSingle();
|
||||||
Unk16 = br.ReadUInt32();
|
Unk16 = br.ReadUInt32();
|
||||||
Unk17 = br.ReadUInt32();//could be float
|
Unk17 = br.ReadUInt32();//could be float
|
||||||
Unk18 = br.ReadUInt32();
|
Unk18 = br.ReadUInt32();
|
||||||
|
127
World/Space.cs
127
World/Space.cs
@ -22,6 +22,8 @@ namespace CodeWalker.World
|
|||||||
private Dictionary<SpaceBoundsKey, BoundsStoreItem> visibleBoundsDict = new Dictionary<SpaceBoundsKey, BoundsStoreItem>();
|
private Dictionary<SpaceBoundsKey, BoundsStoreItem> visibleBoundsDict = new Dictionary<SpaceBoundsKey, BoundsStoreItem>();
|
||||||
|
|
||||||
private Dictionary<MetaHash, MetaHash> interiorLookup = new Dictionary<MetaHash, MetaHash>();
|
private Dictionary<MetaHash, MetaHash> interiorLookup = new Dictionary<MetaHash, MetaHash>();
|
||||||
|
private Dictionary<MetaHash, YmfInterior> interiorManifest = new Dictionary<MetaHash, YmfInterior>();
|
||||||
|
private Dictionary<SpaceBoundsKey, CInteriorProxy> interiorProxies = new Dictionary<SpaceBoundsKey, CInteriorProxy>();
|
||||||
private Dictionary<MetaHash, YmfMapDataGroup> dataGroupDict = new Dictionary<MetaHash, YmfMapDataGroup>();
|
private Dictionary<MetaHash, YmfMapDataGroup> dataGroupDict = new Dictionary<MetaHash, YmfMapDataGroup>();
|
||||||
private Dictionary<MetaHash, MapDataStoreNode> nodedict = new Dictionary<MetaHash, MapDataStoreNode>();
|
private Dictionary<MetaHash, MapDataStoreNode> nodedict = new Dictionary<MetaHash, MapDataStoreNode>();
|
||||||
private Dictionary<SpaceBoundsKey, BoundsStoreItem> boundsdict = new Dictionary<SpaceBoundsKey, BoundsStoreItem>();
|
private Dictionary<SpaceBoundsKey, BoundsStoreItem> boundsdict = new Dictionary<SpaceBoundsKey, BoundsStoreItem>();
|
||||||
@ -79,6 +81,7 @@ namespace CodeWalker.World
|
|||||||
private void InitManifestData()
|
private void InitManifestData()
|
||||||
{
|
{
|
||||||
interiorLookup.Clear();
|
interiorLookup.Clear();
|
||||||
|
interiorManifest.Clear();
|
||||||
ymaptimes.Clear();
|
ymaptimes.Clear();
|
||||||
ymapweathertypes.Clear();
|
ymapweathertypes.Clear();
|
||||||
dataGroupDict.Clear();
|
dataGroupDict.Clear();
|
||||||
@ -91,13 +94,18 @@ namespace CodeWalker.World
|
|||||||
{
|
{
|
||||||
foreach (var interior in manifest.Interiors)
|
foreach (var interior in manifest.Interiors)
|
||||||
{
|
{
|
||||||
|
var intname = interior.Interior.Name;
|
||||||
|
if (interiorManifest.ContainsKey(intname))
|
||||||
|
{ }
|
||||||
|
interiorManifest[intname] = interior;
|
||||||
|
|
||||||
if (interior.Bounds != null)
|
if (interior.Bounds != null)
|
||||||
{
|
{
|
||||||
foreach (var intbound in interior.Bounds)
|
foreach (var intbound in interior.Bounds)
|
||||||
{
|
{
|
||||||
if (interiorLookup.ContainsKey(intbound))
|
if (interiorLookup.ContainsKey(intbound))
|
||||||
{ }//updates can hit here
|
{ }//updates can hit here
|
||||||
interiorLookup[intbound] = interior.Interior.Name;
|
interiorLookup[intbound] = intname;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -163,6 +171,7 @@ namespace CodeWalker.World
|
|||||||
List<BoundsStoreItem> intlist = new List<BoundsStoreItem>();
|
List<BoundsStoreItem> intlist = new List<BoundsStoreItem>();
|
||||||
boundsdict = new Dictionary<SpaceBoundsKey, BoundsStoreItem>();
|
boundsdict = new Dictionary<SpaceBoundsKey, BoundsStoreItem>();
|
||||||
usedboundsdict = new Dictionary<MetaHash, BoundsStoreItem>();
|
usedboundsdict = new Dictionary<MetaHash, BoundsStoreItem>();
|
||||||
|
interiorProxies = new Dictionary<SpaceBoundsKey, CInteriorProxy>();
|
||||||
|
|
||||||
Dictionary<MetaHash, CacheFileDate> filedates = new Dictionary<MetaHash, CacheFileDate>();
|
Dictionary<MetaHash, CacheFileDate> filedates = new Dictionary<MetaHash, CacheFileDate>();
|
||||||
Dictionary<uint, CacheFileDate> filedates2 = new Dictionary<uint, CacheFileDate>();
|
Dictionary<uint, CacheFileDate> filedates2 = new Dictionary<uint, CacheFileDate>();
|
||||||
@ -217,6 +226,10 @@ namespace CodeWalker.World
|
|||||||
{
|
{
|
||||||
//these might need to go into the grid. which grid..?
|
//these might need to go into the grid. which grid..?
|
||||||
//but might need to map back to the bounds store... this has more info though!
|
//but might need to map back to the bounds store... this has more info though!
|
||||||
|
SpaceBoundsKey key = new SpaceBoundsKey(intprx.Name, intprx.Position);
|
||||||
|
if (interiorProxies.ContainsKey(key))
|
||||||
|
{ }//updates/dlc hit here
|
||||||
|
interiorProxies[key] = intprx;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var item in cache.AllBoundsStoreItems)
|
foreach (var item in cache.AllBoundsStoreItems)
|
||||||
@ -305,15 +318,15 @@ namespace CodeWalker.World
|
|||||||
|
|
||||||
Grid = new SpaceGrid();
|
Grid = new SpaceGrid();
|
||||||
|
|
||||||
List<MapDataStoreNode> containers = new List<MapDataStoreNode>();
|
//List<MapDataStoreNode> containers = new List<MapDataStoreNode>();
|
||||||
List<MapDataStoreNode> critnodes = new List<MapDataStoreNode>();
|
//List<MapDataStoreNode> critnodes = new List<MapDataStoreNode>();
|
||||||
List<MapDataStoreNode> hdnodes = new List<MapDataStoreNode>();
|
//List<MapDataStoreNode> hdnodes = new List<MapDataStoreNode>();
|
||||||
List<MapDataStoreNode> lodnodes = new List<MapDataStoreNode>();
|
//List<MapDataStoreNode> lodnodes = new List<MapDataStoreNode>();
|
||||||
List<MapDataStoreNode> strmnodes = new List<MapDataStoreNode>();
|
//List<MapDataStoreNode> strmnodes = new List<MapDataStoreNode>();
|
||||||
List<MapDataStoreNode> intnodes = new List<MapDataStoreNode>();
|
//List<MapDataStoreNode> intnodes = new List<MapDataStoreNode>();
|
||||||
List<MapDataStoreNode> occlnodes = new List<MapDataStoreNode>();
|
//List<MapDataStoreNode> occlnodes = new List<MapDataStoreNode>();
|
||||||
List<MapDataStoreNode> grassnodes = new List<MapDataStoreNode>();
|
//List<MapDataStoreNode> grassnodes = new List<MapDataStoreNode>();
|
||||||
List<MapDataStoreNode> lodlightsnodes = new List<MapDataStoreNode>();
|
//List<MapDataStoreNode> lodlightsnodes = new List<MapDataStoreNode>();
|
||||||
|
|
||||||
foreach (var node in nodedict.Values)
|
foreach (var node in nodedict.Values)
|
||||||
{
|
{
|
||||||
@ -321,51 +334,51 @@ namespace CodeWalker.World
|
|||||||
byte t = (byte)(node.ContentFlags & 0xFF);
|
byte t = (byte)(node.ContentFlags & 0xFF);
|
||||||
switch (node.ContentFlags)// t)
|
switch (node.ContentFlags)// t)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0: //for mods/unused stuff? could be interesting.
|
||||||
addtogrid = true; //for mods/unused stuff? could be interesting.
|
addtogrid = true;
|
||||||
break;
|
break;
|
||||||
case 16://"container" node?
|
case 16://"container" node?
|
||||||
containers.Add(node);
|
//containers.Add(node);
|
||||||
break;
|
break;
|
||||||
case 18:
|
case 18:
|
||||||
case 82:
|
case 82: //HD nodes
|
||||||
hdnodes.Add(node);
|
//hdnodes.Add(node);
|
||||||
addtogrid = true;
|
addtogrid = true;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
case 65:
|
case 65: //Stream nodes
|
||||||
strmnodes.Add(node);
|
//strmnodes.Add(node);
|
||||||
addtogrid = true;
|
addtogrid = true;
|
||||||
break;
|
break;
|
||||||
case 513:
|
case 513:
|
||||||
case 577:
|
case 577: //critical nodes
|
||||||
critnodes.Add(node);
|
//critnodes.Add(node);
|
||||||
addtogrid = true;
|
addtogrid = true;
|
||||||
break;
|
break;
|
||||||
case 9:
|
case 9:
|
||||||
case 73:
|
case 73: //interior nodes
|
||||||
intnodes.Add(node);
|
//intnodes.Add(node);
|
||||||
addtogrid = true;
|
addtogrid = true;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
case 4:
|
case 4:
|
||||||
case 20:
|
case 20:
|
||||||
case 66:
|
case 66:
|
||||||
case 514:
|
case 514: //LOD nodes
|
||||||
lodnodes.Add(node);
|
//lodnodes.Add(node);
|
||||||
addtogrid = true;
|
addtogrid = true;
|
||||||
break;
|
break;
|
||||||
case 128:
|
case 128:
|
||||||
case 256:
|
case 256: //LOD lights nodes
|
||||||
lodlightsnodes.Add(node);
|
//lodlightsnodes.Add(node);
|
||||||
addtogrid = true;
|
addtogrid = true;
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32: //occlusion nodes
|
||||||
occlnodes.Add(node);
|
//occlnodes.Add(node);
|
||||||
addtogrid = true;
|
addtogrid = true;
|
||||||
break;
|
break;
|
||||||
case 1088:
|
case 1088: //grass nodes
|
||||||
grassnodes.Add(node);
|
//grassnodes.Add(node);
|
||||||
addtogrid = true;
|
addtogrid = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -387,6 +400,11 @@ namespace CodeWalker.World
|
|||||||
Grid.AddBounds(item);
|
Grid.AddBounds(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var intprx in interiorProxies.Values)
|
||||||
|
{
|
||||||
|
Grid.AddInterior(intprx);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -441,13 +459,14 @@ namespace CodeWalker.World
|
|||||||
|
|
||||||
AllYnds[fnhash] = cell.Ynd;
|
AllYnds[fnhash] = cell.Ynd;
|
||||||
|
|
||||||
if (cell.Ynd == null) continue;
|
|
||||||
if (cell.Ynd.NodeDictionary == null) continue;
|
|
||||||
if (cell.Ynd.NodeDictionary.Nodes == null) continue;
|
|
||||||
var na = cell.Ynd.NodeDictionary.Nodes;
|
|
||||||
|
|
||||||
#region node flags test
|
#region node flags test
|
||||||
|
|
||||||
|
//if (cell.Ynd == null) continue;
|
||||||
|
//if (cell.Ynd.NodeDictionary == null) continue;
|
||||||
|
//if (cell.Ynd.NodeDictionary.Nodes == null) continue;
|
||||||
|
//var na = cell.Ynd.NodeDictionary.Nodes;
|
||||||
|
|
||||||
//for (int i = 0; i < na.Length; i++)
|
//for (int i = 0; i < na.Length; i++)
|
||||||
//{
|
//{
|
||||||
// var node = na[i];
|
// var node = na[i];
|
||||||
@ -1727,6 +1746,11 @@ namespace CodeWalker.World
|
|||||||
public int MaxNodesInCell = 0; //biggest number of nodes added to a single cell
|
public int MaxNodesInCell = 0; //biggest number of nodes added to a single cell
|
||||||
private SpaceGridCell DensestNodeCell = null;
|
private SpaceGridCell DensestNodeCell = null;
|
||||||
|
|
||||||
|
public int TotalInteriorCount = 0;
|
||||||
|
public int TotalInteriorRefCount = 0;
|
||||||
|
public int MaxInteriorsInCell = 0;
|
||||||
|
private SpaceGridCell DensestInteriorCell = null;
|
||||||
|
|
||||||
public SpaceGridCell[,] Cells { get; set; } = new SpaceGridCell[CellCount, CellCount];
|
public SpaceGridCell[,] Cells { get; set; } = new SpaceGridCell[CellCount, CellCount];
|
||||||
|
|
||||||
|
|
||||||
@ -1835,12 +1859,38 @@ namespace CodeWalker.World
|
|||||||
TotalNodeCount++;
|
TotalNodeCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void AddInterior(CInteriorProxy intprx)
|
||||||
|
{
|
||||||
|
Vector2I min = GetCellPos(intprx.BBMin);
|
||||||
|
Vector2I max = GetCellPos(intprx.BBMax);
|
||||||
|
|
||||||
|
int cellcount = 0;
|
||||||
|
for (int x = min.X; x <= max.X; x++)
|
||||||
|
{
|
||||||
|
for (int y = min.Y; y <= max.Y; y++)
|
||||||
|
{
|
||||||
|
var cell = GetCell(new Vector2I(x, y));
|
||||||
|
cell.AddInterior(intprx);
|
||||||
|
TotalInteriorRefCount++;
|
||||||
|
if (cell.InteriorList.Count > MaxInteriorsInCell)
|
||||||
|
{
|
||||||
|
MaxInteriorsInCell = cell.InteriorList.Count;
|
||||||
|
DensestInteriorCell = cell;
|
||||||
|
}
|
||||||
|
cellcount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cellcount == 0)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
TotalInteriorCount++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public class SpaceGridCell
|
public class SpaceGridCell
|
||||||
{
|
{
|
||||||
public List<MapDataStoreNode> NodesList;
|
public List<MapDataStoreNode> NodesList;
|
||||||
public List<BoundsStoreItem> BoundsList;
|
public List<BoundsStoreItem> BoundsList;
|
||||||
|
public List<CInteriorProxy> InteriorList;
|
||||||
|
|
||||||
public void AddNode(MapDataStoreNode node)
|
public void AddNode(MapDataStoreNode node)
|
||||||
{
|
{
|
||||||
@ -1866,6 +1916,15 @@ namespace CodeWalker.World
|
|||||||
BoundsList.Remove(item);
|
BoundsList.Remove(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void AddInterior(CInteriorProxy intprx)
|
||||||
|
{
|
||||||
|
if (InteriorList == null)
|
||||||
|
{
|
||||||
|
InteriorList = new List<CInteriorProxy>(5);
|
||||||
|
}
|
||||||
|
InteriorList.Add(intprx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public struct SpaceBoundsKey
|
public struct SpaceBoundsKey
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user