mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-11-22 15:02:54 +08:00
Ability to edit YTYP files and MLO Entity Defintions + Revisions to grass brush (#33)
* - Add ability to edit/add ytyp files to project. - Add ability to edit/add ytyp archetype files to ytyp. - Add ability to add/remove entities from mlo archetype defs. - Add ability to save ytyp files. - Add dialog popup before optimizing grass batches. - Fix grass batches not being selected when chaning selection in project explorer. - Merged with upstream/master. - Squashed last 4 commits for PR cleanliness. * Fixed windows forms reference error. * - Added error checking to deleting mlo entities. - Fixed various bugs with deleting mlo entities. - Fixed edit archetype panel Asset Type box. - Removed redundant/unnecessary. - Removed backwards references between MCEntityDef and YmapEntityDef. All ymap entity to mcentity references are grabbed using indecies in the MloInstanceData class. - Fixed "YmapMenu" not showing when selecting entities/mlo entities in project form. Current bugs: - Loading a ytyp file -- mlo entities are not editiable, and are created in the world. - entitysets are not editable (properly). - Removing an mloinstancedef from a ymap does not delete the mlo instance's gizmo from the world, and it's still selectable. (Although all references are lost, and I believe collected by the GC?) * - Moved archetype initialization methods YmapFile.InitYmapEntityArchetypes(GameFileCache gfc) and MloInstanceData.InitYmapEntityArchetypes(GameFileCache gfc) - Added ability to load mlo instance defs through ymap files. - Fixed add method for mlo archetypes. * - Removed SetOrientationInv. - Removed unreachable code + updated comment. - Renamed CreateEntity to CreateYmapEntity, and renamed params for consistency. * Split calls to CreateYmapEntity() and MloArchetype.AddEntity(). * Fixed redundant rotation inversions. * - Added ability to select rooms. - Changed tree view grouping for mlo entities. - Fixed projectexplorer selection bugs. - Added ability to toggle mlo entity sets. - Fixed some change events when editing archetypes.
This commit is contained in:
parent
4da1e3d8c7
commit
462e464c2f
@ -1165,6 +1165,41 @@ namespace CodeWalker.GameFiles
|
||||
if (change) physicsDictionaries = physDict.ToArray();
|
||||
}
|
||||
|
||||
public void InitYmapEntityArchetypes(GameFileCache gfc)
|
||||
{
|
||||
if (AllEntities != null)
|
||||
{
|
||||
for (int i = 0; i < AllEntities.Length; i++)
|
||||
{
|
||||
var ent = AllEntities[i];
|
||||
var arch = gfc.GetArchetype(ent.CEntityDef.archetypeName);
|
||||
ent.SetArchetype(arch);
|
||||
if (ent.IsMlo) ent.MloInstance.InitYmapEntityArchetypes(gfc);
|
||||
}
|
||||
}
|
||||
if (GrassInstanceBatches != null)
|
||||
{
|
||||
for (int i = 0; i < GrassInstanceBatches.Length; i++)
|
||||
{
|
||||
var batch = GrassInstanceBatches[i];
|
||||
batch.Archetype = gfc.GetArchetype(batch.Batch.archetypeName);
|
||||
}
|
||||
}
|
||||
|
||||
if (TimeCycleModifiers != null)
|
||||
{
|
||||
for (int i = 0; i < TimeCycleModifiers.Length; i++)
|
||||
{
|
||||
var tcm = TimeCycleModifiers[i];
|
||||
World.TimecycleMod wtcm;
|
||||
if (gfc.TimeCycleModsDict.TryGetValue(tcm.CTimeCycleModifier.name.Hash, out wtcm))
|
||||
{
|
||||
tcm.TimeCycleModData = wtcm;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static uint SetBit(uint value, int bit)
|
||||
{
|
||||
@ -1194,7 +1229,7 @@ namespace CodeWalker.GameFiles
|
||||
public bool IsMlo { get; set; }
|
||||
public MloInstanceData MloInstance { get; set; }
|
||||
public YmapEntityDef MloParent { get; set; }
|
||||
public MCMloEntitySet MloEntitySet { get; set; }
|
||||
public MloInstanceEntitySet MloEntitySet { get; set; }
|
||||
public Vector3 MloRefPosition { get; set; }
|
||||
public Quaternion MloRefOrientation { get; set; }
|
||||
public MetaWrapper[] Extensions { get; set; }
|
||||
@ -1297,56 +1332,57 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
MloInstance = new MloInstanceData();
|
||||
}
|
||||
MloInstance.CreateYmapEntities(this, mloa);
|
||||
if (mloa != null)
|
||||
{
|
||||
if (!IsMlo)
|
||||
{
|
||||
IsMlo = true;
|
||||
MloInstance._Instance = new CMloInstanceDef { CEntityDef = _CEntityDef };
|
||||
|
||||
List<YmapEntityDef> mloEntities = Ymap.MloEntities?.ToList() ?? new List<YmapEntityDef>();
|
||||
mloEntities.Add(this);
|
||||
Ymap.MloEntities = mloEntities.ToArray();
|
||||
}
|
||||
|
||||
MloInstance.CreateYmapEntities(this, mloa);
|
||||
}
|
||||
|
||||
if (BSRadius == 0.0f)
|
||||
{
|
||||
BSRadius = CEntityDef.lodDist;//need something so it doesn't get culled...
|
||||
}
|
||||
}
|
||||
else if (IsMlo) // archetype is no longer an mlo
|
||||
{
|
||||
IsMlo = false;
|
||||
MloInstance = null;
|
||||
|
||||
if (Ymap.MloEntities != null)
|
||||
{
|
||||
List<YmapEntityDef> mloEntities = Ymap.MloEntities.ToList();
|
||||
if (mloEntities.Remove(this))
|
||||
{
|
||||
Ymap.MloEntities = mloEntities.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void SetPosition(Vector3 pos)
|
||||
{
|
||||
Position = pos;
|
||||
if (MloParent != null)
|
||||
{
|
||||
//TODO: SetPosition for interior entities!
|
||||
Position = pos;
|
||||
var inst = MloParent.MloInstance;
|
||||
if (inst != null)
|
||||
{
|
||||
//transform world position into mlo space
|
||||
//MloRefPosition = ...
|
||||
//MloRefOrientation = ...
|
||||
}
|
||||
_CEntityDef.position = Quaternion.Normalize(Quaternion.Invert(MloParent.Orientation)).Multiply(pos - MloParent.Position);
|
||||
MloRefPosition = _CEntityDef.position;
|
||||
UpdateBB();
|
||||
UpdateMloArchetype();
|
||||
}
|
||||
else
|
||||
{
|
||||
Position = pos;
|
||||
_CEntityDef.position = pos;
|
||||
|
||||
if (Archetype != null)
|
||||
{
|
||||
BSCenter = Orientation.Multiply(Archetype.BSCenter) * Scale;
|
||||
}
|
||||
if ((Archetype != null) && (Orientation == Quaternion.Identity))
|
||||
{
|
||||
BBMin = (Archetype.BBMin * Scale) + Position;
|
||||
BBMax = (Archetype.BBMax * Scale) + Position;
|
||||
}
|
||||
else
|
||||
{
|
||||
BBMin = Position - (BSRadius);
|
||||
BBMax = Position + (BSRadius);
|
||||
////not ideal: should transform all 8 corners!
|
||||
}
|
||||
|
||||
|
||||
|
||||
UpdateWidgetPosition();
|
||||
UpdateBB();
|
||||
}
|
||||
|
||||
|
||||
@ -1356,40 +1392,51 @@ namespace CodeWalker.GameFiles
|
||||
MloInstance.UpdateEntities();
|
||||
}
|
||||
|
||||
UpdateWidgetPosition();
|
||||
}
|
||||
|
||||
public void SetOrientation(Quaternion ori)
|
||||
private void UpdateBB()
|
||||
{
|
||||
Quaternion inv = Quaternion.Normalize(Quaternion.Invert(ori));
|
||||
Orientation = ori;
|
||||
_CEntityDef.rotation = new Vector4(inv.X, inv.Y, inv.Z, inv.W);
|
||||
|
||||
if (MloInstance != null)
|
||||
{
|
||||
MloInstance.SetOrientation(ori);
|
||||
}
|
||||
|
||||
|
||||
if (Archetype != null)
|
||||
{
|
||||
BSCenter = Orientation.Multiply(Archetype.BSCenter) * Scale;
|
||||
}
|
||||
|
||||
UpdateWidgetPosition();
|
||||
UpdateWidgetOrientation();
|
||||
if ((Archetype != null) && (Orientation == Quaternion.Identity))
|
||||
{
|
||||
BBMin = (Archetype.BBMin * Scale) + Position;
|
||||
BBMax = (Archetype.BBMax * Scale) + Position;
|
||||
}
|
||||
else
|
||||
{
|
||||
BBMin = Position - (BSRadius);
|
||||
BBMax = Position + (BSRadius);
|
||||
////not ideal: should transform all 8 corners!
|
||||
}
|
||||
}
|
||||
public void SetOrientationInv(Quaternion inv)
|
||||
|
||||
public void SetOrientation(Quaternion ori, bool inverse = false)
|
||||
{
|
||||
Quaternion ori = Quaternion.Normalize(Quaternion.Invert(inv));
|
||||
Orientation = ori;
|
||||
_CEntityDef.rotation = new Vector4(inv.X, inv.Y, inv.Z, inv.W);
|
||||
if (MloParent != null)
|
||||
{
|
||||
var mloInv = Quaternion.Normalize(Quaternion.Invert(MloParent.Orientation));
|
||||
Quaternion rel = Quaternion.Normalize(Quaternion.Multiply(mloInv, ori));
|
||||
Quaternion inv = Quaternion.Normalize(Quaternion.Invert(rel));
|
||||
Orientation = ori;
|
||||
_CEntityDef.rotation = inv.ToVector4();
|
||||
}
|
||||
else
|
||||
{
|
||||
Quaternion inv = inverse ? ori : Quaternion.Normalize(Quaternion.Invert(ori));
|
||||
ori = inverse ? Quaternion.Normalize(Quaternion.Invert(ori)) : ori;
|
||||
Orientation = ori;
|
||||
_CEntityDef.rotation = inv.ToVector4();
|
||||
}
|
||||
|
||||
if (MloInstance != null)
|
||||
{
|
||||
MloInstance.SetOrientation(ori);
|
||||
}
|
||||
|
||||
|
||||
if (Archetype != null)
|
||||
{
|
||||
BSCenter = Orientation.Multiply(Archetype.BSCenter) * Scale;
|
||||
@ -1404,14 +1451,35 @@ namespace CodeWalker.GameFiles
|
||||
Scale = new Vector3(s.X, s.X, s.Z);
|
||||
_CEntityDef.scaleXY = s.X;
|
||||
_CEntityDef.scaleZ = s.Z;
|
||||
|
||||
MloInstanceData mloInstance = MloParent?.MloInstance;
|
||||
if (mloInstance != null)
|
||||
{
|
||||
var mcEntity = mloInstance.TryGetArchetypeEntity(this);
|
||||
if (mcEntity != null)
|
||||
{
|
||||
mcEntity._Data.scaleXY = s.X;
|
||||
mcEntity._Data.scaleZ = s.Z;
|
||||
}
|
||||
}
|
||||
if (Archetype != null)
|
||||
{
|
||||
float smax = Math.Max(Scale.X, Scale.Z);
|
||||
BSRadius = Archetype.BSRadius * smax;
|
||||
}
|
||||
|
||||
SetPosition(Position);//update the BB
|
||||
}
|
||||
|
||||
private void UpdateMloArchetype()
|
||||
{
|
||||
if (!(MloParent.Archetype is MloArchetype mloArchetype)) return;
|
||||
if (Index >= mloArchetype.entities.Length) return;
|
||||
|
||||
MCEntityDef entity = mloArchetype.entities[Index];
|
||||
entity._Data.position = _CEntityDef.position;
|
||||
entity._Data.rotation = _CEntityDef.rotation;
|
||||
}
|
||||
|
||||
|
||||
public void SetPivotPosition(Vector3 pos)
|
||||
@ -1787,7 +1855,7 @@ namespace CodeWalker.GameFiles
|
||||
}
|
||||
|
||||
private List<rage__fwGrassInstanceListDef__InstanceData>[] SplitGrass(
|
||||
IReadOnlyList<rage__fwGrassInstanceListDef__InstanceData> points,
|
||||
IReadOnlyList<rage__fwGrassInstanceListDef__InstanceData> points,
|
||||
BoundingBox batchAABB)
|
||||
{
|
||||
var pointGroup = new List<rage__fwGrassInstanceListDef__InstanceData>[2];
|
||||
|
@ -21,8 +21,8 @@ namespace CodeWalker.GameFiles
|
||||
public uint NameHash { get; set; }
|
||||
public string[] Strings { get; set; }
|
||||
|
||||
|
||||
public CMapTypes CMapTypes { get; set; }
|
||||
public CMapTypes _CMapTypes;
|
||||
public CMapTypes CMapTypes { get { return _CMapTypes; } set { _CMapTypes = value; } }
|
||||
|
||||
public Archetype[] AllArchetypes { get; set; }
|
||||
|
||||
@ -50,6 +50,111 @@ namespace CodeWalker.GameFiles
|
||||
return (RpfFileEntry != null) ? RpfFileEntry.Name : string.Empty;
|
||||
}
|
||||
|
||||
public byte[] Save()
|
||||
{
|
||||
MetaBuilder mb = new MetaBuilder();
|
||||
|
||||
var mdb = mb.EnsureBlock(MetaName.CMapTypes);
|
||||
|
||||
CMapTypes mapTypes = _CMapTypes;
|
||||
|
||||
if (Extensions == null || Extensions.Length <= 0)
|
||||
mapTypes.extensions = new Array_StructurePointer();
|
||||
else
|
||||
mapTypes.extensions = mb.AddWrapperArrayPtr(Extensions);
|
||||
|
||||
if ((AllArchetypes != null) && (AllArchetypes.Length > 0))
|
||||
{
|
||||
for (int i = 0; i < AllArchetypes.Length; i++)
|
||||
{
|
||||
var arch = AllArchetypes[i]; //save the extensions first..
|
||||
if (arch._BaseArchetypeDef.extensions.Count1 > 0)
|
||||
{
|
||||
arch._BaseArchetypeDef.extensions = mb.AddWrapperArrayPtr(arch.Extensions);
|
||||
}
|
||||
}
|
||||
|
||||
MetaPOINTER[] ptrs = new MetaPOINTER[AllArchetypes.Length];
|
||||
for (int i = 0; i < AllArchetypes.Length; i++)
|
||||
{
|
||||
var arch = AllArchetypes[i];
|
||||
switch (arch)
|
||||
{
|
||||
case TimeArchetype t:
|
||||
ptrs[i] = mb.AddItemPtr(MetaName.CTimeArchetypeDef, t._TimeArchetypeDef);
|
||||
break;
|
||||
case MloArchetype m:
|
||||
try
|
||||
{
|
||||
m._MloArchetypeDef._MloArchetypeDef.entities = mb.AddWrapperArrayPtr(m.entities);
|
||||
m._MloArchetypeDef._MloArchetypeDef.rooms = mb.AddWrapperArray(m.rooms);
|
||||
m._MloArchetypeDef._MloArchetypeDef.portals = mb.AddWrapperArray(m.portals);
|
||||
m._MloArchetypeDef._MloArchetypeDef.entitySets = mb.AddWrapperArray(m.entitySets);
|
||||
m._MloArchetypeDef._MloArchetypeDef.timeCycleModifiers = mb.AddItemArrayPtr(MetaName.CTimeCycleModifier, m.timeCycleModifiers);
|
||||
}
|
||||
catch/* (Exception e)*/
|
||||
{
|
||||
//todo: log save error.
|
||||
}
|
||||
ptrs[i] = mb.AddItemPtr(MetaName.CMloArchetypeDef, m._MloArchetypeDef);
|
||||
break;
|
||||
case Archetype a:
|
||||
ptrs[i] = mb.AddItemPtr(MetaName.CBaseArchetypeDef, a._BaseArchetypeDef);
|
||||
break;
|
||||
}
|
||||
}
|
||||
mapTypes.archetypes = mb.AddPointerArray(ptrs);
|
||||
}
|
||||
else
|
||||
{
|
||||
mapTypes.archetypes = new Array_StructurePointer();
|
||||
}
|
||||
|
||||
if (CompositeEntityTypes != null && CompositeEntityTypes.Length > 0)
|
||||
{
|
||||
var cptrs = new MetaPOINTER[CompositeEntityTypes.Length];
|
||||
|
||||
for (int i = 0; i < cptrs.Length; i++)
|
||||
{
|
||||
var cet = CompositeEntityTypes[i];
|
||||
cptrs[i] = mb.AddItemPtr(MetaName.CCompositeEntityType, cet);
|
||||
}
|
||||
mapTypes.compositeEntityTypes = mb.AddItemArrayPtr(MetaName.CCompositeEntityType, cptrs);
|
||||
}
|
||||
|
||||
mapTypes.name = NameHash;
|
||||
mapTypes.dependencies = new Array_uint(); // is this never used? possibly a todo?
|
||||
|
||||
mb.AddStructureInfo(MetaName.CMapTypes);
|
||||
mb.AddStructureInfo(MetaName.CBaseArchetypeDef);
|
||||
mb.AddStructureInfo(MetaName.CMloArchetypeDef);
|
||||
mb.AddStructureInfo(MetaName.CTimeArchetypeDef);
|
||||
mb.AddStructureInfo(MetaName.CCompositeEntityType);
|
||||
mb.AddStructureInfo(MetaName.CMloRoomDef);
|
||||
mb.AddStructureInfo(MetaName.CMloPortalDef);
|
||||
mb.AddStructureInfo(MetaName.CMloEntitySet);
|
||||
|
||||
if ((AllArchetypes != null && AllArchetypes.Length > 0))
|
||||
{
|
||||
mb.AddEnumInfo((MetaName)1991964615); // ASSET_TYPE_
|
||||
}
|
||||
|
||||
if ((AllArchetypes != null) && (AllArchetypes.Any(x => x is MloArchetype m && m.entities.Length > 0)))
|
||||
{
|
||||
mb.AddStructureInfo(MetaName.CEntityDef);
|
||||
mb.AddEnumInfo((MetaName)1264241711); //LODTYPES_
|
||||
mb.AddEnumInfo((MetaName)648413703); //PRI_
|
||||
}
|
||||
|
||||
mb.AddItem(MetaName.CMapTypes, mapTypes);
|
||||
|
||||
Meta meta = mb.GetMeta();
|
||||
byte[] data = ResourceBuilder.Build(meta, 2);
|
||||
|
||||
HasChanged = false;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
public void Load(byte[] data)
|
||||
{
|
||||
@ -94,12 +199,12 @@ namespace CodeWalker.GameFiles
|
||||
Meta = rd.ReadBlock<Meta>();
|
||||
|
||||
|
||||
CMapTypes = MetaTypes.GetTypedData<CMapTypes>(Meta, MetaName.CMapTypes);
|
||||
_CMapTypes = MetaTypes.GetTypedData<CMapTypes>(Meta, MetaName.CMapTypes);
|
||||
|
||||
|
||||
List<Archetype> allarchs = new List<Archetype>();
|
||||
|
||||
var ptrs = MetaTypes.GetPointerArray(Meta, CMapTypes.archetypes);
|
||||
var ptrs = MetaTypes.GetPointerArray(Meta, _CMapTypes.archetypes);
|
||||
if (ptrs != null)
|
||||
{
|
||||
for (int i = 0; i < ptrs.Length; i++)
|
||||
@ -151,7 +256,8 @@ namespace CodeWalker.GameFiles
|
||||
AllArchetypes = allarchs.ToArray();
|
||||
|
||||
|
||||
Extensions = MetaTypes.GetExtensions(Meta, CMapTypes.extensions);
|
||||
Extensions = MetaTypes.GetExtensions(Meta, _CMapTypes.extensions);
|
||||
|
||||
if (Extensions != null)
|
||||
{ }
|
||||
|
||||
@ -163,11 +269,11 @@ namespace CodeWalker.GameFiles
|
||||
//CEntityDefs = MetaTypes.GetTypedDataArray<CEntityDef>(Meta, MetaName.CEntityDef);
|
||||
|
||||
|
||||
CompositeEntityTypes = MetaTypes.ConvertDataArray<CCompositeEntityType>(Meta, MetaName.CCompositeEntityType, CMapTypes.compositeEntityTypes);
|
||||
CompositeEntityTypes = MetaTypes.ConvertDataArray<CCompositeEntityType>(Meta, MetaName.CCompositeEntityType, _CMapTypes.compositeEntityTypes);
|
||||
if (CompositeEntityTypes != null)
|
||||
{ }
|
||||
|
||||
NameHash = CMapTypes.name;
|
||||
NameHash = _CMapTypes.name;
|
||||
if (NameHash == 0)
|
||||
{
|
||||
int ind = entry.NameLower.LastIndexOf('.');
|
||||
@ -241,122 +347,39 @@ namespace CodeWalker.GameFiles
|
||||
|
||||
}
|
||||
|
||||
public void AddArchetype(Archetype arch)
|
||||
|
||||
public void AddArchetype(Archetype archetype)
|
||||
{
|
||||
List<Archetype> allArchs = new List<Archetype>();
|
||||
if (AllArchetypes == null)
|
||||
AllArchetypes = new Archetype[0];
|
||||
|
||||
if (AllArchetypes != null)
|
||||
allArchs.AddRange(AllArchetypes);
|
||||
|
||||
allArchs.Add(arch);
|
||||
|
||||
AllArchetypes = allArchs.ToArray();
|
||||
List<Archetype> archetypes = AllArchetypes.ToList();
|
||||
archetype.Ytyp = this;
|
||||
archetypes.Add(archetype);
|
||||
AllArchetypes = archetypes.ToArray();
|
||||
}
|
||||
|
||||
public void RemoveArchetype(Archetype arch)
|
||||
public Archetype AddArchetype()
|
||||
{
|
||||
List<Archetype> allArchs = new List<Archetype>();
|
||||
|
||||
if (AllArchetypes != null)
|
||||
allArchs.AddRange(AllArchetypes);
|
||||
|
||||
if (allArchs.Contains(arch))
|
||||
allArchs.Remove(arch);
|
||||
|
||||
AllArchetypes = allArchs.ToArray();
|
||||
var a = new Archetype();
|
||||
a._BaseArchetypeDef.assetType = Unk_1991964615.ASSET_TYPE_DRAWABLE;
|
||||
a._BaseArchetypeDef.lodDist = 60;
|
||||
a._BaseArchetypeDef.hdTextureDist = 15;
|
||||
a.Ytyp = this;
|
||||
AddArchetype(a);
|
||||
return a;
|
||||
}
|
||||
|
||||
public byte[] Save()
|
||||
public bool RemoveArchetype(Archetype archetype)
|
||||
{
|
||||
MetaBuilder mb = new MetaBuilder();
|
||||
|
||||
var mdb = mb.EnsureBlock(MetaName.CMapTypes);
|
||||
|
||||
CMapTypes mapTypes = CMapTypes;
|
||||
|
||||
if((AllArchetypes != null) && (AllArchetypes.Length > 0))
|
||||
List<Archetype> archetypes = AllArchetypes.ToList();
|
||||
if (archetypes.Remove(archetype))
|
||||
{
|
||||
MetaPOINTER[] archPtrs = new MetaPOINTER[AllArchetypes.Length];
|
||||
|
||||
for(int i=0; i<AllArchetypes.Length; i++)
|
||||
{
|
||||
var arch = AllArchetypes[i];
|
||||
arch._BaseArchetypeDef.extensions = mb.AddWrapperArrayPtr(arch.Extensions);
|
||||
}
|
||||
|
||||
for (int i = 0; i < archPtrs.Length; i++)
|
||||
{
|
||||
var arch = AllArchetypes[i];
|
||||
|
||||
if (arch is MloArchetype)
|
||||
{
|
||||
var mloArch = arch as MloArchetype;
|
||||
|
||||
mloArch._BaseMloArchetypeDef._MloArchetypeDef.entities = mb.AddWrapperArrayPtr(mloArch.entities);
|
||||
mloArch._BaseMloArchetypeDef._MloArchetypeDef.rooms = mb.AddWrapperArray(mloArch.rooms);
|
||||
mloArch._BaseMloArchetypeDef._MloArchetypeDef.portals = mb.AddWrapperArray(mloArch.portals);
|
||||
mloArch._BaseMloArchetypeDef._MloArchetypeDef.entitySets = mb.AddWrapperArray(mloArch.entitySets);
|
||||
mloArch._BaseMloArchetypeDef._MloArchetypeDef.timeCycleModifiers = mb.AddItemArrayPtr(MetaName.CTimeCycleModifier, mloArch.timeCycleModifiers);
|
||||
|
||||
archPtrs[i] = mb.AddItemPtr(MetaName.CMloArchetypeDef, mloArch.BaseMloArchetypeDef);
|
||||
|
||||
}
|
||||
else if (arch is TimeArchetype)
|
||||
{
|
||||
var timeArch = arch as TimeArchetype;
|
||||
archPtrs[i] = mb.AddItemPtr(MetaName.CTimeArchetypeDef, timeArch.TimeArchetypeDef);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
archPtrs[i] = mb.AddItemPtr(MetaName.CBaseArchetypeDef, arch.BaseArchetypeDef);
|
||||
}
|
||||
}
|
||||
|
||||
mapTypes.archetypes = mb.AddPointerArray(archPtrs);
|
||||
AllArchetypes = archetypes.ToArray();
|
||||
return true;
|
||||
}
|
||||
|
||||
if((CompositeEntityTypes != null) && (CompositeEntityTypes.Length > 0))
|
||||
{
|
||||
MetaPOINTER[] cetPtrs = new MetaPOINTER[CompositeEntityTypes.Length] ;
|
||||
|
||||
for (int i = 0; i < cetPtrs.Length; i++)
|
||||
{
|
||||
var cet = CompositeEntityTypes[i];
|
||||
cetPtrs[i] = mb.AddItemPtr(MetaName.CCompositeEntityType, cet);
|
||||
}
|
||||
|
||||
mapTypes.compositeEntityTypes = mb.AddItemArrayPtr(MetaName.CCompositeEntityType, cetPtrs);
|
||||
}
|
||||
|
||||
mb.AddItem(MetaName.CMapTypes, mapTypes);
|
||||
|
||||
mb.AddStructureInfo(MetaName.CMapTypes);
|
||||
mb.AddStructureInfo(MetaName.CBaseArchetypeDef);
|
||||
mb.AddStructureInfo(MetaName.CMloArchetypeDef);
|
||||
mb.AddStructureInfo(MetaName.CTimeArchetypeDef);
|
||||
mb.AddStructureInfo(MetaName.CMloRoomDef);
|
||||
mb.AddStructureInfo(MetaName.CMloPortalDef);
|
||||
mb.AddStructureInfo(MetaName.CMloEntitySet);
|
||||
mb.AddStructureInfo(MetaName.CCompositeEntityType);
|
||||
|
||||
mb.AddEnumInfo((MetaName)1991964615);
|
||||
mb.AddEnumInfo((MetaName)1294270217);
|
||||
mb.AddEnumInfo((MetaName)1264241711);
|
||||
mb.AddEnumInfo((MetaName)648413703);
|
||||
mb.AddEnumInfo((MetaName)3573596290);
|
||||
mb.AddEnumInfo((MetaName)700327466);
|
||||
mb.AddEnumInfo((MetaName)193194928);
|
||||
mb.AddEnumInfo((MetaName)2266515059);
|
||||
|
||||
Meta = mb.GetMeta();
|
||||
|
||||
byte[] data = ResourceBuilder.Build(Meta, 2); //ymap is version 2...
|
||||
|
||||
return data;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -1804,116 +1804,6 @@ namespace CodeWalker.GameFiles
|
||||
}
|
||||
|
||||
|
||||
public void InitYmapEntityArchetypes(YmapFile file)
|
||||
{
|
||||
if (file == null) return;
|
||||
if (file.AllEntities != null)
|
||||
{
|
||||
for (int i = 0; i < file.AllEntities.Length; i++)
|
||||
{
|
||||
var ent = file.AllEntities[i];
|
||||
var arch = GetArchetype(ent.CEntityDef.archetypeName);
|
||||
ent.SetArchetype(arch);
|
||||
|
||||
if (ent.MloInstance != null)
|
||||
{
|
||||
var entities = ent.MloInstance.Entities;
|
||||
if (entities != null)
|
||||
{
|
||||
for (int j = 0; j < entities.Length; j++)
|
||||
{
|
||||
var ient = entities[j];
|
||||
var iarch = GetArchetype(ient.CEntityDef.archetypeName);
|
||||
ient.SetArchetype(iarch);
|
||||
if (iarch == null)
|
||||
{ } //can't find archetype - des stuff eg {des_prologue_door}
|
||||
}
|
||||
|
||||
|
||||
//update archetype room AABB's.. bad to have this here? where else to put it?
|
||||
var mloa = arch as MloArchetype;
|
||||
if (mloa != null)
|
||||
{
|
||||
Vector3 mlobbmin = Vector3.Zero;
|
||||
Vector3 mlobbmax = Vector3.Zero;
|
||||
Vector3[] c = new Vector3[8];
|
||||
var rooms = mloa.rooms;
|
||||
if (rooms != null)
|
||||
{
|
||||
for (int j = 0; j < rooms.Length; j++)
|
||||
{
|
||||
var room = rooms[j];
|
||||
if ((room.AttachedObjects == null) || (room.AttachedObjects.Length == 0)) continue;
|
||||
Vector3 min = new Vector3(float.MaxValue);
|
||||
Vector3 max = new Vector3(float.MinValue);
|
||||
for (int k = 0; k < room.AttachedObjects.Length; k++)
|
||||
{
|
||||
var objid = room.AttachedObjects[k];
|
||||
if (objid < entities.Length)
|
||||
{
|
||||
var rooment = entities[objid];
|
||||
if ((rooment != null) && (rooment.Archetype != null))
|
||||
{
|
||||
var earch = rooment.Archetype;
|
||||
var pos = rooment._CEntityDef.position;
|
||||
var ori = rooment.Orientation;
|
||||
Vector3 abmin = earch.BBMin * rooment.Scale; //entity box
|
||||
Vector3 abmax = earch.BBMax * rooment.Scale;
|
||||
c[0] = abmin;
|
||||
c[1] = new Vector3(abmin.X, abmin.Y, abmax.Z);
|
||||
c[2] = new Vector3(abmin.X, abmax.Y, abmin.Z);
|
||||
c[3] = new Vector3(abmin.X, abmax.Y, abmax.Z);
|
||||
c[4] = new Vector3(abmax.X, abmin.Y, abmin.Z);
|
||||
c[5] = new Vector3(abmax.X, abmin.Y, abmax.Z);
|
||||
c[6] = new Vector3(abmax.X, abmax.Y, abmin.Z);
|
||||
c[7] = abmax;
|
||||
for (int n = 0; n < 8; n++)
|
||||
{
|
||||
Vector3 corn = ori.Multiply(c[n]) + pos;
|
||||
min = Vector3.Min(min, corn);
|
||||
max = Vector3.Max(max, corn);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
room.BBMin_CW = min;
|
||||
room.BBMax_CW = max;
|
||||
mlobbmin = Vector3.Min(mlobbmin, min);
|
||||
mlobbmax = Vector3.Max(mlobbmax, max);
|
||||
}
|
||||
}
|
||||
mloa.BBMin = mlobbmin;
|
||||
mloa.BBMax = mlobbmax;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
if (file.GrassInstanceBatches != null)
|
||||
{
|
||||
for (int i = 0; i < file.GrassInstanceBatches.Length; i++)
|
||||
{
|
||||
var batch = file.GrassInstanceBatches[i];
|
||||
batch.Archetype = GetArchetype(batch.Batch.archetypeName);
|
||||
}
|
||||
}
|
||||
|
||||
if (file.TimeCycleModifiers != null)
|
||||
{
|
||||
for (int i = 0; i < file.TimeCycleModifiers.Length; i++)
|
||||
{
|
||||
var tcm = file.TimeCycleModifiers[i];
|
||||
World.TimecycleMod wtcm;
|
||||
if (TimeCycleModsDict.TryGetValue(tcm.CTimeCycleModifier.name.Hash, out wtcm))
|
||||
{
|
||||
tcm.TimeCycleModData = wtcm;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -1955,8 +1845,9 @@ namespace CodeWalker.GameFiles
|
||||
if (req.Loaded) AddTextureLookups(req as YtdFile);
|
||||
break;
|
||||
case GameFileType.Ymap:
|
||||
req.Loaded = LoadFile(req as YmapFile);
|
||||
if (req.Loaded) InitYmapEntityArchetypes(req as YmapFile);
|
||||
YmapFile y = req as YmapFile;
|
||||
req.Loaded = LoadFile(y);
|
||||
if (req.Loaded) y.InitYmapEntityArchetypes(this);
|
||||
break;
|
||||
case GameFileType.Yft:
|
||||
req.Loaded = LoadFile(req as YftFile);
|
||||
|
@ -14,7 +14,7 @@ namespace CodeWalker.GameFiles
|
||||
public virtual MetaName Type => MetaName.CBaseArchetypeDef;
|
||||
|
||||
public CBaseArchetypeDef _BaseArchetypeDef;
|
||||
public CBaseArchetypeDef BaseArchetypeDef { get { return _BaseArchetypeDef; } set { _BaseArchetypeDef = value; } }
|
||||
public CBaseArchetypeDef BaseArchetypeDef => _BaseArchetypeDef; // for browsing.
|
||||
|
||||
public MetaHash Hash { get; set; }
|
||||
public YtypFile Ytyp { get; set; }
|
||||
@ -31,16 +31,16 @@ namespace CodeWalker.GameFiles
|
||||
|
||||
|
||||
|
||||
public string Name
|
||||
public string Name
|
||||
{
|
||||
get
|
||||
get
|
||||
{
|
||||
return _BaseArchetypeDef.name.ToString();
|
||||
}
|
||||
}
|
||||
public string AssetName
|
||||
public string AssetName
|
||||
{
|
||||
get
|
||||
get
|
||||
{
|
||||
return _BaseArchetypeDef.assetName.ToString();
|
||||
}
|
||||
@ -49,7 +49,7 @@ namespace CodeWalker.GameFiles
|
||||
|
||||
protected void InitVars(ref CBaseArchetypeDef arch)
|
||||
{
|
||||
BaseArchetypeDef = arch;
|
||||
_BaseArchetypeDef = arch;
|
||||
Hash = arch.assetName;
|
||||
if (Hash.Hash == 0) Hash = arch.name;
|
||||
DrawableDict = arch.drawableDictionary;
|
||||
@ -83,10 +83,8 @@ namespace CodeWalker.GameFiles
|
||||
public class TimeArchetype : Archetype
|
||||
{
|
||||
public override MetaName Type => MetaName.CTimeArchetypeDef;
|
||||
|
||||
public CTimeArchetypeDefData _TimeArchetypeDef;
|
||||
public CTimeArchetypeDefData TimeArchetypeDef { get { return _TimeArchetypeDef; } set { _TimeArchetypeDef = value; } }
|
||||
|
||||
public CTimeArchetypeDef _TimeArchetypeDef;
|
||||
public CTimeArchetypeDef TimeArchetypeDef => _TimeArchetypeDef; // for browsing.
|
||||
|
||||
public uint TimeFlags { get; set; }
|
||||
public bool[] ActiveHours { get; set; }
|
||||
@ -98,9 +96,9 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
Ytyp = ytyp;
|
||||
InitVars(ref arch._BaseArchetypeDef);
|
||||
TimeArchetypeDef = arch.TimeArchetypeDef;
|
||||
_TimeArchetypeDef = arch;
|
||||
|
||||
TimeFlags = _TimeArchetypeDef.timeFlags;
|
||||
TimeFlags = arch.TimeArchetypeDef.timeFlags;
|
||||
ActiveHours = new bool[24];
|
||||
ActiveHoursText = new string[24];
|
||||
for (int i = 0; i < 24; i++)
|
||||
@ -128,11 +126,10 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
public override MetaName Type => MetaName.CMloArchetypeDef;
|
||||
|
||||
public CMloArchetypeDef _BaseMloArchetypeDef;
|
||||
public CMloArchetypeDef BaseMloArchetypeDef { get { return _BaseMloArchetypeDef; } set { _BaseMloArchetypeDef = value; } }
|
||||
|
||||
public CMloArchetypeDefData _MloArchetypeDef;
|
||||
public CMloArchetypeDefData MloArchetypeDef { get { return _MloArchetypeDef; } set { _MloArchetypeDef = value; } }
|
||||
public CMloArchetypeDef MloArchetypeDef => _MloArchetypeDef; // for browsing.
|
||||
public CMloArchetypeDef _MloArchetypeDef;
|
||||
public CMloArchetypeDefData _MloArchetypeDefData;
|
||||
|
||||
public MCEntityDef[] entities { get; set; }
|
||||
public MCMloRoomDef[] rooms { get; set; }
|
||||
@ -140,37 +137,147 @@ namespace CodeWalker.GameFiles
|
||||
public MCMloEntitySet[] entitySets { get; set; }
|
||||
public CMloTimeCycleModifier[] timeCycleModifiers { get; set; }
|
||||
|
||||
|
||||
public void Init(YtypFile ytyp, ref CMloArchetypeDef arch)
|
||||
{
|
||||
Ytyp = ytyp;
|
||||
InitVars(ref arch._BaseArchetypeDef);
|
||||
BaseMloArchetypeDef = arch;
|
||||
MloArchetypeDef = arch.MloArchetypeDef;
|
||||
_MloArchetypeDef = arch;
|
||||
_MloArchetypeDefData = arch.MloArchetypeDef;
|
||||
}
|
||||
|
||||
public bool AddEntity(YmapEntityDef ent, int roomIndex)
|
||||
{
|
||||
if (ent == null) return false;
|
||||
|
||||
// entity already exists in our array. so we'll just add
|
||||
// it to the instanced entities list and continue.
|
||||
MloInstanceData mloInstance = ent.MloParent?.MloInstance;
|
||||
MCEntityDef ymcent = mloInstance?.TryGetArchetypeEntity(ent);
|
||||
if (ymcent != null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (roomIndex > rooms.Length)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException($"Room index {roomIndex} exceeds the amount of rooms in {Name}.");
|
||||
}
|
||||
|
||||
var mcEntityDef = new MCEntityDef(ref ent._CEntityDef, this);
|
||||
|
||||
// Add the new entity def to the entities list.
|
||||
AddEntity(ent, mcEntityDef);
|
||||
|
||||
// Update the attached objects in the room index specified.
|
||||
AttachEntityToRoom(ent, roomIndex);
|
||||
return true;
|
||||
}
|
||||
|
||||
// attaches the specified ymap entity index to the room at roomIndex.
|
||||
private void AttachEntityToRoom(YmapEntityDef ent, int roomIndex)
|
||||
{
|
||||
if (roomIndex > rooms.Length)
|
||||
{
|
||||
return; // the room index is bigger than the rooms we have...
|
||||
}
|
||||
var attachedObjs = rooms[roomIndex].AttachedObjects?.ToList() ?? new List<uint>();
|
||||
attachedObjs.Add((uint)ent.Index);
|
||||
rooms[roomIndex].AttachedObjects = attachedObjs.ToArray();
|
||||
}
|
||||
|
||||
// Adds an entity to the entities array and then set's the index of the
|
||||
// ymap entity to the index of the new MCEntityDef.
|
||||
private void AddEntity(YmapEntityDef ent, MCEntityDef mcEntityDef)
|
||||
{
|
||||
if (ent == null || mcEntityDef == null) return; // no entity?...
|
||||
// initialize the array.
|
||||
if (entities == null) entities = new MCEntityDef[0];
|
||||
|
||||
List<MCEntityDef> entList = entities.ToList();
|
||||
entList.Add(mcEntityDef);
|
||||
ent.Index = entList.IndexOf(mcEntityDef);
|
||||
entities = entList.ToArray();
|
||||
}
|
||||
|
||||
public bool RemoveEntity(YmapEntityDef ent)
|
||||
{
|
||||
if (ent.Index >= entities.Length) return false;
|
||||
|
||||
MCEntityDef delent = entities[ent.Index];
|
||||
MloInstanceData inst = ent.MloParent?.MloInstance;
|
||||
if (inst == null) return false;
|
||||
|
||||
if (delent != null)
|
||||
{
|
||||
MCEntityDef[] newentities = new MCEntityDef[entities.Length - 1];
|
||||
bool didDel = false;
|
||||
int index = 0;
|
||||
int delIndex = 0;
|
||||
for (int i = 0; i < entities.Length; i++)
|
||||
{
|
||||
if (entities[i] == delent)
|
||||
{
|
||||
delIndex = i;
|
||||
didDel = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
newentities[index] = entities[i];
|
||||
YmapEntityDef ymapEntityDef = inst.TryGetYmapEntity(newentities[index]);
|
||||
if (ymapEntityDef != null) ymapEntityDef.Index = index;
|
||||
index++;
|
||||
}
|
||||
entities = newentities;
|
||||
|
||||
if (didDel) FixRoomIndexes(delIndex);
|
||||
return didDel;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void FixRoomIndexes(int deletedIndex)
|
||||
{
|
||||
foreach (var room in rooms)
|
||||
{
|
||||
List<uint> newAttachedObjects = new List<uint>();
|
||||
if (room.AttachedObjects == null)
|
||||
continue;
|
||||
foreach (var objIndex in room.AttachedObjects)
|
||||
{
|
||||
if (objIndex == deletedIndex) continue;
|
||||
if (objIndex > deletedIndex)
|
||||
newAttachedObjects.Add(objIndex - 1); // move the index back so it matches the index in the entitiy array.
|
||||
else newAttachedObjects.Add(objIndex); // else just add the index to the attached objects.
|
||||
}
|
||||
room.AttachedObjects = newAttachedObjects.ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
public void LoadChildren(Meta meta)
|
||||
{
|
||||
var centities = MetaTypes.ConvertDataArray<CEntityDef>(meta, MetaName.CEntityDef, _MloArchetypeDef.entities);
|
||||
var centities = MetaTypes.ConvertDataArray<CEntityDef>(meta, MetaName.CEntityDef, _MloArchetypeDefData.entities);
|
||||
if (centities != null)
|
||||
{
|
||||
entities = new MCEntityDef[centities.Length];
|
||||
for (int i = 0; i < centities.Length; i++)
|
||||
{
|
||||
entities[i] = new MCEntityDef(meta, centities[i]);
|
||||
entities[i] = new MCEntityDef(meta, ref centities[i]) { Archetype = this };
|
||||
}
|
||||
}
|
||||
|
||||
var crooms = MetaTypes.ConvertDataArray<CMloRoomDef>(meta, MetaName.CMloRoomDef, _MloArchetypeDef.rooms);
|
||||
var crooms = MetaTypes.ConvertDataArray<CMloRoomDef>(meta, MetaName.CMloRoomDef, _MloArchetypeDefData.rooms);
|
||||
if (crooms != null)
|
||||
{
|
||||
rooms = new MCMloRoomDef[crooms.Length];
|
||||
for (int i = 0; i < crooms.Length; i++)
|
||||
{
|
||||
rooms[i] = new MCMloRoomDef(meta, crooms[i]);
|
||||
rooms[i] = new MCMloRoomDef(meta, crooms[i]) { Archetype = this, Index = i };
|
||||
}
|
||||
}
|
||||
|
||||
var cportals = MetaTypes.ConvertDataArray<CMloPortalDef>(meta, MetaName.CMloPortalDef, _MloArchetypeDef.portals);
|
||||
var cportals = MetaTypes.ConvertDataArray<CMloPortalDef>(meta, MetaName.CMloPortalDef, _MloArchetypeDefData.portals);
|
||||
if (cportals != null)
|
||||
{
|
||||
portals = new MCMloPortalDef[cportals.Length];
|
||||
@ -180,7 +287,7 @@ namespace CodeWalker.GameFiles
|
||||
}
|
||||
}
|
||||
|
||||
var centitySets = MetaTypes.ConvertDataArray<CMloEntitySet>(meta, MetaName.CMloEntitySet, _MloArchetypeDef.entitySets);
|
||||
var centitySets = MetaTypes.ConvertDataArray<CMloEntitySet>(meta, MetaName.CMloEntitySet, _MloArchetypeDefData.entitySets);
|
||||
if (centitySets != null)
|
||||
{
|
||||
entitySets = new MCMloEntitySet[centitySets.Length];
|
||||
@ -191,14 +298,44 @@ namespace CodeWalker.GameFiles
|
||||
}
|
||||
|
||||
|
||||
timeCycleModifiers = MetaTypes.ConvertDataArray<CMloTimeCycleModifier>(meta, MetaName.CMloTimeCycleModifier, _MloArchetypeDef.timeCycleModifiers);
|
||||
timeCycleModifiers = MetaTypes.ConvertDataArray<CMloTimeCycleModifier>(meta, MetaName.CMloTimeCycleModifier, _MloArchetypeDefData.timeCycleModifiers);
|
||||
|
||||
}
|
||||
|
||||
public MCMloRoomDef GetEntityRoom(MCEntityDef ent)
|
||||
{
|
||||
int objectIndex = -1;
|
||||
for (int i = 0; i < entities.Length; i++)
|
||||
{
|
||||
MCEntityDef e = entities[i];
|
||||
if (e == ent)
|
||||
{
|
||||
objectIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (objectIndex == -1) return null;
|
||||
|
||||
MCMloRoomDef room = null;
|
||||
for (int i = 0; i < rooms.Length; i++)
|
||||
{
|
||||
MCMloRoomDef r = rooms[i];
|
||||
for (int j = 0; j < r.AttachedObjects.Length; j++)
|
||||
{
|
||||
uint ind = r.AttachedObjects[j];
|
||||
if (ind == objectIndex)
|
||||
{
|
||||
room = r;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (room != null) break;
|
||||
}
|
||||
|
||||
return room;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
[TypeConverter(typeof(ExpandableObjectConverter))]
|
||||
public class MloInstanceData
|
||||
{
|
||||
@ -208,7 +345,12 @@ namespace CodeWalker.GameFiles
|
||||
public uint[] defaultEntitySets { get; set; }
|
||||
|
||||
public YmapEntityDef[] Entities { get; set; }
|
||||
public Dictionary<MetaHash, MloInstanceEntitySet> EntitySets { get; set; }
|
||||
|
||||
public MloInstanceData()
|
||||
{
|
||||
EntitySets = new Dictionary<MetaHash, MloInstanceEntitySet>();
|
||||
}
|
||||
|
||||
public void CreateYmapEntities(YmapEntityDef owner, MloArchetype mloa)
|
||||
{
|
||||
@ -234,27 +376,182 @@ namespace CodeWalker.GameFiles
|
||||
var entitySet = entitySets[i];
|
||||
if (entitySet.Entities != null)
|
||||
{
|
||||
EntitySets[entitySet._Data.name] = new MloInstanceEntitySet(entitySet, this);
|
||||
MloInstanceEntitySet instset = EntitySets[entitySet._Data.name];
|
||||
for (int j = 0; j < entitySet.Entities.Length; j++)
|
||||
{
|
||||
YmapEntityDef e = CreateYmapEntity(owner, entitySet.Entities[j], lasti);
|
||||
e.MloEntitySet = entitySet;
|
||||
entlist.Add(e);
|
||||
EntitySets[entitySet._Data.name].Entities.Add(e);
|
||||
e.MloEntitySet = instset;
|
||||
lasti++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (defaultEntitySets != null)
|
||||
if ((defaultEntitySets != null) && (entitySets != null))
|
||||
{
|
||||
for (var i = 0; i < defaultEntitySets.Length; i++)
|
||||
{
|
||||
uint index = defaultEntitySets[i];
|
||||
if (index >= entitySets.Length) continue;
|
||||
MCMloEntitySet set = entitySets[index];
|
||||
MloInstanceEntitySet instset = EntitySets[set._Data.name];
|
||||
instset.Visible = true;
|
||||
}
|
||||
}
|
||||
|
||||
Entities = entlist.ToArray();
|
||||
}
|
||||
|
||||
private YmapEntityDef CreateYmapEntity(YmapEntityDef owner, MCEntityDef ment, int i)
|
||||
public void InitYmapEntityArchetypes(GameFileCache gfc)
|
||||
{
|
||||
YmapEntityDef e = new YmapEntityDef(null, i, ref ment._Data);
|
||||
if (Owner == null) return;
|
||||
var arch = Owner.Archetype;
|
||||
|
||||
if (Entities != null)
|
||||
{
|
||||
for (int j = 0; j < Entities.Length; j++)
|
||||
{
|
||||
var ient = Entities[j];
|
||||
var iarch = gfc.GetArchetype(ient.CEntityDef.archetypeName);
|
||||
ient.SetArchetype(iarch);
|
||||
|
||||
if (iarch == null)
|
||||
{ } //can't find archetype - des stuff eg {des_prologue_door}
|
||||
}
|
||||
|
||||
UpdateBBs(arch);
|
||||
}
|
||||
|
||||
if (EntitySets != null)
|
||||
{
|
||||
foreach (var entitySet in EntitySets)
|
||||
{
|
||||
var entities = entitySet.Value.Entities;
|
||||
if (entities == null) continue;
|
||||
|
||||
for (int i = 0; i < entities.Count; i++)
|
||||
{
|
||||
var ient = entities[i];
|
||||
var iarch = gfc.GetArchetype(ient.CEntityDef.archetypeName);
|
||||
ient.SetArchetype(iarch);
|
||||
|
||||
if (iarch == null)
|
||||
{ } //can't find archetype - des stuff eg {des_prologue_door}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdateBBs(Archetype arch)
|
||||
{
|
||||
//update archetype room AABB's.. bad to have this here? where else to put it?
|
||||
var mloa = arch as MloArchetype;
|
||||
if (mloa != null)
|
||||
{
|
||||
Vector3 mlobbmin = Vector3.Zero;
|
||||
Vector3 mlobbmax = Vector3.Zero;
|
||||
Vector3[] c = new Vector3[8];
|
||||
var rooms = mloa.rooms;
|
||||
if (rooms != null)
|
||||
{
|
||||
for (int j = 0; j < rooms.Length; j++)
|
||||
{
|
||||
var room = rooms[j];
|
||||
if ((room.AttachedObjects == null) || (room.AttachedObjects.Length == 0)) continue;
|
||||
Vector3 min = new Vector3(float.MaxValue);
|
||||
Vector3 max = new Vector3(float.MinValue);
|
||||
for (int k = 0; k < room.AttachedObjects.Length; k++)
|
||||
{
|
||||
var objid = room.AttachedObjects[k];
|
||||
if (objid < Entities.Length)
|
||||
{
|
||||
var rooment = Entities[objid];
|
||||
if ((rooment != null) && (rooment.Archetype != null))
|
||||
{
|
||||
var earch = rooment.Archetype;
|
||||
var pos = rooment._CEntityDef.position;
|
||||
var ori = rooment.Orientation;
|
||||
Vector3 abmin = earch.BBMin * rooment.Scale; //entity box
|
||||
Vector3 abmax = earch.BBMax * rooment.Scale;
|
||||
c[0] = abmin;
|
||||
c[1] = new Vector3(abmin.X, abmin.Y, abmax.Z);
|
||||
c[2] = new Vector3(abmin.X, abmax.Y, abmin.Z);
|
||||
c[3] = new Vector3(abmin.X, abmax.Y, abmax.Z);
|
||||
c[4] = new Vector3(abmax.X, abmin.Y, abmin.Z);
|
||||
c[5] = new Vector3(abmax.X, abmin.Y, abmax.Z);
|
||||
c[6] = new Vector3(abmax.X, abmax.Y, abmin.Z);
|
||||
c[7] = abmax;
|
||||
for (int n = 0; n < 8; n++)
|
||||
{
|
||||
Vector3 corn = ori.Multiply(c[n]) + pos;
|
||||
min = Vector3.Min(min, corn);
|
||||
max = Vector3.Max(max, corn);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
room.BBMin_CW = min;
|
||||
room.BBMax_CW = max;
|
||||
mlobbmin = Vector3.Min(mlobbmin, min);
|
||||
mlobbmax = Vector3.Max(mlobbmax, max);
|
||||
}
|
||||
}
|
||||
mloa.BBMin = mlobbmin;
|
||||
mloa.BBMax = mlobbmax;
|
||||
}
|
||||
}
|
||||
|
||||
public bool DeleteEntity(YmapEntityDef ent)
|
||||
{
|
||||
if (Entities == null)
|
||||
{
|
||||
throw new NullReferenceException("The Entities list returned null in our MloInstanceData. This could be an issue with initialization. The MloInstance probably doesn't exist.");
|
||||
}
|
||||
|
||||
if (ent.Index >= Entities.Length)
|
||||
{
|
||||
throw new ArgumentOutOfRangeException("The index of the entity was greater than the amount of entities that exist in this MloInstance. Likely an issue with initializion.");
|
||||
}
|
||||
|
||||
int index = 0;
|
||||
YmapEntityDef[] newentities = new YmapEntityDef[Entities.Length - 1];
|
||||
YmapEntityDef delentity = Entities[ent.Index];
|
||||
bool del = false;
|
||||
|
||||
for (int i = 0; i < Entities.Length; i++)
|
||||
{
|
||||
if (Entities[i] == delentity)
|
||||
{
|
||||
del = true;
|
||||
continue;
|
||||
}
|
||||
newentities[index] = Entities[i];
|
||||
newentities[index].Index = index;
|
||||
index++;
|
||||
}
|
||||
if (!del)
|
||||
throw new ArgumentException("The entity specified was not found in this MloInstance. It cannot be deleted.");
|
||||
|
||||
if (Owner.Archetype is MloArchetype arch)
|
||||
{
|
||||
if (arch.RemoveEntity(ent))
|
||||
{
|
||||
if (ent.MloEntitySet != null)
|
||||
if (!ent.MloEntitySet.Entities.Remove(ent))
|
||||
return false;
|
||||
// Delete was successful...
|
||||
Entities = newentities;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
throw new InvalidCastException("The owner of this archetype's archetype definition is not an MloArchetype.");
|
||||
}
|
||||
|
||||
public YmapEntityDef CreateYmapEntity(YmapEntityDef owner, MCEntityDef ment, int index)
|
||||
{
|
||||
YmapEntityDef e = new YmapEntityDef(null, index, ref ment._Data);
|
||||
e.Extensions = ment.Extensions;
|
||||
e.MloRefPosition = e.Position;
|
||||
e.MloRefOrientation = e.Orientation;
|
||||
@ -263,9 +560,31 @@ namespace CodeWalker.GameFiles
|
||||
e.Orientation = Quaternion.Multiply(owner.Orientation, e.MloRefOrientation);
|
||||
e.UpdateWidgetPosition();
|
||||
e.UpdateWidgetOrientation();
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
public MCEntityDef TryGetArchetypeEntity(YmapEntityDef ymapEntity)
|
||||
{
|
||||
if (ymapEntity == null) return null;
|
||||
if (Owner?.Archetype == null) return null;
|
||||
if (!(Owner.Archetype is MloArchetype mloa)) return null;
|
||||
if (ymapEntity.Index >= mloa.entities.Length) return null;
|
||||
|
||||
var entity = mloa.entities[ymapEntity.Index];
|
||||
return entity;
|
||||
}
|
||||
|
||||
public YmapEntityDef TryGetYmapEntity(MCEntityDef mcEntity)
|
||||
{
|
||||
if (mcEntity == null) return null;
|
||||
if (Owner?.Archetype == null) return null;
|
||||
if (!(Owner.Archetype is MloArchetype mloa)) return null;
|
||||
|
||||
var index = Array.FindIndex(mloa.entities, x => x == mcEntity);
|
||||
if (index == -1 || index >= Entities.Length) return null;
|
||||
return Entities[index];
|
||||
}
|
||||
|
||||
public void SetPosition(Vector3 pos)
|
||||
{
|
||||
@ -289,17 +608,52 @@ namespace CodeWalker.GameFiles
|
||||
for (int i = 0; i < Entities.Length; i++)
|
||||
{
|
||||
YmapEntityDef e = Entities[i];
|
||||
e.Position = Owner.Position + Owner.Orientation.Multiply(e.MloRefPosition);
|
||||
e.Orientation = Quaternion.Multiply(Owner.Orientation, e.MloRefOrientation);
|
||||
e.UpdateWidgetPosition();
|
||||
e.UpdateWidgetOrientation();
|
||||
UpdateEntity(e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void UpdateEntity(YmapEntityDef e)
|
||||
{
|
||||
e.Position = Owner.Position + Owner.Orientation.Multiply(e.MloRefPosition);
|
||||
e.Orientation = Quaternion.Multiply(Owner.Orientation, e.MloRefOrientation);
|
||||
e.UpdateWidgetPosition();
|
||||
e.UpdateWidgetOrientation();
|
||||
}
|
||||
|
||||
public void AddEntity(YmapEntityDef e)
|
||||
{
|
||||
if (e == null) return;
|
||||
if (Entities == null) Entities = new YmapEntityDef[0];
|
||||
var entities = Entities.ToList();
|
||||
entities.Add(e);
|
||||
Entities = entities.ToArray();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[TypeConverter(typeof(ExpandableObjectConverter))]
|
||||
public class MloInstanceEntitySet
|
||||
{
|
||||
public MloInstanceEntitySet(MCMloEntitySet entSet, MloInstanceData instance)
|
||||
{
|
||||
EntitySet = entSet;
|
||||
Entities = new List<YmapEntityDef>();
|
||||
Instance = instance;
|
||||
}
|
||||
|
||||
public MCMloEntitySet EntitySet { get; set; }
|
||||
public List<YmapEntityDef> Entities { get; set; }
|
||||
public MloInstanceData Instance { get; set; }
|
||||
|
||||
public uint[] Locations
|
||||
{
|
||||
get { return EntitySet?.Locations; }
|
||||
set { if (EntitySet != null) EntitySet.Locations = value; }
|
||||
}
|
||||
|
||||
public bool Visible { get; set; }
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -2428,7 +2428,9 @@ namespace CodeWalker.GameFiles
|
||||
public Vector3 BBMax { get { return (_Data.bbMax); } }
|
||||
public Vector3 BBMin_CW { get; set; }
|
||||
public Vector3 BBMax_CW { get; set; }
|
||||
|
||||
|
||||
public MloArchetype Archetype { get; set; }
|
||||
public int Index { get; set; }
|
||||
|
||||
public MCMloRoomDef() { }
|
||||
public MCMloRoomDef(Meta meta, CMloRoomDef data)
|
||||
@ -2610,7 +2612,7 @@ namespace CodeWalker.GameFiles
|
||||
Entities = new MCEntityDef[ents.Length];
|
||||
for (int i = 0; i < ents.Length; i++)
|
||||
{
|
||||
Entities[i] = new MCEntityDef(meta, ents[i]);
|
||||
Entities[i] = new MCEntityDef(meta, ref ents[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2750,23 +2752,26 @@ namespace CodeWalker.GameFiles
|
||||
[TC(typeof(EXP))] public class MCEntityDef : MetaWrapper
|
||||
{
|
||||
public CEntityDef _Data;
|
||||
public CEntityDef Data { get { return _Data; } }
|
||||
public CEntityDef Data { get { return _Data; } set { _Data = value; } }
|
||||
public MetaWrapper[] Extensions { get; set; }
|
||||
|
||||
|
||||
public MCEntityDef() { }
|
||||
public MloArchetype Archetype { get; set; } // for browsing/reference purposes
|
||||
|
||||
public MCEntityDef(MCEntityDef copy)
|
||||
{
|
||||
if (copy != null)
|
||||
{
|
||||
_Data = copy.Data;
|
||||
}
|
||||
if (copy != null) _Data = copy.Data;
|
||||
}
|
||||
public MCEntityDef(Meta meta, CEntityDef d)
|
||||
public MCEntityDef(Meta meta, ref CEntityDef d)
|
||||
{
|
||||
_Data = d;
|
||||
Extensions = MetaTypes.GetExtensions(meta, _Data.extensions);
|
||||
}
|
||||
public MCEntityDef(ref CEntityDef d, MloArchetype arch)
|
||||
{
|
||||
_Data = d;
|
||||
Archetype = arch;
|
||||
}
|
||||
|
||||
public override void Load(Meta meta, MetaPOINTER ptr)
|
||||
{
|
||||
|
@ -24,6 +24,11 @@ namespace CodeWalker
|
||||
{
|
||||
return new Vector4((float)Math.Floor(v.X), (float)Math.Floor(v.Y), (float)Math.Floor(v.Z), (float)Math.Floor(v.W));
|
||||
}
|
||||
|
||||
public static Quaternion ToQuaternion(this Vector4 v)
|
||||
{
|
||||
return new Quaternion(v);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -328,6 +328,12 @@
|
||||
<Compile Include="Project\Panels\EditYmapCarGenPanel.Designer.cs">
|
||||
<DependentUpon>EditYmapCarGenPanel.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Project\Panels\EditYtypArchetypeMloRoomPanel.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Project\Panels\EditYtypArchetypeMloRoomPanel.Designer.cs">
|
||||
<DependentUpon>EditYtypArchetypeMloRoomPanel.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Project\Panels\EditYmapEntityPanel.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
@ -382,6 +388,12 @@
|
||||
<Compile Include="Project\Panels\EditYnvPortalPanel.Designer.cs">
|
||||
<DependentUpon>EditYnvPortalPanel.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Project\Panels\EditYtypArchetypePanel.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Project\Panels\EditYtypArchetypePanel.Designer.cs">
|
||||
<DependentUpon>EditYtypArchetypePanel.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Project\Panels\EditYtypPanel.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
@ -596,6 +608,9 @@
|
||||
<EmbeddedResource Include="Project\Panels\EditYmapCarGenPanel.resx">
|
||||
<DependentUpon>EditYmapCarGenPanel.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Project\Panels\EditYtypArchetypeMloRoomPanel.resx">
|
||||
<DependentUpon>EditYtypArchetypeMloRoomPanel.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Project\Panels\EditYmapEntityPanel.resx">
|
||||
<DependentUpon>EditYmapEntityPanel.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
@ -623,6 +638,9 @@
|
||||
<EmbeddedResource Include="Project\Panels\EditYnvPortalPanel.resx">
|
||||
<DependentUpon>EditYnvPortalPanel.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Project\Panels\EditYtypArchetypePanel.resx">
|
||||
<DependentUpon>EditYtypArchetypePanel.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Project\Panels\EditYtypPanel.resx">
|
||||
<DependentUpon>EditYtypPanel.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
|
20
Project/Panels/EditYmapEntityPanel.Designer.cs
generated
20
Project/Panels/EditYmapEntityPanel.Designer.cs
generated
@ -71,6 +71,7 @@
|
||||
this.EntityNumChildrenTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label25 = new System.Windows.Forms.Label();
|
||||
this.EntityExtensionsTabPage = new System.Windows.Forms.TabPage();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.EntityPivotTabPage = new System.Windows.Forms.TabPage();
|
||||
this.label95 = new System.Windows.Forms.Label();
|
||||
this.EntityPivotEditCheckBox = new System.Windows.Forms.CheckBox();
|
||||
@ -79,7 +80,6 @@
|
||||
this.EntityPivotRotationNormalizeButton = new System.Windows.Forms.Button();
|
||||
this.label94 = new System.Windows.Forms.Label();
|
||||
this.EntityPivotRotationTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.EntityTabControl.SuspendLayout();
|
||||
this.EntityGeneralTabPage.SuspendLayout();
|
||||
this.EntityLodTabPage.SuspendLayout();
|
||||
@ -575,6 +575,15 @@
|
||||
this.EntityExtensionsTabPage.Text = "Extensions";
|
||||
this.EntityExtensionsTabPage.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(27, 27);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(157, 13);
|
||||
this.label1.TabIndex = 0;
|
||||
this.label1.Text = "Entity extensions editing TODO!";
|
||||
//
|
||||
// EntityPivotTabPage
|
||||
//
|
||||
this.EntityPivotTabPage.Controls.Add(this.label95);
|
||||
@ -660,15 +669,6 @@
|
||||
this.EntityPivotRotationTextBox.TabIndex = 25;
|
||||
this.EntityPivotRotationTextBox.TextChanged += new System.EventHandler(this.EntityPivotRotationTextBox_TextChanged);
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(27, 27);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(157, 13);
|
||||
this.label1.TabIndex = 0;
|
||||
this.label1.Text = "Entity extensions editing TODO!";
|
||||
//
|
||||
// EditYmapEntityPanel
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
|
@ -1,13 +1,6 @@
|
||||
using CodeWalker.GameFiles;
|
||||
using SharpDX;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace CodeWalker.Project.Panels
|
||||
@ -16,6 +9,7 @@ namespace CodeWalker.Project.Panels
|
||||
{
|
||||
public ProjectForm ProjectForm;
|
||||
public YmapEntityDef CurrentEntity { get; set; }
|
||||
public MCEntityDef CurrentMCEntity { get; set; }
|
||||
|
||||
private bool populatingui = false;
|
||||
|
||||
@ -29,6 +23,8 @@ namespace CodeWalker.Project.Panels
|
||||
public void SetEntity(YmapEntityDef entity)
|
||||
{
|
||||
CurrentEntity = entity;
|
||||
MloInstanceData instance = entity?.MloParent?.MloInstance;
|
||||
CurrentMCEntity = instance?.TryGetArchetypeEntity(entity);
|
||||
Tag = entity;
|
||||
LoadEntity();
|
||||
UpdateFormTitle();
|
||||
@ -94,10 +90,10 @@ namespace CodeWalker.Project.Panels
|
||||
else
|
||||
{
|
||||
populatingui = true;
|
||||
var e = CurrentEntity.CEntityDef;
|
||||
var e = CurrentEntity._CEntityDef;
|
||||
var po = CurrentEntity.PivotOrientation;
|
||||
//EntityPanel.Enabled = true;
|
||||
EntityAddToProjectButton.Enabled = !ProjectForm.YmapExistsInProject(CurrentEntity.Ymap);
|
||||
EntityAddToProjectButton.Enabled = CurrentEntity.Ymap != null ? !ProjectForm.YmapExistsInProject(CurrentEntity.Ymap) : !ProjectForm.YtypExistsInProject(CurrentEntity.MloParent?.Archetype?.Ytyp);
|
||||
EntityDeleteButton.Enabled = !EntityAddToProjectButton.Enabled;
|
||||
EntityArchetypeTextBox.Text = e.archetypeName.ToString();
|
||||
EntityArchetypeHashLabel.Text = "Hash: " + e.archetypeName.Hash.ToString();
|
||||
@ -176,21 +172,53 @@ namespace CodeWalker.Project.Panels
|
||||
{
|
||||
tn.Text = name;
|
||||
}
|
||||
else
|
||||
{
|
||||
tn = ProjectForm.ProjectExplorer?.FindMloEntityTreeNode(CurrentMCEntity);
|
||||
if (tn != null)
|
||||
{
|
||||
tn.Text = name;
|
||||
}
|
||||
}
|
||||
|
||||
if (CurrentEntity != null)
|
||||
{
|
||||
lock (ProjectForm.ProjectSyncRoot)
|
||||
{
|
||||
CurrentEntity._CEntityDef.archetypeName = new MetaHash(hash);
|
||||
|
||||
if (CurrentMCEntity != null)
|
||||
{
|
||||
CurrentMCEntity._Data.archetypeName = new MetaHash(hash);
|
||||
}
|
||||
|
||||
if (CurrentEntity.Archetype != arch)
|
||||
{
|
||||
CurrentEntity.SetArchetype(arch);
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
|
||||
if (CurrentEntity.IsMlo)
|
||||
{
|
||||
CurrentEntity.MloInstance.InitYmapEntityArchetypes(ProjectForm.GameFileCache);
|
||||
}
|
||||
|
||||
ProjectItemChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ProjectItemChanged()
|
||||
{
|
||||
if (CurrentEntity.Ymap != null)
|
||||
{
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
}
|
||||
else if (CurrentEntity.MloParent?.Archetype?.Ytyp != null)
|
||||
{
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void EntityFlagsTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (populatingui) return;
|
||||
@ -209,7 +237,9 @@ namespace CodeWalker.Project.Panels
|
||||
if (CurrentEntity._CEntityDef.flags != flags)
|
||||
{
|
||||
CurrentEntity._CEntityDef.flags = flags;
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
if (CurrentMCEntity != null)
|
||||
CurrentMCEntity._Data.flags = flags;
|
||||
ProjectItemChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -244,7 +274,9 @@ namespace CodeWalker.Project.Panels
|
||||
if (CurrentEntity._CEntityDef.flags != flags)
|
||||
{
|
||||
CurrentEntity._CEntityDef.flags = flags;
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
if (CurrentMCEntity != null)
|
||||
CurrentMCEntity._Data.flags = flags;
|
||||
ProjectItemChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -260,7 +292,9 @@ namespace CodeWalker.Project.Panels
|
||||
if (CurrentEntity._CEntityDef.guid != guid)
|
||||
{
|
||||
CurrentEntity._CEntityDef.guid = guid;
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
if (CurrentMCEntity != null)
|
||||
CurrentMCEntity._Data.guid = guid;
|
||||
ProjectItemChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -274,14 +308,16 @@ namespace CodeWalker.Project.Panels
|
||||
{
|
||||
if (CurrentEntity.MloParent != null)
|
||||
{
|
||||
//TODO: positioning for interior entities!
|
||||
v = CurrentEntity.MloParent.Position + CurrentEntity.MloParent.Orientation.Multiply(v);
|
||||
CurrentEntity.SetPosition(v);
|
||||
ProjectItemChanged();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (CurrentEntity.Position != v)
|
||||
{
|
||||
CurrentEntity.SetPosition(v);
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
ProjectItemChanged();
|
||||
var wf = ProjectForm.WorldForm;
|
||||
if (wf != null)
|
||||
{
|
||||
@ -304,17 +340,24 @@ namespace CodeWalker.Project.Panels
|
||||
{
|
||||
if (CurrentEntity._CEntityDef.rotation != v)
|
||||
{
|
||||
Quaternion q = new Quaternion(v);
|
||||
CurrentEntity.SetOrientationInv(q);
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
Quaternion q = v.ToQuaternion();
|
||||
var wf = ProjectForm.WorldForm;
|
||||
if (wf != null)
|
||||
|
||||
if (CurrentEntity.MloParent != null)
|
||||
{
|
||||
wf.BeginInvoke(new Action(() =>
|
||||
{
|
||||
wf.SetWidgetRotation(CurrentEntity.WidgetOrientation, true);
|
||||
}));
|
||||
var world = Quaternion.Normalize(Quaternion.Multiply(q, CurrentEntity.MloParent.Orientation));
|
||||
CurrentEntity.SetOrientation(world);
|
||||
}
|
||||
else
|
||||
{
|
||||
CurrentEntity.SetOrientation(q, true);
|
||||
}
|
||||
|
||||
ProjectItemChanged();
|
||||
wf?.BeginInvoke(new Action(() =>
|
||||
{
|
||||
wf.SetWidgetRotation(CurrentEntity.WidgetOrientation, true);
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -331,7 +374,7 @@ namespace CodeWalker.Project.Panels
|
||||
{
|
||||
Vector3 newscale = new Vector3(sxy, sxy, CurrentEntity.Scale.Z);
|
||||
CurrentEntity.SetScale(newscale);
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
ProjectItemChanged();
|
||||
var wf = ProjectForm.WorldForm;
|
||||
if (wf != null)
|
||||
{
|
||||
@ -356,7 +399,7 @@ namespace CodeWalker.Project.Panels
|
||||
{
|
||||
Vector3 newscale = new Vector3(CurrentEntity.Scale.X, CurrentEntity.Scale.Y, sz);
|
||||
CurrentEntity.SetScale(newscale);
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
ProjectItemChanged();
|
||||
var wf = ProjectForm.WorldForm;
|
||||
if (wf != null)
|
||||
{
|
||||
@ -380,7 +423,9 @@ namespace CodeWalker.Project.Panels
|
||||
if (CurrentEntity._CEntityDef.parentIndex != pind)
|
||||
{
|
||||
CurrentEntity._CEntityDef.parentIndex = pind; //Needs more work for LOD linking!
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
if (CurrentMCEntity != null)
|
||||
CurrentMCEntity._Data.parentIndex = pind;
|
||||
ProjectItemChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -396,7 +441,9 @@ namespace CodeWalker.Project.Panels
|
||||
if (CurrentEntity._CEntityDef.lodDist != lodDist)
|
||||
{
|
||||
CurrentEntity._CEntityDef.lodDist = lodDist;
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
if (CurrentMCEntity != null)
|
||||
CurrentMCEntity._Data.lodDist = lodDist;
|
||||
ProjectItemChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -412,7 +459,9 @@ namespace CodeWalker.Project.Panels
|
||||
if (CurrentEntity._CEntityDef.childLodDist != childLodDist)
|
||||
{
|
||||
CurrentEntity._CEntityDef.childLodDist = childLodDist;
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
if (CurrentMCEntity != null)
|
||||
CurrentMCEntity._Data.childLodDist = childLodDist;
|
||||
ProjectItemChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -427,7 +476,9 @@ namespace CodeWalker.Project.Panels
|
||||
if (CurrentEntity._CEntityDef.lodLevel != lodLevel)
|
||||
{
|
||||
CurrentEntity._CEntityDef.lodLevel = lodLevel;
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
if (CurrentMCEntity != null)
|
||||
CurrentMCEntity._Data.lodLevel = lodLevel;
|
||||
ProjectItemChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -443,7 +494,9 @@ namespace CodeWalker.Project.Panels
|
||||
if (CurrentEntity._CEntityDef.numChildren != numChildren)
|
||||
{
|
||||
CurrentEntity._CEntityDef.numChildren = numChildren;
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
if (CurrentMCEntity != null)
|
||||
CurrentMCEntity._Data.numChildren = numChildren;
|
||||
ProjectItemChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -458,7 +511,9 @@ namespace CodeWalker.Project.Panels
|
||||
if (CurrentEntity._CEntityDef.priorityLevel != priorityLevel)
|
||||
{
|
||||
CurrentEntity._CEntityDef.priorityLevel = priorityLevel;
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
if (CurrentMCEntity != null)
|
||||
CurrentMCEntity._Data.priorityLevel = priorityLevel;
|
||||
ProjectItemChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -474,7 +529,9 @@ namespace CodeWalker.Project.Panels
|
||||
if (CurrentEntity._CEntityDef.ambientOcclusionMultiplier != aomult)
|
||||
{
|
||||
CurrentEntity._CEntityDef.ambientOcclusionMultiplier = aomult;
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
if (CurrentMCEntity != null)
|
||||
CurrentMCEntity._Data.ambientOcclusionMultiplier = aomult;
|
||||
ProjectItemChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -490,7 +547,9 @@ namespace CodeWalker.Project.Panels
|
||||
if (CurrentEntity._CEntityDef.artificialAmbientOcclusion != artao)
|
||||
{
|
||||
CurrentEntity._CEntityDef.artificialAmbientOcclusion = artao;
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
if (CurrentMCEntity != null)
|
||||
CurrentMCEntity._Data.artificialAmbientOcclusion = artao;
|
||||
ProjectItemChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -506,7 +565,9 @@ namespace CodeWalker.Project.Panels
|
||||
if (CurrentEntity._CEntityDef.tintValue != tintValue)
|
||||
{
|
||||
CurrentEntity._CEntityDef.tintValue = tintValue;
|
||||
ProjectForm.SetYmapHasChanged(true);
|
||||
if (CurrentMCEntity != null)
|
||||
CurrentMCEntity._Data.tintValue = tintValue;
|
||||
ProjectItemChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -515,7 +576,7 @@ namespace CodeWalker.Project.Panels
|
||||
{
|
||||
if (CurrentEntity == null) return;
|
||||
if (ProjectForm.WorldForm == null) return;
|
||||
ProjectForm.WorldForm.GoToPosition(CurrentEntity.Position);
|
||||
ProjectForm.WorldForm.GoToPosition(CurrentEntity.Position, Vector3.One * CurrentEntity.BSRadius);
|
||||
}
|
||||
|
||||
private void EntityNormalizeRotationButton_Click(object sender, EventArgs e)
|
||||
|
@ -42,6 +42,7 @@ namespace CodeWalker.Project.Panels
|
||||
Tag = batch;
|
||||
UpdateFormTitle();
|
||||
UpdateControls();
|
||||
ProjectForm.WorldForm?.SelectGrassBatch(batch);
|
||||
}
|
||||
|
||||
private void UpdateControls()
|
||||
@ -197,6 +198,13 @@ namespace CodeWalker.Project.Panels
|
||||
private void OptimizeBatchButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (CurrentBatch.Instances == null || CurrentBatch.Instances.Length <= 0) return;
|
||||
var d = MessageBox.Show(
|
||||
@"You are about to split the selected batch into multiple parts. Are you sure you want to do this?",
|
||||
@"Instance Optimizer", MessageBoxButtons.YesNo);
|
||||
|
||||
if (d == DialogResult.No)
|
||||
return;
|
||||
|
||||
lock (ProjectForm.WorldForm.RenderSyncRoot)
|
||||
{
|
||||
var newBatches = CurrentBatch?.OptimizeInstances(CurrentBatch, (float)OptmizationThresholdNumericUpDown.Value);
|
||||
|
173
Project/Panels/EditYtypArchetypeMloRoomPanel.Designer.cs
generated
Normal file
173
Project/Panels/EditYtypArchetypeMloRoomPanel.Designer.cs
generated
Normal file
@ -0,0 +1,173 @@
|
||||
namespace CodeWalker.Project.Panels
|
||||
{
|
||||
partial class EditYtypArchetypeMloRoomPanel
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditYtypArchetypeMloRoomPanel));
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.MinBoundsTextBox = new CodeWalker.WinForms.TextBoxFix();
|
||||
this.MaxBoundsTextBox = new CodeWalker.WinForms.TextBoxFix();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.RoomNameTextBox = new CodeWalker.WinForms.TextBoxFix();
|
||||
this.RoomFlagsCheckedListBox = new System.Windows.Forms.CheckedListBox();
|
||||
this.RoomFlagsTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label14 = new System.Windows.Forms.Label();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(33, 69);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(27, 13);
|
||||
this.label1.TabIndex = 0;
|
||||
this.label1.Text = "Min:";
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(30, 95);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(30, 13);
|
||||
this.label2.TabIndex = 1;
|
||||
this.label2.Text = "Max:";
|
||||
//
|
||||
// MinBoundsTextBox
|
||||
//
|
||||
this.MinBoundsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.MinBoundsTextBox.Location = new System.Drawing.Point(66, 66);
|
||||
this.MinBoundsTextBox.Name = "MinBoundsTextBox";
|
||||
this.MinBoundsTextBox.Size = new System.Drawing.Size(275, 20);
|
||||
this.MinBoundsTextBox.TabIndex = 2;
|
||||
this.MinBoundsTextBox.TextChanged += new System.EventHandler(this.MinBoundsTextBox_TextChanged);
|
||||
//
|
||||
// MaxBoundsTextBox
|
||||
//
|
||||
this.MaxBoundsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.MaxBoundsTextBox.Location = new System.Drawing.Point(66, 92);
|
||||
this.MaxBoundsTextBox.Name = "MaxBoundsTextBox";
|
||||
this.MaxBoundsTextBox.Size = new System.Drawing.Size(275, 20);
|
||||
this.MaxBoundsTextBox.TabIndex = 3;
|
||||
this.MaxBoundsTextBox.TextChanged += new System.EventHandler(this.MaxBoundsTextBox_TextChanged);
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Location = new System.Drawing.Point(19, 43);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(41, 13);
|
||||
this.label3.TabIndex = 4;
|
||||
this.label3.Text = "Name: ";
|
||||
//
|
||||
// RoomNameTextBox
|
||||
//
|
||||
this.RoomNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.RoomNameTextBox.Location = new System.Drawing.Point(66, 40);
|
||||
this.RoomNameTextBox.Name = "RoomNameTextBox";
|
||||
this.RoomNameTextBox.Size = new System.Drawing.Size(275, 20);
|
||||
this.RoomNameTextBox.TabIndex = 5;
|
||||
this.RoomNameTextBox.TextChanged += new System.EventHandler(this.RoomNameTextBox_TextChanged);
|
||||
//
|
||||
// RoomFlagsCheckedListBox
|
||||
//
|
||||
this.RoomFlagsCheckedListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.RoomFlagsCheckedListBox.CheckOnClick = true;
|
||||
this.RoomFlagsCheckedListBox.FormattingEnabled = true;
|
||||
this.RoomFlagsCheckedListBox.Items.AddRange(new object[] {
|
||||
"1 - Unk01",
|
||||
"2 - Unk02",
|
||||
"4 - Unk03",
|
||||
"8 - Unk04",
|
||||
"16 - Unk05",
|
||||
"32 - Unk06",
|
||||
"64 - Unk07"});
|
||||
this.RoomFlagsCheckedListBox.Location = new System.Drawing.Point(352, 62);
|
||||
this.RoomFlagsCheckedListBox.Name = "RoomFlagsCheckedListBox";
|
||||
this.RoomFlagsCheckedListBox.Size = new System.Drawing.Size(201, 244);
|
||||
this.RoomFlagsCheckedListBox.TabIndex = 35;
|
||||
this.RoomFlagsCheckedListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.RoomFlagsCheckedListBox_ItemCheck);
|
||||
//
|
||||
// RoomFlagsTextBox
|
||||
//
|
||||
this.RoomFlagsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.RoomFlagsTextBox.Location = new System.Drawing.Point(406, 36);
|
||||
this.RoomFlagsTextBox.Name = "RoomFlagsTextBox";
|
||||
this.RoomFlagsTextBox.Size = new System.Drawing.Size(147, 20);
|
||||
this.RoomFlagsTextBox.TabIndex = 34;
|
||||
this.RoomFlagsTextBox.TextChanged += new System.EventHandler(this.RoomFlagsTextBox_TextChanged);
|
||||
//
|
||||
// label14
|
||||
//
|
||||
this.label14.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label14.AutoSize = true;
|
||||
this.label14.Location = new System.Drawing.Point(365, 39);
|
||||
this.label14.Name = "label14";
|
||||
this.label14.Size = new System.Drawing.Size(35, 13);
|
||||
this.label14.TabIndex = 33;
|
||||
this.label14.Text = "Flags:";
|
||||
//
|
||||
// EditYtypArchetypeMloRoomPanel
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(565, 505);
|
||||
this.Controls.Add(this.RoomFlagsCheckedListBox);
|
||||
this.Controls.Add(this.RoomFlagsTextBox);
|
||||
this.Controls.Add(this.label14);
|
||||
this.Controls.Add(this.RoomNameTextBox);
|
||||
this.Controls.Add(this.label3);
|
||||
this.Controls.Add(this.MaxBoundsTextBox);
|
||||
this.Controls.Add(this.MinBoundsTextBox);
|
||||
this.Controls.Add(this.label2);
|
||||
this.Controls.Add(this.label1);
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.Name = "EditYtypArchetypeMloRoomPanel";
|
||||
this.Text = "Room";
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private WinForms.TextBoxFix MinBoundsTextBox;
|
||||
private WinForms.TextBoxFix MaxBoundsTextBox;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private WinForms.TextBoxFix RoomNameTextBox;
|
||||
private System.Windows.Forms.CheckedListBox RoomFlagsCheckedListBox;
|
||||
private System.Windows.Forms.TextBox RoomFlagsTextBox;
|
||||
private System.Windows.Forms.Label label14;
|
||||
}
|
||||
}
|
137
Project/Panels/EditYtypArchetypeMloRoomPanel.cs
Normal file
137
Project/Panels/EditYtypArchetypeMloRoomPanel.cs
Normal file
@ -0,0 +1,137 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using CodeWalker.GameFiles;
|
||||
using SharpDX;
|
||||
|
||||
namespace CodeWalker.Project.Panels
|
||||
{
|
||||
public partial class EditYtypArchetypeMloRoomPanel : ProjectPanel
|
||||
{
|
||||
public ProjectForm ProjectForm;
|
||||
public MCMloRoomDef CurrentRoom { get; set; }
|
||||
|
||||
public EditYtypArchetypeMloRoomPanel(ProjectForm owner)
|
||||
{
|
||||
ProjectForm = owner;
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public void SetRoom(MCMloRoomDef room)
|
||||
{
|
||||
CurrentRoom = room;
|
||||
Tag = room;
|
||||
UpdateFormTitle();
|
||||
MloInstanceData instance = ProjectForm.TryGetMloInstance(room?.Archetype);
|
||||
ProjectForm.WorldForm?.SelectMloRoom(room, instance);
|
||||
UpdateControls();
|
||||
}
|
||||
|
||||
private void UpdateControls()
|
||||
{
|
||||
if (CurrentRoom != null)
|
||||
{
|
||||
RoomNameTextBox.Text = CurrentRoom.RoomName;
|
||||
MinBoundsTextBox.Text = FloatUtil.GetVector3String(CurrentRoom.BBMin);
|
||||
MaxBoundsTextBox.Text = FloatUtil.GetVector3String(CurrentRoom.BBMax);
|
||||
RoomFlagsTextBox.Text = CurrentRoom._Data.flags.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateFormTitle()
|
||||
{
|
||||
Text = CurrentRoom?.RoomName ?? "Room";
|
||||
}
|
||||
|
||||
private void RoomNameTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (CurrentRoom == null) return;
|
||||
|
||||
if (CurrentRoom.RoomName != RoomNameTextBox.Text)
|
||||
{
|
||||
CurrentRoom.RoomName = RoomNameTextBox.Text;
|
||||
|
||||
TreeNode tn = ProjectForm.ProjectExplorer?.FindMloRoomTreeNode(CurrentRoom);
|
||||
if (tn != null)
|
||||
{
|
||||
tn.Text = CurrentRoom.RoomName;
|
||||
}
|
||||
|
||||
UpdateFormTitle();
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void MinBoundsTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (CurrentRoom == null) return;
|
||||
Vector3 bb = FloatUtil.ParseVector3String(MinBoundsTextBox.Text);
|
||||
if (CurrentRoom._Data.bbMin != bb)
|
||||
{
|
||||
CurrentRoom._Data.bbMin = bb;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void MaxBoundsTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (CurrentRoom == null) return;
|
||||
Vector3 bb = FloatUtil.ParseVector3String(MaxBoundsTextBox.Text);
|
||||
if (CurrentRoom._Data.bbMax != bb)
|
||||
{
|
||||
CurrentRoom._Data.bbMax = bb;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void RoomFlagsTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (CurrentRoom == null) return;
|
||||
uint.TryParse(RoomFlagsTextBox.Text, out uint flags);
|
||||
for (int i = 0; i < RoomFlagsCheckedListBox.Items.Count; i++)
|
||||
{
|
||||
var c = ((flags & (1u << i)) > 0);
|
||||
RoomFlagsCheckedListBox.SetItemCheckState(i, c ? CheckState.Checked : CheckState.Unchecked);
|
||||
}
|
||||
lock (ProjectForm.ProjectSyncRoot)
|
||||
{
|
||||
if (CurrentRoom._Data.flags != flags)
|
||||
{
|
||||
CurrentRoom._Data.flags = flags;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void RoomFlagsCheckedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
|
||||
{
|
||||
if (CurrentRoom == null) return;
|
||||
uint flags = 0;
|
||||
for (int i = 0; i < RoomFlagsCheckedListBox.Items.Count; i++)
|
||||
{
|
||||
if (e.Index == i)
|
||||
{
|
||||
if (e.NewValue == CheckState.Checked)
|
||||
{
|
||||
flags += (uint)(1 << i);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (RoomFlagsCheckedListBox.GetItemChecked(i))
|
||||
{
|
||||
flags += (uint)(1 << i);
|
||||
}
|
||||
}
|
||||
}
|
||||
RoomFlagsTextBox.Text = flags.ToString();
|
||||
lock (ProjectForm.ProjectSyncRoot)
|
||||
{
|
||||
if (CurrentRoom._Data.flags != flags)
|
||||
{
|
||||
CurrentRoom._Data.flags = flags;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
409
Project/Panels/EditYtypArchetypeMloRoomPanel.resx
Normal file
409
Project/Panels/EditYtypArchetypeMloRoomPanel.resx
Normal file
@ -0,0 +1,409 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
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
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///+vv/fL1/v///wAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///4+Vx7/F5v///wAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAP///4CHtrS62////////////////////wAAAAAAAAAAAP////H0/vf6/v//
|
||||
/////////4yTwrrB4f///+zw+7rA6P39/////wAAAAAAAAAAAP///56l2BkcguXr/P///////42Uw8jO
|
||||
6P///ysvjWVqtP///////wAAAAAAAAAAAP////D0/0hPpsDG6////////6y02d7k8////3qAx+/z/f//
|
||||
/wAAAAAAAAAAAAAAAAAAAP///////////////8zT8V5ns1Rcrdzh9f///////////wAAAAAAAAAAAAAA
|
||||
AAAAAP////////7+/6ix3nmBxFthtmdwu09WqbC54/v9//r8//j6//39/wAAAAAAAAAAAOjt/H6I0FJc
|
||||
skpSqHF+wRMahFZhs4iT1AsNc1pgrm52v2RsuO/z/gAAAP////////L2/cLJ7rrD64+V4DY+ozU+mYmU
|
||||
0X2Hy1hfss7V8urv/PP2/v///wAAAP///+Pp+d/k9////////+Pp/4uR3ysymW14xYOM0fD0/P///+Xq
|
||||
+ri/6Pj6/wAAAOrv/j5DnbS75P////////////X4/+/0/ubr+/r7/////////9rh+hgZhKGo2QAAAPDz
|
||||
/eLn+f////j6/2Nqttrg9////+Hn+P3+//3+/1hescLJ6/////L2/eru/AAAAAAAAAAAAP///8rR70tR
|
||||
p/3+//v8/zY6jNPY7////09WqWpwu////wAAAAAAAAAAAAAAAAAAAAAAAPb4/vr7//////v8/5Wd1eHm
|
||||
+P////v8//T3/wAAAAAAAAAAAAAAAP//AAD8PwAA/D8AAPwDAACAAwAAgAMAAIAHAADABwAAwAEAAMAB
|
||||
AAAAAQAAAAEAAAABAAAAAQAAwAcAAOAPAAAoAAAAQAAAAIAAAAABABgAAAAAAAAwAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7//f7//P3//P3//P3/
|
||||
/f7//v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7//P3/
|
||||
+fv/+fv/+Pr/+fv/+vv//P3//v//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAA/f7/+fr/8/b/7PL/5+3/6e/+9Pf/+vv//v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAA/P3/9/r/6O7/cXe1UVaet7z17fL/+Pr//f3/AAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+/z/9Pj/4Oj/NzyCUlOd2dz/6O//9Pf//P3/AAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vv/8vb/2+P9X2OmREGLnqPd
|
||||
4+v/8vb/+/z/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vv/8fb/
|
||||
1N35bXK1JSRtbHGz5O7/8fX/+/z/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAA+vv/8PX/3Ob/U1eaDwtXjZLT4+z/8fX/+/z/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAA+vv/8fb/2eP+MjR6AAA+c3i34Or/8fX/+/z/AAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vv/8vb/1d/7MS91AAA1UFSS4On/8vb/+/z/AAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vv/8fb/2OL+NjZ7AAArX2Ok
|
||||
4uz/8fX/+/z/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+vv/8fb/
|
||||
2eP/LjJ1DAxKfYTE4Or/8fX/+/z/AAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7//v7//f7//f7//v7//v//
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
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
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7//P3/+fv/+fv/+vv/+Pr/+vv/
|
||||
/P3//v7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v7//f7/
|
||||
/f3//P3//f7//v7//v//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////
|
||||
///////4D/////////AH////////8Af////////wB/////////AH////////8Af////////wB///////
|
||||
//AH////////8Af////////wB/////////AH////////8AfwP//////wB8Af//+Af/AHgB///wA/8AcA
|
||||
H///AB/wBgAf//8AD/AGAB///wAH8AYAH///AAPwBAAf//8AA/AEAD///wAD8AQAP///AAPwBAB///+A
|
||||
A/AEAP///8AD4AAA////4AcAAAH////wDgAAAf/////8AAAH//////gAAAf/////4AAAAf/////gAAAA
|
||||
/f//+AAAAAAAD//AAAAAAAAH/4AAAAAAAAf/gAAAAAAAB/+AAAAAAAAH/4AAAAAAAAf/gAAAAAAAB/+A
|
||||
AAAAAAAP/4AAAAAAAB//wAAAAABAf/4HwAAAAYAf8APAAAADgA/gA+AAAAMAA8AD8AAABwADgAP8AAAf
|
||||
AAOAA/4AAB8AA4ADAAAAAQADgAIAcA4AgAOABgBwDgBAA4AMAGAMADADwDwAYAwAOAfg+ABgBAAeH//4
|
||||
AEAEAB////gAwAYAH///+ADABgAf///4AcAGAB////gBwAcAH///+APAB4A////8B+AHwH//////4A//
|
||||
///////gD/////////Af//////////////8=
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
632
Project/Panels/EditYtypArchetypePanel.Designer.cs
generated
Normal file
632
Project/Panels/EditYtypArchetypePanel.Designer.cs
generated
Normal file
@ -0,0 +1,632 @@
|
||||
namespace CodeWalker.Project.Panels
|
||||
{
|
||||
partial class EditYtypArchetypePanel
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditYtypArchetypePanel));
|
||||
this.BaseArchetypeTabPage = new System.Windows.Forms.TabPage();
|
||||
this.ArchetypeDeleteButton = new System.Windows.Forms.Button();
|
||||
this.label13 = new System.Windows.Forms.Label();
|
||||
this.BSRadiusTextBox = new System.Windows.Forms.TextBox();
|
||||
this.BSCenterTextBox = new System.Windows.Forms.TextBox();
|
||||
this.BBMaxTextBox = new System.Windows.Forms.TextBox();
|
||||
this.BBMinTextBox = new System.Windows.Forms.TextBox();
|
||||
this.ArchetypeNameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.ArchetypeFlagsTextBox = new System.Windows.Forms.TextBox();
|
||||
this.PhysicsDictionaryTextBox = new System.Windows.Forms.TextBox();
|
||||
this.ClipDictionaryTextBox = new System.Windows.Forms.TextBox();
|
||||
this.AssetNameTextBox = new System.Windows.Forms.TextBox();
|
||||
this.TextureDictTextBox = new System.Windows.Forms.TextBox();
|
||||
this.label12 = new System.Windows.Forms.Label();
|
||||
this.label11 = new System.Windows.Forms.Label();
|
||||
this.label5 = new System.Windows.Forms.Label();
|
||||
this.PhysicsDictHashLabel = new System.Windows.Forms.Label();
|
||||
this.TextureDictHashLabel = new System.Windows.Forms.Label();
|
||||
this.EntityFlagsCheckedListBox = new System.Windows.Forms.CheckedListBox();
|
||||
this.label14 = new System.Windows.Forms.Label();
|
||||
this.SpecialAttributeNumericUpDown = new System.Windows.Forms.NumericUpDown();
|
||||
this.label10 = new System.Windows.Forms.Label();
|
||||
this.label9 = new System.Windows.Forms.Label();
|
||||
this.AssetTypeComboBox = new System.Windows.Forms.ComboBox();
|
||||
this.label8 = new System.Windows.Forms.Label();
|
||||
this.label7 = new System.Windows.Forms.Label();
|
||||
this.label6 = new System.Windows.Forms.Label();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
this.HDTextureDistNumericUpDown = new System.Windows.Forms.NumericUpDown();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.LodDistNumericUpDown = new System.Windows.Forms.NumericUpDown();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.TabControl = new System.Windows.Forms.TabControl();
|
||||
this.MloArchetypeTabPage = new System.Windows.Forms.TabPage();
|
||||
this.EntitySetsListBox = new System.Windows.Forms.CheckedListBox();
|
||||
this.label15 = new System.Windows.Forms.Label();
|
||||
this.BaseArchetypeTabPage.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.SpecialAttributeNumericUpDown)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.HDTextureDistNumericUpDown)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.LodDistNumericUpDown)).BeginInit();
|
||||
this.TabControl.SuspendLayout();
|
||||
this.MloArchetypeTabPage.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// BaseArchetypeTabPage
|
||||
//
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.ArchetypeDeleteButton);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label13);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.BSRadiusTextBox);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.BSCenterTextBox);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.BBMaxTextBox);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.BBMinTextBox);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.ArchetypeNameTextBox);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.ArchetypeFlagsTextBox);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.PhysicsDictionaryTextBox);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.ClipDictionaryTextBox);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.AssetNameTextBox);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.TextureDictTextBox);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label12);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label11);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label5);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.PhysicsDictHashLabel);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.TextureDictHashLabel);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.EntityFlagsCheckedListBox);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label14);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.SpecialAttributeNumericUpDown);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label10);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label9);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.AssetTypeComboBox);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label8);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label7);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label6);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label4);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.HDTextureDistNumericUpDown);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label3);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.LodDistNumericUpDown);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label2);
|
||||
this.BaseArchetypeTabPage.Controls.Add(this.label1);
|
||||
this.BaseArchetypeTabPage.Location = new System.Drawing.Point(4, 22);
|
||||
this.BaseArchetypeTabPage.Name = "BaseArchetypeTabPage";
|
||||
this.BaseArchetypeTabPage.Padding = new System.Windows.Forms.Padding(3);
|
||||
this.BaseArchetypeTabPage.Size = new System.Drawing.Size(631, 479);
|
||||
this.BaseArchetypeTabPage.TabIndex = 0;
|
||||
this.BaseArchetypeTabPage.Text = "Base Archetype Def";
|
||||
this.BaseArchetypeTabPage.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// ArchetypeDeleteButton
|
||||
//
|
||||
this.ArchetypeDeleteButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
|
||||
this.ArchetypeDeleteButton.Location = new System.Drawing.Point(270, 450);
|
||||
this.ArchetypeDeleteButton.Name = "ArchetypeDeleteButton";
|
||||
this.ArchetypeDeleteButton.Size = new System.Drawing.Size(126, 23);
|
||||
this.ArchetypeDeleteButton.TabIndex = 79;
|
||||
this.ArchetypeDeleteButton.Text = "Delete Archetype";
|
||||
this.ArchetypeDeleteButton.UseVisualStyleBackColor = true;
|
||||
this.ArchetypeDeleteButton.Click += new System.EventHandler(this.DeleteArchetypeButton_Click);
|
||||
//
|
||||
// label13
|
||||
//
|
||||
this.label13.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label13.AutoSize = true;
|
||||
this.label13.Location = new System.Drawing.Point(8, 411);
|
||||
this.label13.Name = "label13";
|
||||
this.label13.Size = new System.Drawing.Size(57, 13);
|
||||
this.label13.TabIndex = 78;
|
||||
this.label13.Text = "BSRadius:";
|
||||
//
|
||||
// BSRadiusTextBox
|
||||
//
|
||||
this.BSRadiusTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.BSRadiusTextBox.Location = new System.Drawing.Point(71, 408);
|
||||
this.BSRadiusTextBox.Name = "BSRadiusTextBox";
|
||||
this.BSRadiusTextBox.Size = new System.Drawing.Size(552, 20);
|
||||
this.BSRadiusTextBox.TabIndex = 77;
|
||||
this.BSRadiusTextBox.TextChanged += new System.EventHandler(this.BSRadiusTextBox_TextChanged);
|
||||
//
|
||||
// BSCenterTextBox
|
||||
//
|
||||
this.BSCenterTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.BSCenterTextBox.Location = new System.Drawing.Point(71, 382);
|
||||
this.BSCenterTextBox.Name = "BSCenterTextBox";
|
||||
this.BSCenterTextBox.Size = new System.Drawing.Size(552, 20);
|
||||
this.BSCenterTextBox.TabIndex = 75;
|
||||
this.BSCenterTextBox.TextChanged += new System.EventHandler(this.BSCenterTextBox_TextChanged);
|
||||
//
|
||||
// BBMaxTextBox
|
||||
//
|
||||
this.BBMaxTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.BBMaxTextBox.Location = new System.Drawing.Point(71, 356);
|
||||
this.BBMaxTextBox.Name = "BBMaxTextBox";
|
||||
this.BBMaxTextBox.Size = new System.Drawing.Size(552, 20);
|
||||
this.BBMaxTextBox.TabIndex = 73;
|
||||
this.BBMaxTextBox.TextChanged += new System.EventHandler(this.BBMaxTextBox_TextChanged);
|
||||
//
|
||||
// BBMinTextBox
|
||||
//
|
||||
this.BBMinTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.BBMinTextBox.Location = new System.Drawing.Point(71, 330);
|
||||
this.BBMinTextBox.Name = "BBMinTextBox";
|
||||
this.BBMinTextBox.Size = new System.Drawing.Size(552, 20);
|
||||
this.BBMinTextBox.TabIndex = 71;
|
||||
this.BBMinTextBox.TextChanged += new System.EventHandler(this.BBMinTextBox_TextChanged);
|
||||
//
|
||||
// ArchetypeNameTextBox
|
||||
//
|
||||
this.ArchetypeNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.ArchetypeNameTextBox.Location = new System.Drawing.Point(110, 9);
|
||||
this.ArchetypeNameTextBox.Name = "ArchetypeNameTextBox";
|
||||
this.ArchetypeNameTextBox.Size = new System.Drawing.Size(247, 20);
|
||||
this.ArchetypeNameTextBox.TabIndex = 70;
|
||||
this.ArchetypeNameTextBox.TextChanged += new System.EventHandler(this.ArchetypeNameTextBox_TextChanged);
|
||||
//
|
||||
// ArchetypeFlagsTextBox
|
||||
//
|
||||
this.ArchetypeFlagsTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.ArchetypeFlagsTextBox.Location = new System.Drawing.Point(476, 12);
|
||||
this.ArchetypeFlagsTextBox.Name = "ArchetypeFlagsTextBox";
|
||||
this.ArchetypeFlagsTextBox.Size = new System.Drawing.Size(147, 20);
|
||||
this.ArchetypeFlagsTextBox.TabIndex = 66;
|
||||
this.ArchetypeFlagsTextBox.TextChanged += new System.EventHandler(this.ArchetypeFlagsTextBox_TextChanged);
|
||||
//
|
||||
// PhysicsDictionaryTextBox
|
||||
//
|
||||
this.PhysicsDictionaryTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.PhysicsDictionaryTextBox.Location = new System.Drawing.Point(110, 191);
|
||||
this.PhysicsDictionaryTextBox.Name = "PhysicsDictionaryTextBox";
|
||||
this.PhysicsDictionaryTextBox.Size = new System.Drawing.Size(206, 20);
|
||||
this.PhysicsDictionaryTextBox.TabIndex = 60;
|
||||
this.PhysicsDictionaryTextBox.TextChanged += new System.EventHandler(this.PhysicsDictionaryTextBox_TextChanged);
|
||||
//
|
||||
// ClipDictionaryTextBox
|
||||
//
|
||||
this.ClipDictionaryTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.ClipDictionaryTextBox.Location = new System.Drawing.Point(110, 165);
|
||||
this.ClipDictionaryTextBox.Name = "ClipDictionaryTextBox";
|
||||
this.ClipDictionaryTextBox.Size = new System.Drawing.Size(247, 20);
|
||||
this.ClipDictionaryTextBox.TabIndex = 58;
|
||||
this.ClipDictionaryTextBox.TextChanged += new System.EventHandler(this.ClipDictionaryTextBox_TextChanged);
|
||||
//
|
||||
// AssetNameTextBox
|
||||
//
|
||||
this.AssetNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.AssetNameTextBox.Location = new System.Drawing.Point(110, 35);
|
||||
this.AssetNameTextBox.Name = "AssetNameTextBox";
|
||||
this.AssetNameTextBox.Size = new System.Drawing.Size(247, 20);
|
||||
this.AssetNameTextBox.TabIndex = 56;
|
||||
this.AssetNameTextBox.TextChanged += new System.EventHandler(this.AssetNameTextBox_TextChanged);
|
||||
//
|
||||
// TextureDictTextBox
|
||||
//
|
||||
this.TextureDictTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.TextureDictTextBox.Location = new System.Drawing.Point(110, 139);
|
||||
this.TextureDictTextBox.Name = "TextureDictTextBox";
|
||||
this.TextureDictTextBox.Size = new System.Drawing.Size(206, 20);
|
||||
this.TextureDictTextBox.TabIndex = 54;
|
||||
this.TextureDictTextBox.TextChanged += new System.EventHandler(this.TextureDictTextBox_TextChanged);
|
||||
//
|
||||
// label12
|
||||
//
|
||||
this.label12.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label12.AutoSize = true;
|
||||
this.label12.Location = new System.Drawing.Point(8, 385);
|
||||
this.label12.Name = "label12";
|
||||
this.label12.Size = new System.Drawing.Size(55, 13);
|
||||
this.label12.TabIndex = 76;
|
||||
this.label12.Text = "BSCenter:";
|
||||
//
|
||||
// label11
|
||||
//
|
||||
this.label11.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label11.AutoSize = true;
|
||||
this.label11.Location = new System.Drawing.Point(19, 359);
|
||||
this.label11.Name = "label11";
|
||||
this.label11.Size = new System.Drawing.Size(44, 13);
|
||||
this.label11.TabIndex = 74;
|
||||
this.label11.Text = "BBMax:";
|
||||
//
|
||||
// label5
|
||||
//
|
||||
this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label5.AutoSize = true;
|
||||
this.label5.Location = new System.Drawing.Point(24, 333);
|
||||
this.label5.Name = "label5";
|
||||
this.label5.Size = new System.Drawing.Size(41, 13);
|
||||
this.label5.TabIndex = 72;
|
||||
this.label5.Text = "BBMin:";
|
||||
//
|
||||
// PhysicsDictHashLabel
|
||||
//
|
||||
this.PhysicsDictHashLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.PhysicsDictHashLabel.AutoSize = true;
|
||||
this.PhysicsDictHashLabel.Location = new System.Drawing.Point(322, 194);
|
||||
this.PhysicsDictHashLabel.Name = "PhysicsDictHashLabel";
|
||||
this.PhysicsDictHashLabel.Size = new System.Drawing.Size(35, 13);
|
||||
this.PhysicsDictHashLabel.TabIndex = 69;
|
||||
this.PhysicsDictHashLabel.Text = "Hash:";
|
||||
//
|
||||
// TextureDictHashLabel
|
||||
//
|
||||
this.TextureDictHashLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.TextureDictHashLabel.AutoSize = true;
|
||||
this.TextureDictHashLabel.Location = new System.Drawing.Point(322, 142);
|
||||
this.TextureDictHashLabel.Name = "TextureDictHashLabel";
|
||||
this.TextureDictHashLabel.Size = new System.Drawing.Size(35, 13);
|
||||
this.TextureDictHashLabel.TabIndex = 68;
|
||||
this.TextureDictHashLabel.Text = "Hash:";
|
||||
//
|
||||
// EntityFlagsCheckedListBox
|
||||
//
|
||||
this.EntityFlagsCheckedListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.EntityFlagsCheckedListBox.CheckOnClick = true;
|
||||
this.EntityFlagsCheckedListBox.FormattingEnabled = true;
|
||||
this.EntityFlagsCheckedListBox.Items.AddRange(new object[] {
|
||||
"1 - Unk01",
|
||||
"2 - Unk02",
|
||||
"4 - Unk03",
|
||||
"8 - Unk04",
|
||||
"16 - Unk05",
|
||||
"32 - Static",
|
||||
"64 - Unk07",
|
||||
"128 - Unk08",
|
||||
"256 - Unk09",
|
||||
"512 - Unk10",
|
||||
"1024 - Unk11",
|
||||
"2048 - Unk12",
|
||||
"4096 - Unk13",
|
||||
"8192 - Unk14",
|
||||
"16384 - Unk15",
|
||||
"32768 - Unk16",
|
||||
"65536 - Unk17",
|
||||
"131072 - Unk18",
|
||||
"262144 - Unk19",
|
||||
"524288 - Unk20",
|
||||
"1048576 - Unk21",
|
||||
"2097152 - Unk22",
|
||||
"4194304 - Unk23",
|
||||
"8388608 - Unk24",
|
||||
"16777216 - Unk25",
|
||||
"33554432 - Unk26",
|
||||
"67108864 - Unk27",
|
||||
"134217728 - Unk28",
|
||||
"268435456 - Unk29",
|
||||
"536870912 - Unk30",
|
||||
"1073741824 - Unk31",
|
||||
"2147483648 - Unk32"});
|
||||
this.EntityFlagsCheckedListBox.Location = new System.Drawing.Point(422, 38);
|
||||
this.EntityFlagsCheckedListBox.Name = "EntityFlagsCheckedListBox";
|
||||
this.EntityFlagsCheckedListBox.Size = new System.Drawing.Size(201, 274);
|
||||
this.EntityFlagsCheckedListBox.TabIndex = 67;
|
||||
this.EntityFlagsCheckedListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.ArchetypeFlagsCheckedListBox_ItemCheck);
|
||||
//
|
||||
// label14
|
||||
//
|
||||
this.label14.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label14.AutoSize = true;
|
||||
this.label14.Location = new System.Drawing.Point(419, 15);
|
||||
this.label14.Name = "label14";
|
||||
this.label14.Size = new System.Drawing.Size(35, 13);
|
||||
this.label14.TabIndex = 65;
|
||||
this.label14.Text = "Flags:";
|
||||
//
|
||||
// SpecialAttributeNumericUpDown
|
||||
//
|
||||
this.SpecialAttributeNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.SpecialAttributeNumericUpDown.Location = new System.Drawing.Point(110, 113);
|
||||
this.SpecialAttributeNumericUpDown.Maximum = new decimal(new int[] {
|
||||
9999999,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.SpecialAttributeNumericUpDown.Name = "SpecialAttributeNumericUpDown";
|
||||
this.SpecialAttributeNumericUpDown.Size = new System.Drawing.Size(247, 20);
|
||||
this.SpecialAttributeNumericUpDown.TabIndex = 64;
|
||||
this.SpecialAttributeNumericUpDown.ValueChanged += new System.EventHandler(this.SpecialAttributeNumericUpDown_ValueChanged);
|
||||
//
|
||||
// label10
|
||||
//
|
||||
this.label10.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label10.AutoSize = true;
|
||||
this.label10.Location = new System.Drawing.Point(17, 115);
|
||||
this.label10.Name = "label10";
|
||||
this.label10.Size = new System.Drawing.Size(87, 13);
|
||||
this.label10.TabIndex = 63;
|
||||
this.label10.Text = "Special Attribute:";
|
||||
//
|
||||
// label9
|
||||
//
|
||||
this.label9.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label9.AutoSize = true;
|
||||
this.label9.Location = new System.Drawing.Point(41, 220);
|
||||
this.label9.Name = "label9";
|
||||
this.label9.Size = new System.Drawing.Size(63, 13);
|
||||
this.label9.TabIndex = 62;
|
||||
this.label9.Text = "Asset Type:";
|
||||
//
|
||||
// AssetTypeComboBox
|
||||
//
|
||||
this.AssetTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.AssetTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.AssetTypeComboBox.FormattingEnabled = true;
|
||||
this.AssetTypeComboBox.Location = new System.Drawing.Point(110, 217);
|
||||
this.AssetTypeComboBox.Name = "AssetTypeComboBox";
|
||||
this.AssetTypeComboBox.Size = new System.Drawing.Size(247, 21);
|
||||
this.AssetTypeComboBox.TabIndex = 61;
|
||||
//
|
||||
// label8
|
||||
//
|
||||
this.label8.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label8.AutoSize = true;
|
||||
this.label8.Location = new System.Drawing.Point(8, 194);
|
||||
this.label8.Name = "label8";
|
||||
this.label8.Size = new System.Drawing.Size(96, 13);
|
||||
this.label8.TabIndex = 59;
|
||||
this.label8.Text = "Physics Dictionary:";
|
||||
//
|
||||
// label7
|
||||
//
|
||||
this.label7.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label7.AutoSize = true;
|
||||
this.label7.Location = new System.Drawing.Point(27, 168);
|
||||
this.label7.Name = "label7";
|
||||
this.label7.Size = new System.Drawing.Size(77, 13);
|
||||
this.label7.TabIndex = 57;
|
||||
this.label7.Text = "Clip Dictionary:";
|
||||
//
|
||||
// label6
|
||||
//
|
||||
this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label6.AutoSize = true;
|
||||
this.label6.Location = new System.Drawing.Point(37, 38);
|
||||
this.label6.Name = "label6";
|
||||
this.label6.Size = new System.Drawing.Size(67, 13);
|
||||
this.label6.TabIndex = 55;
|
||||
this.label6.Text = "Asset Name:";
|
||||
//
|
||||
// label4
|
||||
//
|
||||
this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label4.AutoSize = true;
|
||||
this.label4.Location = new System.Drawing.Point(8, 142);
|
||||
this.label4.Name = "label4";
|
||||
this.label4.Size = new System.Drawing.Size(96, 13);
|
||||
this.label4.TabIndex = 53;
|
||||
this.label4.Text = "Texture Dictionary:";
|
||||
//
|
||||
// HDTextureDistNumericUpDown
|
||||
//
|
||||
this.HDTextureDistNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.HDTextureDistNumericUpDown.DecimalPlaces = 8;
|
||||
this.HDTextureDistNumericUpDown.Location = new System.Drawing.Point(110, 87);
|
||||
this.HDTextureDistNumericUpDown.Maximum = new decimal(new int[] {
|
||||
9999999,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.HDTextureDistNumericUpDown.Name = "HDTextureDistNumericUpDown";
|
||||
this.HDTextureDistNumericUpDown.Size = new System.Drawing.Size(247, 20);
|
||||
this.HDTextureDistNumericUpDown.TabIndex = 52;
|
||||
this.HDTextureDistNumericUpDown.ValueChanged += new System.EventHandler(this.HDTextureDistNumericUpDown_ValueChanged);
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Location = new System.Drawing.Point(18, 89);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(86, 13);
|
||||
this.label3.TabIndex = 51;
|
||||
this.label3.Text = "HD Texture Dist:";
|
||||
//
|
||||
// LodDistNumericUpDown
|
||||
//
|
||||
this.LodDistNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.LodDistNumericUpDown.DecimalPlaces = 8;
|
||||
this.LodDistNumericUpDown.Location = new System.Drawing.Point(110, 61);
|
||||
this.LodDistNumericUpDown.Maximum = new decimal(new int[] {
|
||||
9999999,
|
||||
0,
|
||||
0,
|
||||
0});
|
||||
this.LodDistNumericUpDown.Name = "LodDistNumericUpDown";
|
||||
this.LodDistNumericUpDown.Size = new System.Drawing.Size(247, 20);
|
||||
this.LodDistNumericUpDown.TabIndex = 50;
|
||||
this.LodDistNumericUpDown.ValueChanged += new System.EventHandler(this.LodDistNumericUpDown_ValueChanged);
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Location = new System.Drawing.Point(55, 63);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(49, 13);
|
||||
this.label2.TabIndex = 49;
|
||||
this.label2.Text = "Lod Dist:";
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(66, 12);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(38, 13);
|
||||
this.label1.TabIndex = 48;
|
||||
this.label1.Text = "Name:";
|
||||
//
|
||||
// TabControl
|
||||
//
|
||||
this.TabControl.Controls.Add(this.BaseArchetypeTabPage);
|
||||
this.TabControl.Controls.Add(this.MloArchetypeTabPage);
|
||||
this.TabControl.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.TabControl.Location = new System.Drawing.Point(0, 0);
|
||||
this.TabControl.Name = "TabControl";
|
||||
this.TabControl.SelectedIndex = 0;
|
||||
this.TabControl.Size = new System.Drawing.Size(639, 505);
|
||||
this.TabControl.TabIndex = 48;
|
||||
//
|
||||
// MloArchetypeTabPage
|
||||
//
|
||||
this.MloArchetypeTabPage.Controls.Add(this.EntitySetsListBox);
|
||||
this.MloArchetypeTabPage.Controls.Add(this.label15);
|
||||
this.MloArchetypeTabPage.Location = new System.Drawing.Point(4, 22);
|
||||
this.MloArchetypeTabPage.Name = "MloArchetypeTabPage";
|
||||
this.MloArchetypeTabPage.Padding = new System.Windows.Forms.Padding(3);
|
||||
this.MloArchetypeTabPage.Size = new System.Drawing.Size(631, 479);
|
||||
this.MloArchetypeTabPage.TabIndex = 1;
|
||||
this.MloArchetypeTabPage.Text = "Mlo Archetype Def";
|
||||
this.MloArchetypeTabPage.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// EntitySetsListBox
|
||||
//
|
||||
this.EntitySetsListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.EntitySetsListBox.CheckOnClick = true;
|
||||
this.EntitySetsListBox.FormattingEnabled = true;
|
||||
this.EntitySetsListBox.Location = new System.Drawing.Point(11, 42);
|
||||
this.EntitySetsListBox.Name = "EntitySetsListBox";
|
||||
this.EntitySetsListBox.Size = new System.Drawing.Size(603, 214);
|
||||
this.EntitySetsListBox.TabIndex = 2;
|
||||
this.EntitySetsListBox.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.EntitySetsListBox_ItemCheck);
|
||||
//
|
||||
// label15
|
||||
//
|
||||
this.label15.AutoSize = true;
|
||||
this.label15.Location = new System.Drawing.Point(8, 26);
|
||||
this.label15.Name = "label15";
|
||||
this.label15.Size = new System.Drawing.Size(57, 13);
|
||||
this.label15.TabIndex = 1;
|
||||
this.label15.Text = "EntitySets:";
|
||||
//
|
||||
// EditYtypArchetypePanel
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(639, 505);
|
||||
this.Controls.Add(this.TabControl);
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.MinimumSize = new System.Drawing.Size(531, 458);
|
||||
this.Name = "EditYtypArchetypePanel";
|
||||
this.Text = "Edit Archetype";
|
||||
this.Load += new System.EventHandler(this.EditYtypArchetypePanel_Load);
|
||||
this.BaseArchetypeTabPage.ResumeLayout(false);
|
||||
this.BaseArchetypeTabPage.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.SpecialAttributeNumericUpDown)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.HDTextureDistNumericUpDown)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.LodDistNumericUpDown)).EndInit();
|
||||
this.TabControl.ResumeLayout(false);
|
||||
this.MloArchetypeTabPage.ResumeLayout(false);
|
||||
this.MloArchetypeTabPage.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.TabPage BaseArchetypeTabPage;
|
||||
private System.Windows.Forms.Button ArchetypeDeleteButton;
|
||||
private System.Windows.Forms.Label label13;
|
||||
private System.Windows.Forms.TextBox BSRadiusTextBox;
|
||||
private System.Windows.Forms.TextBox BSCenterTextBox;
|
||||
private System.Windows.Forms.TextBox BBMaxTextBox;
|
||||
private System.Windows.Forms.TextBox BBMinTextBox;
|
||||
private System.Windows.Forms.TextBox ArchetypeNameTextBox;
|
||||
private System.Windows.Forms.TextBox ArchetypeFlagsTextBox;
|
||||
private System.Windows.Forms.TextBox PhysicsDictionaryTextBox;
|
||||
private System.Windows.Forms.TextBox ClipDictionaryTextBox;
|
||||
private System.Windows.Forms.TextBox AssetNameTextBox;
|
||||
private System.Windows.Forms.TextBox TextureDictTextBox;
|
||||
private System.Windows.Forms.Label label12;
|
||||
private System.Windows.Forms.Label label11;
|
||||
private System.Windows.Forms.Label label5;
|
||||
private System.Windows.Forms.Label PhysicsDictHashLabel;
|
||||
private System.Windows.Forms.Label TextureDictHashLabel;
|
||||
private System.Windows.Forms.CheckedListBox EntityFlagsCheckedListBox;
|
||||
private System.Windows.Forms.Label label14;
|
||||
private System.Windows.Forms.NumericUpDown SpecialAttributeNumericUpDown;
|
||||
private System.Windows.Forms.Label label10;
|
||||
private System.Windows.Forms.Label label9;
|
||||
private System.Windows.Forms.ComboBox AssetTypeComboBox;
|
||||
private System.Windows.Forms.Label label8;
|
||||
private System.Windows.Forms.Label label7;
|
||||
private System.Windows.Forms.Label label6;
|
||||
private System.Windows.Forms.Label label4;
|
||||
private System.Windows.Forms.NumericUpDown HDTextureDistNumericUpDown;
|
||||
private System.Windows.Forms.Label label3;
|
||||
private System.Windows.Forms.NumericUpDown LodDistNumericUpDown;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.TabControl TabControl;
|
||||
private System.Windows.Forms.TabPage MloArchetypeTabPage;
|
||||
private System.Windows.Forms.CheckedListBox EntitySetsListBox;
|
||||
private System.Windows.Forms.Label label15;
|
||||
}
|
||||
}
|
353
Project/Panels/EditYtypArchetypePanel.cs
Normal file
353
Project/Panels/EditYtypArchetypePanel.cs
Normal file
@ -0,0 +1,353 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Windows.Forms;
|
||||
using CodeWalker.GameFiles;
|
||||
using SharpDX;
|
||||
|
||||
namespace CodeWalker.Project.Panels
|
||||
{
|
||||
public partial class EditYtypArchetypePanel : ProjectPanel
|
||||
{
|
||||
public ProjectForm ProjectForm;
|
||||
|
||||
private bool populatingui;
|
||||
|
||||
public EditYtypArchetypePanel(ProjectForm owner)
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
ProjectForm = owner;
|
||||
}
|
||||
|
||||
public Archetype CurrentArchetype { get; set; }
|
||||
|
||||
private void EditYtypArchetypePanel_Load(object sender, EventArgs e)
|
||||
{
|
||||
AssetTypeComboBox.Items.AddRange(Enum.GetNames(typeof(Unk_1991964615)));
|
||||
}
|
||||
|
||||
public void SetArchetype(Archetype archetype)
|
||||
{
|
||||
CurrentArchetype = archetype;
|
||||
Tag = archetype;
|
||||
UpdateFormTitle();
|
||||
UpdateControls();
|
||||
}
|
||||
|
||||
private void UpdateFormTitle()
|
||||
{
|
||||
Text = CurrentArchetype?.Name ?? "Edit Archetype";
|
||||
}
|
||||
|
||||
private void UpdateControls()
|
||||
{
|
||||
if (CurrentArchetype != null)
|
||||
{
|
||||
ArchetypeDeleteButton.Enabled = ProjectForm.YtypExistsInProject(CurrentArchetype.Ytyp);
|
||||
ArchetypeNameTextBox.Text = CurrentArchetype.Name;
|
||||
AssetNameTextBox.Text = CurrentArchetype.AssetName;
|
||||
LodDistNumericUpDown.Value = (decimal)CurrentArchetype._BaseArchetypeDef.lodDist;
|
||||
HDTextureDistNumericUpDown.Value = (decimal)CurrentArchetype._BaseArchetypeDef.hdTextureDist;
|
||||
SpecialAttributeNumericUpDown.Value = CurrentArchetype._BaseArchetypeDef.specialAttribute;
|
||||
ArchetypeFlagsTextBox.Text = CurrentArchetype._BaseArchetypeDef.flags.ToString();
|
||||
TextureDictTextBox.Text = CurrentArchetype._BaseArchetypeDef.textureDictionary.ToCleanString();
|
||||
ClipDictionaryTextBox.Text = CurrentArchetype._BaseArchetypeDef.clipDictionary.ToCleanString();
|
||||
PhysicsDictionaryTextBox.Text = CurrentArchetype._BaseArchetypeDef.physicsDictionary.ToCleanString();
|
||||
AssetTypeComboBox.Text = CurrentArchetype._BaseArchetypeDef.assetType.ToString();
|
||||
BBMinTextBox.Text = FloatUtil.GetVector3String(CurrentArchetype._BaseArchetypeDef.bbMin);
|
||||
BBMaxTextBox.Text = FloatUtil.GetVector3String(CurrentArchetype._BaseArchetypeDef.bbMax);
|
||||
BSCenterTextBox.Text = FloatUtil.GetVector3String(CurrentArchetype._BaseArchetypeDef.bsCentre);
|
||||
BSRadiusTextBox.Text = CurrentArchetype._BaseArchetypeDef.bsRadius.ToString(CultureInfo.InvariantCulture);
|
||||
|
||||
EntitySetsListBox.Items.Clear();
|
||||
if (CurrentArchetype is MloArchetype MloArchetype)
|
||||
{
|
||||
if (!TabControl.TabPages.Contains(MloArchetypeTabPage))
|
||||
{
|
||||
TabControl.TabPages.Add(MloArchetypeTabPage);
|
||||
}
|
||||
|
||||
MloInstanceData mloinstance = ProjectForm.TryGetMloInstance(MloArchetype);
|
||||
if (mloinstance != null)
|
||||
{
|
||||
EntitySetsListBox.Enabled = true;
|
||||
foreach (var sets in mloinstance.EntitySets)
|
||||
{
|
||||
MloInstanceEntitySet set = sets.Value;
|
||||
EntitySetsListBox.Items.Add(set.EntitySet.ToString(), set.Visible);
|
||||
}
|
||||
}
|
||||
else EntitySetsListBox.Enabled = false;
|
||||
}
|
||||
else TabControl.TabPages.Remove(MloArchetypeTabPage);
|
||||
}
|
||||
}
|
||||
|
||||
private void ArchetypeFlagsTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (populatingui) return;
|
||||
if (CurrentArchetype == null) return;
|
||||
uint flags = 0;
|
||||
uint.TryParse(ArchetypeFlagsTextBox.Text, out flags);
|
||||
populatingui = true;
|
||||
for (int i = 0; i < EntityFlagsCheckedListBox.Items.Count; i++)
|
||||
{
|
||||
var c = ((flags & (1u << i)) > 0);
|
||||
EntityFlagsCheckedListBox.SetItemCheckState(i, c ? CheckState.Checked : CheckState.Unchecked);
|
||||
}
|
||||
populatingui = false;
|
||||
lock (ProjectForm.ProjectSyncRoot)
|
||||
{
|
||||
if (CurrentArchetype._BaseArchetypeDef.flags != flags)
|
||||
{
|
||||
CurrentArchetype._BaseArchetypeDef.flags = flags;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ArchetypeFlagsCheckedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
|
||||
{
|
||||
if (populatingui) return;
|
||||
if (CurrentArchetype == null) return;
|
||||
uint flags = 0;
|
||||
for (int i = 0; i < EntityFlagsCheckedListBox.Items.Count; i++)
|
||||
{
|
||||
if (e.Index == i)
|
||||
{
|
||||
if (e.NewValue == CheckState.Checked)
|
||||
{
|
||||
flags += (uint)(1 << i);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (EntityFlagsCheckedListBox.GetItemChecked(i))
|
||||
{
|
||||
flags += (uint)(1 << i);
|
||||
}
|
||||
}
|
||||
}
|
||||
populatingui = true;
|
||||
ArchetypeFlagsTextBox.Text = flags.ToString();
|
||||
populatingui = false;
|
||||
lock (ProjectForm.ProjectSyncRoot)
|
||||
{
|
||||
if (CurrentArchetype._BaseArchetypeDef.flags != flags)
|
||||
{
|
||||
CurrentArchetype._BaseArchetypeDef.flags = flags;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void TextureDictTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
// Check that the form is not null before locking...
|
||||
if (ProjectForm == null)
|
||||
return;
|
||||
|
||||
lock (ProjectForm.ProjectSyncRoot)
|
||||
{
|
||||
// Embedded...
|
||||
if (TextureDictTextBox.Text == ArchetypeNameTextBox.Text)
|
||||
{
|
||||
TextureDictHashLabel.Text = "Embedded";
|
||||
CurrentArchetype._BaseArchetypeDef.textureDictionary = CurrentArchetype._BaseArchetypeDef.name;
|
||||
return;
|
||||
}
|
||||
|
||||
var hash = JenkHash.GenHash(TextureDictTextBox.Text);
|
||||
|
||||
if (CurrentArchetype._BaseArchetypeDef.textureDictionary != hash)
|
||||
{
|
||||
var ytd = ProjectForm.GameFileCache.GetYtd(hash);
|
||||
if (ytd == null)
|
||||
{
|
||||
TextureDictHashLabel.Text = "Hash: " + hash.ToString() + " (invalid)";
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
return;
|
||||
}
|
||||
TextureDictHashLabel.Text = "Hash: " + hash.ToString();
|
||||
CurrentArchetype._BaseArchetypeDef.textureDictionary = hash;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void PhysicsDictionaryTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
lock (ProjectForm.ProjectSyncRoot)
|
||||
{
|
||||
if (ProjectForm == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Embedded...
|
||||
if (PhysicsDictionaryTextBox.Text == ArchetypeNameTextBox.Text)
|
||||
{
|
||||
PhysicsDictHashLabel.Text = "Embedded";
|
||||
CurrentArchetype._BaseArchetypeDef.physicsDictionary = CurrentArchetype._BaseArchetypeDef.name;
|
||||
return;
|
||||
}
|
||||
|
||||
var hash = JenkHash.GenHash(PhysicsDictionaryTextBox.Text);
|
||||
|
||||
if (CurrentArchetype._BaseArchetypeDef.physicsDictionary != hash)
|
||||
{
|
||||
var ytd = ProjectForm.GameFileCache.GetYbn(hash);
|
||||
if (ytd == null)
|
||||
{
|
||||
PhysicsDictHashLabel.Text = "Hash: " + hash.ToString() + " (invalid)";
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
return;
|
||||
}
|
||||
PhysicsDictHashLabel.Text = "Hash: " + hash.ToString();
|
||||
|
||||
CurrentArchetype._BaseArchetypeDef.physicsDictionary = hash;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ArchetypeNameTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
var hash = JenkHash.GenHash(ArchetypeNameTextBox.Text);
|
||||
|
||||
if (CurrentArchetype._BaseArchetypeDef.name != hash)
|
||||
{
|
||||
CurrentArchetype._BaseArchetypeDef.name = hash;
|
||||
UpdateFormTitle();
|
||||
|
||||
TreeNode tn = ProjectForm.ProjectExplorer?.FindArchetypeTreeNode(CurrentArchetype);
|
||||
if (tn != null)
|
||||
tn.Text = ArchetypeNameTextBox.Text ?? "0"; // using the text box text because the name may not be in the gfc.
|
||||
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void AssetNameTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
var hash = JenkHash.GenHash(AssetNameTextBox.Text);
|
||||
|
||||
if (CurrentArchetype._BaseArchetypeDef.assetName != hash)
|
||||
{
|
||||
CurrentArchetype._BaseArchetypeDef.assetName = hash;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void ClipDictionaryTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
var hash = JenkHash.GenHash(ClipDictionaryTextBox.Text);
|
||||
|
||||
if (CurrentArchetype._BaseArchetypeDef.clipDictionary != hash)
|
||||
{
|
||||
CurrentArchetype._BaseArchetypeDef.clipDictionary = hash;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void LodDistNumericUpDown_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
var loddist = (float)LodDistNumericUpDown.Value;
|
||||
if (!MathUtil.NearEqual(loddist, CurrentArchetype._BaseArchetypeDef.lodDist))
|
||||
{
|
||||
CurrentArchetype._BaseArchetypeDef.lodDist = loddist;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void HDTextureDistNumericUpDown_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
var hddist = (float)HDTextureDistNumericUpDown.Value;
|
||||
if (!MathUtil.NearEqual(hddist, CurrentArchetype._BaseArchetypeDef.hdTextureDist))
|
||||
{
|
||||
CurrentArchetype._BaseArchetypeDef.hdTextureDist = hddist;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void SpecialAttributeNumericUpDown_ValueChanged(object sender, EventArgs e)
|
||||
{
|
||||
var att = (uint)SpecialAttributeNumericUpDown.Value;
|
||||
if (CurrentArchetype._BaseArchetypeDef.specialAttribute != att)
|
||||
{
|
||||
CurrentArchetype._BaseArchetypeDef.specialAttribute = att;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void BBMinTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
Vector3 min = FloatUtil.ParseVector3String(BBMinTextBox.Text);
|
||||
if (CurrentArchetype._BaseArchetypeDef.bbMin != min)
|
||||
{
|
||||
CurrentArchetype._BaseArchetypeDef.bbMin = min;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void BBMaxTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
Vector3 max = FloatUtil.ParseVector3String(BBMaxTextBox.Text);
|
||||
|
||||
if (CurrentArchetype._BaseArchetypeDef.bbMax != max)
|
||||
{
|
||||
CurrentArchetype._BaseArchetypeDef.bbMax = max;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void BSCenterTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
Vector3 c = FloatUtil.ParseVector3String(BSCenterTextBox.Text);
|
||||
|
||||
if (CurrentArchetype._BaseArchetypeDef.bsCentre != c)
|
||||
{
|
||||
CurrentArchetype._BaseArchetypeDef.bsCentre = c;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void BSRadiusTextBox_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
if (float.TryParse(BSRadiusTextBox.Text, out float f))
|
||||
{
|
||||
if (!MathUtil.NearEqual(CurrentArchetype._BaseArchetypeDef.bsRadius, f))
|
||||
{
|
||||
CurrentArchetype._BaseArchetypeDef.bsRadius = f;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CurrentArchetype._BaseArchetypeDef.bsRadius = 0f;
|
||||
ProjectForm.SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void DeleteArchetypeButton_Click(object sender, EventArgs e)
|
||||
{
|
||||
ProjectForm.SetProjectItem(CurrentArchetype);
|
||||
ProjectForm.DeleteArchetype();
|
||||
}
|
||||
|
||||
private void EntitySetsListBox_ItemCheck(object sender, ItemCheckEventArgs e)
|
||||
{
|
||||
if (CurrentArchetype is MloArchetype MloArchetype)
|
||||
{
|
||||
var inst = ProjectForm.TryGetMloInstance(MloArchetype);
|
||||
if (inst != null)
|
||||
{
|
||||
MloInstanceEntitySet mloInstanceEntitySet = inst.EntitySets[MloArchetype.entitySets[e.Index]._Data.name];
|
||||
mloInstanceEntitySet.Visible = e.NewValue == CheckState.Checked;
|
||||
return;
|
||||
}
|
||||
}
|
||||
e.NewValue = CheckState.Unchecked;
|
||||
}
|
||||
}
|
||||
}
|
140
Project/Panels/EditYtypArchetypePanel.resx
Normal file
140
Project/Panels/EditYtypArchetypePanel.resx
Normal file
@ -0,0 +1,140 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
AAABAAEAEBAAAAAAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAD////r7/3y9f7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+P
|
||||
lce/xeb///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+Ah7a0utv/////////
|
||||
//////////8AAAAAAAAAAAD////x9P73+v7///////////+Mk8K6weH////s8Pu6wOj9/f////8AAAAA
|
||||
AAAAAAD///+epdgZHILl6/z///////+NlMPIzuj///8rL41larT///////8AAAAAAAAAAAD////w9P9I
|
||||
T6bAxuv///////+stNne5PP///96gMfv8/3///8AAAAAAAAAAAAAAAAAAAD////////////////M0/Fe
|
||||
Z7NUXK3c4fX///////////8AAAAAAAAAAAAAAAAAAAD////////+/v+osd55gcRbYbZncLtPVqmwueP7
|
||||
/f/6/P/4+v/9/f8AAAAAAAAAAADo7fx+iNBSXLJKUqhxfsETGoRWYbOIk9QLDXNaYK5udr9kbLjv8/4A
|
||||
AAD////////y9v3Cye66w+uPleA2PqM1PpmJlNF9h8tYX7LO1fLq7/zz9v7///8AAAD////j6fnf5Pf/
|
||||
///////j6f+Lkd8rMplteMWDjNHw9Pz////l6vq4v+j4+v8AAADq7/4+Q520u+T////////////1+P/v
|
||||
9P7m6/v6+//////////a4foYGYShqNkAAADw8/3i5/n////4+v9jarba4Pf////h5/j9/v/9/v9YXrHC
|
||||
yev////y9v3q7vwAAAAAAAAAAAD////K0e9LUaf9/v/7/P82OozT2O////9PVqlqcLv///8AAAAAAAAA
|
||||
AAAAAAAAAAAAAAD2+P76+//////7/P+VndXh5vj////7/P/09/8AAAAAAAAAAAAAAAD//wAA/D8AAPw/
|
||||
AAD8AwAAgAMAAIADAACABwAAwAcAAMABAADAAQAAAAEAAAABAAAAAQAAAAEAAMAHAADgDwAA
|
||||
</value>
|
||||
</data>
|
||||
</root>
|
16
Project/Panels/EditYtypPanel.Designer.cs
generated
16
Project/Panels/EditYtypPanel.Designer.cs
generated
@ -29,34 +29,20 @@
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditYtypPanel));
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(58, 52);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(99, 13);
|
||||
this.label1.TabIndex = 0;
|
||||
this.label1.Text = "Ytyp editing TODO!";
|
||||
//
|
||||
// EditYtypPanel
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(469, 292);
|
||||
this.Controls.Add(this.label1);
|
||||
this.ClientSize = new System.Drawing.Size(599, 406);
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.Name = "EditYtypPanel";
|
||||
this.Text = "Edit Ytyp";
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Label label1;
|
||||
}
|
||||
}
|
@ -248,8 +248,53 @@ namespace CodeWalker.Project.Panels
|
||||
}
|
||||
|
||||
}
|
||||
private void LoadYtypTreeNodes(YtypFile ytyp, TreeNode node)//TODO!
|
||||
private void LoadYtypTreeNodes(YtypFile ytyp, TreeNode node)
|
||||
{
|
||||
if (ytyp == null) return;
|
||||
|
||||
if (!string.IsNullOrEmpty(node.Name)) return;
|
||||
|
||||
node.Nodes.Clear();
|
||||
|
||||
if ((ytyp.AllArchetypes != null) && (ytyp.AllArchetypes.Length > 0))
|
||||
{
|
||||
var archetypesnode = node.Nodes.Add("Archetypes (" + ytyp.AllArchetypes.Length.ToString() + ")");
|
||||
archetypesnode.Name = "Archetypes";
|
||||
archetypesnode.Tag = ytyp;
|
||||
var archetypes = ytyp.AllArchetypes;
|
||||
for (int i = 0; i < archetypes.Length; i++)
|
||||
{
|
||||
var yarch = archetypes[i];
|
||||
var tarch = archetypesnode.Nodes.Add(yarch.Name);
|
||||
tarch.Tag = yarch;
|
||||
|
||||
if (yarch is MloArchetype mlo)
|
||||
{
|
||||
if ((mlo.entities.Length) > 0 && (mlo.rooms.Length > 0))
|
||||
{
|
||||
MCEntityDef[] entities = mlo.entities;
|
||||
var roomsnode = tarch.Nodes.Add("Rooms (" + mlo.rooms.Length.ToString() + ")");
|
||||
roomsnode.Name = "Rooms";
|
||||
for (int j = 0; j < mlo.rooms.Length; j++)
|
||||
{
|
||||
MCMloRoomDef room = mlo.rooms[j];
|
||||
var roomnode = roomsnode.Nodes.Add(room.RoomName);
|
||||
roomnode.Tag = room;
|
||||
var entitiesnode = roomnode.Nodes.Add("Attached Objects (" + room.AttachedObjects.Length + ")");
|
||||
entitiesnode.Name = "Attached Objects";
|
||||
|
||||
for (int k = 0; k < room.AttachedObjects.Length; k++)
|
||||
{
|
||||
uint attachedObject = room.AttachedObjects[k];
|
||||
MCEntityDef ent = entities[attachedObject];
|
||||
TreeNode entnode = entitiesnode.Nodes.Add(ent.ToString());
|
||||
entnode.Tag = ent;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
private void LoadYndTreeNodes(YndFile ynd, TreeNode node)
|
||||
{
|
||||
@ -726,7 +771,101 @@ namespace CodeWalker.Project.Panels
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public TreeNode FindYtypTreeNode(YtypFile ytyp)
|
||||
{
|
||||
if (ProjectTreeView.Nodes.Count <= 0) return null;
|
||||
var projnode = ProjectTreeView.Nodes[0];
|
||||
var ytypsnode = GetChildTreeNode(projnode, "Ytyp");
|
||||
if (ytypsnode == null) return null;
|
||||
for (int i = 0; i < ytypsnode.Nodes.Count; i++)
|
||||
{
|
||||
var ytypnode = ytypsnode.Nodes[i];
|
||||
if (ytypnode.Tag == ytyp) return ytypnode;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public TreeNode FindArchetypeTreeNode(Archetype archetype)
|
||||
{
|
||||
if (archetype == null) return null;
|
||||
TreeNode ytypnode = FindYtypTreeNode(archetype.Ytyp);
|
||||
if (ytypnode == null) return null;
|
||||
var archetypenode = GetChildTreeNode(ytypnode, "Archetypes");
|
||||
if (archetypenode == null) return null;
|
||||
for (int i = 0; i < archetypenode.Nodes.Count; i++)
|
||||
{
|
||||
TreeNode archnode = archetypenode.Nodes[i];
|
||||
if (archnode.Tag == archetype) return archnode;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public TreeNode FindMloRoomTreeNode(MCMloRoomDef room)
|
||||
{
|
||||
if (room == null) return null;
|
||||
|
||||
TreeNode ytypnode = FindYtypTreeNode(room.Archetype.Ytyp);
|
||||
if (ytypnode == null) return null;
|
||||
|
||||
TreeNode archetypesnode = GetChildTreeNode(ytypnode, "Archetypes");
|
||||
if (archetypesnode == null) return null;
|
||||
|
||||
for (int i = 0; i < archetypesnode.Nodes.Count; i++)
|
||||
{
|
||||
TreeNode mloarchetypenode = archetypesnode.Nodes[i];
|
||||
if (mloarchetypenode.Tag == room.Archetype)
|
||||
{
|
||||
TreeNode roomsnode = GetChildTreeNode(mloarchetypenode, "Rooms");
|
||||
if (roomsnode == null) return null;
|
||||
|
||||
for (int j = 0; j < roomsnode.Nodes.Count; j++)
|
||||
{
|
||||
TreeNode roomnode = roomsnode.Nodes[j];
|
||||
if (roomnode.Tag == room) return roomnode;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public TreeNode FindMloEntityTreeNode(MCEntityDef ent)
|
||||
{
|
||||
MCMloRoomDef entityroom = ent?.Archetype?.GetEntityRoom(ent);
|
||||
if (entityroom == null) return null;
|
||||
|
||||
TreeNode ytypnode = FindYtypTreeNode(ent.Archetype.Ytyp);
|
||||
if (ytypnode == null) return null;
|
||||
|
||||
var archetypesnode = GetChildTreeNode(ytypnode, "Archetypes");
|
||||
if (archetypesnode == null) return null;
|
||||
|
||||
for (int i = 0; i < archetypesnode.Nodes.Count; i++)
|
||||
{
|
||||
TreeNode mloarchetypenode = archetypesnode.Nodes[i];
|
||||
if (mloarchetypenode.Tag == ent.Archetype)
|
||||
{
|
||||
TreeNode roomsnode = GetChildTreeNode(mloarchetypenode, "Rooms");
|
||||
if (roomsnode == null) return null;
|
||||
|
||||
for (int j = 0; j < roomsnode.Nodes.Count; j++)
|
||||
{
|
||||
TreeNode roomnode = roomsnode.Nodes[j];
|
||||
if (roomnode.Tag == entityroom)
|
||||
{
|
||||
TreeNode entitiesnode = GetChildTreeNode(roomnode, "Attached Objects");
|
||||
if (entitiesnode == null) return null;
|
||||
|
||||
for (var k = 0; k < entitiesnode.Nodes.Count; k++)
|
||||
{
|
||||
TreeNode entitynode = entitiesnode.Nodes[k];
|
||||
if (entitynode.Tag == ent) return entitynode;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public TreeNode FindYndTreeNode(YndFile ynd)
|
||||
{
|
||||
if (ProjectTreeView.Nodes.Count <= 0) return null;
|
||||
@ -974,6 +1113,51 @@ namespace CodeWalker.Project.Panels
|
||||
}
|
||||
}
|
||||
}
|
||||
public void TrySelectMloEntityTreeNode(MCEntityDef ent)
|
||||
{
|
||||
TreeNode entnode = FindMloEntityTreeNode(ent);
|
||||
if (entnode != null)
|
||||
{
|
||||
if (ProjectTreeView.SelectedNode == entnode)
|
||||
{
|
||||
OnItemSelected?.Invoke(ent);
|
||||
}
|
||||
else
|
||||
{
|
||||
ProjectTreeView.SelectedNode = entnode;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void TrySelectMloRoomTreeNode(MCMloRoomDef room)
|
||||
{
|
||||
TreeNode roomnode = FindMloRoomTreeNode(room);
|
||||
if (roomnode != null)
|
||||
{
|
||||
if (ProjectTreeView.SelectedNode == roomnode)
|
||||
{
|
||||
OnItemSelected?.Invoke(room);
|
||||
}
|
||||
else
|
||||
{
|
||||
ProjectTreeView.SelectedNode = roomnode;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void TrySelectArchetypeTreeNode(Archetype archetype)
|
||||
{
|
||||
TreeNode archetypenode = FindArchetypeTreeNode(archetype);
|
||||
if (archetypenode != null)
|
||||
{
|
||||
if (ProjectTreeView.SelectedNode == archetypenode)
|
||||
{
|
||||
OnItemSelected?.Invoke(archetype);
|
||||
}
|
||||
else
|
||||
{
|
||||
ProjectTreeView.SelectedNode = archetypenode;
|
||||
}
|
||||
}
|
||||
}
|
||||
public void TrySelectPathNodeTreeNode(YndNode node)
|
||||
{
|
||||
TreeNode tnode = FindPathNodeTreeNode(node);
|
||||
@ -1195,6 +1379,16 @@ namespace CodeWalker.Project.Panels
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void UpdateArchetypeTreeNode(Archetype archetype)
|
||||
{
|
||||
var tn = FindArchetypeTreeNode(archetype);
|
||||
if (tn != null)
|
||||
{
|
||||
tn.Text = archetype._BaseArchetypeDef.ToString();
|
||||
}
|
||||
}
|
||||
public void UpdateCarGenTreeNode(YmapCarGen cargen)
|
||||
{
|
||||
var tn = FindCarGenTreeNode(cargen);
|
||||
@ -1266,6 +1460,7 @@ namespace CodeWalker.Project.Panels
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void RemoveEntityTreeNode(YmapEntityDef ent)
|
||||
{
|
||||
var tn = FindEntityTreeNode(ent);
|
||||
@ -1275,6 +1470,7 @@ namespace CodeWalker.Project.Panels
|
||||
tn.Parent.Nodes.Remove(tn);
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveCarGenTreeNode(YmapCarGen cargen)
|
||||
{
|
||||
var tn = FindCarGenTreeNode(cargen);
|
||||
@ -1294,6 +1490,28 @@ namespace CodeWalker.Project.Panels
|
||||
tn.Parent.Nodes.Remove(tn);
|
||||
}
|
||||
}
|
||||
public void RemoveArchetypeTreeNode(Archetype archetype)
|
||||
{
|
||||
var tn = FindArchetypeTreeNode(archetype);
|
||||
if ((tn != null) && (tn.Parent != null))
|
||||
{
|
||||
tn.Parent.Text = "Archetypes (" + archetype.Ytyp.AllArchetypes.Length.ToString() + ")";
|
||||
tn.Parent.Nodes.Remove(tn);
|
||||
}
|
||||
}
|
||||
public void RemoveMloEntityTreeNode(MCEntityDef ent)
|
||||
{
|
||||
var tn = FindMloEntityTreeNode(ent);
|
||||
if ((tn != null) && (tn.Parent != null))
|
||||
{
|
||||
var tnp = tn.Parent.Parent;
|
||||
MCMloRoomDef room = null;
|
||||
if (tnp != null) room = tnp.Tag as MCMloRoomDef;
|
||||
|
||||
tn.Parent.Text = "Attached Objects (" + (room?.AttachedObjects.Length - 1 ?? 0) + ")";
|
||||
tn.Parent.Nodes.Remove(tn);
|
||||
}
|
||||
}
|
||||
public void RemovePathNodeTreeNode(YndNode node)
|
||||
{
|
||||
var tn = FindPathNodeTreeNode(node);
|
||||
|
@ -59,10 +59,11 @@ namespace CodeWalker.Project
|
||||
Xml.AddChildWithInnerText(doc, ytypselem, "Item", ytypfilename);
|
||||
}
|
||||
|
||||
|
||||
var yndselem = Xml.AddChild(doc, projelem, "YndFilenames");
|
||||
foreach (string yndfilename in YndFilenames)
|
||||
{
|
||||
Xml.AddChildWithInnerText(doc, yndselem, "Item", yndfilename);
|
||||
Xml.AddChildWithInnerText(doc, ytypselem, "Item", yndfilename);
|
||||
}
|
||||
|
||||
var ynvselem = Xml.AddChild(doc, projelem, "YnvFilenames");
|
||||
|
37
Project/ProjectForm.Designer.cs
generated
37
Project/ProjectForm.Designer.cs
generated
@ -155,6 +155,8 @@
|
||||
this.ToolbarSaveButton = new System.Windows.Forms.ToolStripButton();
|
||||
this.ToolbarSaveAllButton = new System.Windows.Forms.ToolStripButton();
|
||||
this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
|
||||
this.YtypMloToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.YtypMloNewEntityToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.MainMenu.SuspendLayout();
|
||||
this.MainToolbar.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
@ -282,54 +284,54 @@
|
||||
// FileOpenProjectMenu
|
||||
//
|
||||
this.FileOpenProjectMenu.Name = "FileOpenProjectMenu";
|
||||
this.FileOpenProjectMenu.Size = new System.Drawing.Size(149, 22);
|
||||
this.FileOpenProjectMenu.Size = new System.Drawing.Size(152, 22);
|
||||
this.FileOpenProjectMenu.Text = "Project...";
|
||||
this.FileOpenProjectMenu.Click += new System.EventHandler(this.FileOpenProjectMenu_Click);
|
||||
//
|
||||
// toolStripSeparator9
|
||||
//
|
||||
this.toolStripSeparator9.Name = "toolStripSeparator9";
|
||||
this.toolStripSeparator9.Size = new System.Drawing.Size(146, 6);
|
||||
this.toolStripSeparator9.Size = new System.Drawing.Size(149, 6);
|
||||
//
|
||||
// FileOpenYmapMenu
|
||||
//
|
||||
this.FileOpenYmapMenu.Name = "FileOpenYmapMenu";
|
||||
this.FileOpenYmapMenu.Size = new System.Drawing.Size(149, 22);
|
||||
this.FileOpenYmapMenu.Size = new System.Drawing.Size(152, 22);
|
||||
this.FileOpenYmapMenu.Text = "Ymap File...";
|
||||
this.FileOpenYmapMenu.Click += new System.EventHandler(this.FileOpenYmapMenu_Click);
|
||||
//
|
||||
// FileOpenYtypMenu
|
||||
//
|
||||
this.FileOpenYtypMenu.Name = "FileOpenYtypMenu";
|
||||
this.FileOpenYtypMenu.Size = new System.Drawing.Size(149, 22);
|
||||
this.FileOpenYtypMenu.Size = new System.Drawing.Size(152, 22);
|
||||
this.FileOpenYtypMenu.Text = "Ytyp File...";
|
||||
this.FileOpenYtypMenu.Click += new System.EventHandler(this.FileOpenYtypMenu_Click);
|
||||
//
|
||||
// FileOpenYndMenu
|
||||
//
|
||||
this.FileOpenYndMenu.Name = "FileOpenYndMenu";
|
||||
this.FileOpenYndMenu.Size = new System.Drawing.Size(149, 22);
|
||||
this.FileOpenYndMenu.Size = new System.Drawing.Size(152, 22);
|
||||
this.FileOpenYndMenu.Text = "Ynd File...";
|
||||
this.FileOpenYndMenu.Click += new System.EventHandler(this.FileOpenYndMenu_Click);
|
||||
//
|
||||
// FileOpenYnvMenu
|
||||
//
|
||||
this.FileOpenYnvMenu.Name = "FileOpenYnvMenu";
|
||||
this.FileOpenYnvMenu.Size = new System.Drawing.Size(149, 22);
|
||||
this.FileOpenYnvMenu.Size = new System.Drawing.Size(152, 22);
|
||||
this.FileOpenYnvMenu.Text = "Ynv File...";
|
||||
this.FileOpenYnvMenu.Click += new System.EventHandler(this.FileOpenYnvMenu_Click);
|
||||
//
|
||||
// FileOpenTrainsMenu
|
||||
//
|
||||
this.FileOpenTrainsMenu.Name = "FileOpenTrainsMenu";
|
||||
this.FileOpenTrainsMenu.Size = new System.Drawing.Size(149, 22);
|
||||
this.FileOpenTrainsMenu.Size = new System.Drawing.Size(152, 22);
|
||||
this.FileOpenTrainsMenu.Text = "Trains File...";
|
||||
this.FileOpenTrainsMenu.Click += new System.EventHandler(this.FileOpenTrainsMenu_Click);
|
||||
//
|
||||
// FileOpenScenarioMenu
|
||||
//
|
||||
this.FileOpenScenarioMenu.Name = "FileOpenScenarioMenu";
|
||||
this.FileOpenScenarioMenu.Size = new System.Drawing.Size(149, 22);
|
||||
this.FileOpenScenarioMenu.Size = new System.Drawing.Size(152, 22);
|
||||
this.FileOpenScenarioMenu.Text = "Scenario File...";
|
||||
this.FileOpenScenarioMenu.Click += new System.EventHandler(this.FileOpenScenarioMenu_Click);
|
||||
//
|
||||
@ -594,6 +596,7 @@
|
||||
this.YtypNameMenu,
|
||||
this.toolStripSeparator13,
|
||||
this.YtypNewArchetypeMenu,
|
||||
this.YtypMloToolStripMenuItem,
|
||||
this.toolStripSeparator15,
|
||||
this.YtypAddToProjectMenu,
|
||||
this.YtypRemoveFromProjectMenu});
|
||||
@ -1174,6 +1177,22 @@
|
||||
this.toolStripSeparator5.Name = "toolStripSeparator5";
|
||||
this.toolStripSeparator5.Size = new System.Drawing.Size(6, 25);
|
||||
//
|
||||
// YtypMloToolStripMenuItem
|
||||
//
|
||||
this.YtypMloToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.YtypMloNewEntityToolStripMenuItem});
|
||||
this.YtypMloToolStripMenuItem.Enabled = false;
|
||||
this.YtypMloToolStripMenuItem.Name = "YtypMloToolStripMenuItem";
|
||||
this.YtypMloToolStripMenuItem.Size = new System.Drawing.Size(192, 22);
|
||||
this.YtypMloToolStripMenuItem.Text = "Mlo";
|
||||
//
|
||||
// YtypMloNewEntityToolStripMenuItem
|
||||
//
|
||||
this.YtypMloNewEntityToolStripMenuItem.Name = "YtypMloNewEntityToolStripMenuItem";
|
||||
this.YtypMloNewEntityToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
|
||||
this.YtypMloNewEntityToolStripMenuItem.Text = "New Entity";
|
||||
this.YtypMloNewEntityToolStripMenuItem.Click += new System.EventHandler(this.YtypMloNewEntityToolStripMenuItem_Click);
|
||||
//
|
||||
// ProjectForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
@ -1325,5 +1344,7 @@
|
||||
private System.Windows.Forms.ToolStripMenuItem ScenarioAddToProjectMenu;
|
||||
private System.Windows.Forms.ToolStripMenuItem ScenarioRemoveFromProjectMenu;
|
||||
private System.Windows.Forms.ToolStripMenuItem YmapNewGrassBatchMenu;
|
||||
private System.Windows.Forms.ToolStripMenuItem YtypMloToolStripMenuItem;
|
||||
private System.Windows.Forms.ToolStripMenuItem YtypMloNewEntityToolStripMenuItem;
|
||||
}
|
||||
}
|
@ -42,7 +42,9 @@ namespace CodeWalker.Project
|
||||
private YmapGrassInstanceBatch CurrentGrassBatch;
|
||||
|
||||
private YtypFile CurrentYtypFile;
|
||||
//private Archetype CurrentArchetype;
|
||||
private Archetype CurrentArchetype;
|
||||
private MCEntityDef CurrentMloEntity;
|
||||
private MCMloRoomDef CurrentMloRoom;
|
||||
|
||||
private YndFile CurrentYndFile;
|
||||
private YndNode CurrentPathNode;
|
||||
@ -76,6 +78,7 @@ namespace CodeWalker.Project
|
||||
private Dictionary<int, YnvFile> visibleynvs = new Dictionary<int, YnvFile>();
|
||||
private Dictionary<string, TrainTrack> visibletrains = new Dictionary<string, TrainTrack>();
|
||||
private Dictionary<string, YmtFile> visiblescenarios = new Dictionary<string, YmtFile>();
|
||||
private Dictionary<uint, YmapEntityDef> visiblemloentities = new Dictionary<uint, YmapEntityDef>();
|
||||
|
||||
private bool ShowProjectItemInProcess = false;
|
||||
|
||||
@ -352,6 +355,13 @@ namespace CodeWalker.Project
|
||||
(panel) => { panel.SetYtyp(CurrentYtypFile); }, //updateFunc
|
||||
(panel) => { return panel.Ytyp == CurrentYtypFile; }); //findFunc
|
||||
}
|
||||
private void ShowEditArchetypePanel(bool promote)
|
||||
{
|
||||
ShowPanel(promote,
|
||||
() => { return new EditYtypArchetypePanel(this); }, //createFunc
|
||||
(panel) => { panel.SetArchetype(CurrentArchetype); }, //updateFunc
|
||||
(panel) => { return panel.CurrentArchetype == CurrentArchetype; }); //findFunc
|
||||
}
|
||||
private void ShowEditYndPanel(bool promote)
|
||||
{
|
||||
ShowPanel(promote,
|
||||
@ -422,6 +432,13 @@ namespace CodeWalker.Project
|
||||
(panel) => { panel.SetScenarioNode(CurrentScenarioNode); }, //updateFunc
|
||||
(panel) => { return panel.CurrentScenarioNode == CurrentScenarioNode; }); //findFunc
|
||||
}
|
||||
private void ShowEditYtypArchetypeMloRoomPanel(bool promote)
|
||||
{
|
||||
ShowPanel(promote,
|
||||
() => { return new EditYtypArchetypeMloRoomPanel(this); }, //createFunc
|
||||
(panel) => { panel.SetRoom(CurrentMloRoom); }, //updateFunc
|
||||
(panel) => { return panel.CurrentRoom == CurrentMloRoom; }); //findFunc
|
||||
}
|
||||
private void ShowEditAudioFilePanel(bool promote) //TODO
|
||||
{
|
||||
}
|
||||
@ -440,10 +457,22 @@ namespace CodeWalker.Project
|
||||
|
||||
private void ShowCurrentProjectItem(bool promote)
|
||||
{
|
||||
if (CurrentEntity != null)
|
||||
if (CurrentMloEntity != null)
|
||||
{
|
||||
ShowEditYmapEntityPanel(promote);
|
||||
}
|
||||
else if (CurrentMloRoom != null)
|
||||
{
|
||||
ShowEditYtypArchetypeMloRoomPanel(promote);
|
||||
}
|
||||
else if (CurrentEntity != null)
|
||||
{
|
||||
ShowEditYmapEntityPanel(promote);
|
||||
}
|
||||
else if (CurrentArchetype != null)
|
||||
{
|
||||
ShowEditArchetypePanel(promote);
|
||||
}
|
||||
else if (CurrentCarGen != null)
|
||||
{
|
||||
ShowEditYmapCarGenPanel(promote);
|
||||
@ -456,7 +485,7 @@ namespace CodeWalker.Project
|
||||
{
|
||||
ShowEditYmapPanel(promote);
|
||||
}
|
||||
if (CurrentYtypFile != null)
|
||||
else if (CurrentYtypFile != null)
|
||||
{
|
||||
ShowEditYtypPanel(promote);
|
||||
}
|
||||
@ -542,10 +571,12 @@ namespace CodeWalker.Project
|
||||
public void SetProjectItem(object item)
|
||||
{
|
||||
CurrentYmapFile = item as YmapFile;
|
||||
CurrentMloEntity = item as MCEntityDef;
|
||||
CurrentEntity = item as YmapEntityDef;
|
||||
CurrentCarGen = item as YmapCarGen;
|
||||
CurrentGrassBatch = item as YmapGrassInstanceBatch;
|
||||
CurrentYtypFile = item as YtypFile;
|
||||
CurrentArchetype = item as Archetype;
|
||||
CurrentYndFile = item as YndFile;
|
||||
CurrentPathNode = item as YndNode;
|
||||
CurrentYnvFile = item as YnvFile;
|
||||
@ -562,10 +593,33 @@ namespace CodeWalker.Project
|
||||
CurrentAudioEmitter = item as AudioPlacement; if (CurrentAudioEmitter?.AudioEmitter == null) CurrentAudioEmitter = null;
|
||||
CurrentAudioZoneList = item as Dat151AmbientZoneList;
|
||||
CurrentAudioEmitterList = item as Dat151AmbientEmitterList;
|
||||
CurrentMloRoom = item as MCMloRoomDef;
|
||||
|
||||
if (CurrentEntity != null)
|
||||
if (CurrentMloEntity != null)
|
||||
{
|
||||
CurrentYmapFile = CurrentEntity.Ymap;
|
||||
MloInstanceData instance = TryGetMloInstance(CurrentMloEntity.Archetype);
|
||||
|
||||
if (instance != null)
|
||||
{
|
||||
CurrentEntity = instance.TryGetYmapEntity(CurrentMloEntity);
|
||||
|
||||
CurrentYmapFile = instance.Owner?.Ymap;
|
||||
}
|
||||
|
||||
CurrentArchetype = CurrentEntity?.MloParent?.Archetype;
|
||||
}
|
||||
else if (CurrentEntity != null)
|
||||
{
|
||||
if (CurrentEntity.MloParent != null)
|
||||
{
|
||||
CurrentArchetype = CurrentEntity?.MloParent?.Archetype;
|
||||
}
|
||||
else
|
||||
{
|
||||
CurrentArchetype = CurrentEntity.Archetype;
|
||||
|
||||
CurrentYmapFile = CurrentEntity.Ymap;
|
||||
}
|
||||
}
|
||||
else if (CurrentCarGen != null)
|
||||
{
|
||||
@ -575,6 +629,10 @@ namespace CodeWalker.Project
|
||||
{
|
||||
CurrentYmapFile = CurrentGrassBatch.Ymap;
|
||||
}
|
||||
if (CurrentArchetype != null)
|
||||
{
|
||||
CurrentYtypFile = CurrentEntity?.MloParent?.Archetype?.Ytyp ?? CurrentArchetype?.Ytyp;
|
||||
}
|
||||
if (CurrentPathNode != null)
|
||||
{
|
||||
CurrentYndFile = CurrentPathNode.Ynd;
|
||||
@ -1372,30 +1430,56 @@ namespace CodeWalker.Project
|
||||
}
|
||||
public void AddEntityToProject()
|
||||
{
|
||||
if (CurrentEntity == null) return;
|
||||
|
||||
if (CurrentEntity.Ymap == null)
|
||||
try
|
||||
{
|
||||
MessageBox.Show("Sorry, interior entities cannot currently be added to the project.");
|
||||
return;
|
||||
}
|
||||
if (CurrentEntity == null) return;
|
||||
if (CurrentEntity.Ymap == null)
|
||||
{
|
||||
CurrentYtypFile = CurrentEntity.MloParent?.Archetype?.Ytyp;
|
||||
|
||||
CurrentYmapFile = CurrentEntity.Ymap;
|
||||
if (!YmapExistsInProject(CurrentYmapFile))
|
||||
{
|
||||
var ent = CurrentEntity;
|
||||
CurrentYmapFile.HasChanged = true;
|
||||
AddYmapToProject(CurrentYmapFile);
|
||||
if (!YtypExistsInProject(CurrentYtypFile))
|
||||
{
|
||||
if (CurrentEntity.MloParent?.MloInstance != null)
|
||||
{
|
||||
var inst = CurrentEntity.MloParent.MloInstance;
|
||||
var mcEntity = inst.TryGetArchetypeEntity(CurrentEntity);
|
||||
if (mcEntity != null)
|
||||
{
|
||||
YmapEntityDef ent = CurrentEntity;
|
||||
CurrentYtypFile.HasChanged = true;
|
||||
AddYtypToProject(CurrentYtypFile);
|
||||
CurrentEntity = ent;
|
||||
CurrentYtypFile = ent.MloParent.Archetype.Ytyp;
|
||||
ProjectExplorer?.TrySelectMloEntityTreeNode(mcEntity);
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
CurrentEntity = ent; //bug fix for some reason the treeview selects the project node here.
|
||||
CurrentYmapFile = ent.Ymap;
|
||||
ProjectExplorer?.TrySelectEntityTreeNode(ent);
|
||||
CurrentYmapFile = CurrentEntity.Ymap;
|
||||
if (!YmapExistsInProject(CurrentYmapFile))
|
||||
{
|
||||
YmapEntityDef ent = CurrentEntity;
|
||||
CurrentYmapFile.HasChanged = true;
|
||||
AddYmapToProject(CurrentYmapFile);
|
||||
|
||||
CurrentEntity = ent; //bug fix for some reason the treeview selects the project node here.
|
||||
CurrentYmapFile = ent.Ymap;
|
||||
ProjectExplorer?.TrySelectEntityTreeNode(ent);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
public bool DeleteEntity()
|
||||
{
|
||||
if (CurrentYmapFile == null) return false;
|
||||
if (CurrentEntity == null) return false;
|
||||
return CurrentYmapFile != null ? DeleteYmapEntity() : DeleteMloArchetypeEntity();
|
||||
}
|
||||
|
||||
private bool DeleteYmapEntity()
|
||||
{
|
||||
if (CurrentEntity.Ymap != CurrentYmapFile) return false;
|
||||
if (CurrentYmapFile.AllEntities == null) return false; //nothing to delete..
|
||||
if (CurrentYmapFile.RootEntities == null) return false; //nothing to delete..
|
||||
@ -1932,8 +2016,73 @@ namespace CodeWalker.Project
|
||||
|
||||
}
|
||||
}
|
||||
public void SaveYtyp(bool saveas = false) //TODO!
|
||||
public void SaveYtyp(bool saveas = false)
|
||||
{
|
||||
if (CurrentYtypFile == null) return;
|
||||
string ytypname = CurrentYtypFile.Name;
|
||||
string filepath = CurrentYtypFile.FilePath;
|
||||
if (string.IsNullOrEmpty(filepath))
|
||||
{
|
||||
filepath = ytypname;
|
||||
}
|
||||
string origfile = filepath;
|
||||
if (!File.Exists(filepath))
|
||||
{
|
||||
saveas = true;
|
||||
}
|
||||
|
||||
|
||||
byte[] data;
|
||||
lock (projectsyncroot) //need to sync writes to ytyp objects...
|
||||
{
|
||||
saveas = saveas || string.IsNullOrEmpty(filepath);
|
||||
if (saveas)
|
||||
{
|
||||
filepath = ShowSaveDialog("Ytyp files|*.ytyp", filepath);
|
||||
if (string.IsNullOrEmpty(filepath))
|
||||
{ return; }
|
||||
|
||||
string newname = Path.GetFileNameWithoutExtension(filepath);
|
||||
JenkIndex.Ensure(newname);
|
||||
CurrentYtypFile.FilePath = filepath;
|
||||
CurrentYtypFile.RpfFileEntry.Name = new FileInfo(filepath).Name;
|
||||
CurrentYtypFile.Name = CurrentYtypFile.RpfFileEntry.Name;
|
||||
CurrentYtypFile._CMapTypes.name = new MetaHash(JenkHash.GenHash(newname));
|
||||
}
|
||||
|
||||
data = CurrentYtypFile.Save();
|
||||
}
|
||||
|
||||
|
||||
if (data != null)
|
||||
{
|
||||
File.WriteAllBytes(filepath, data);
|
||||
}
|
||||
|
||||
SetYtypHasChanged(false);
|
||||
|
||||
if (saveas)
|
||||
{
|
||||
if (CurrentProjectFile != null)
|
||||
{
|
||||
string origpath = CurrentProjectFile.GetRelativePath(origfile);
|
||||
string newpath = CurrentProjectFile.GetRelativePath(CurrentYtypFile.FilePath);
|
||||
|
||||
if (!CurrentProjectFile.RenameYtyp(origpath, newpath))
|
||||
{ //couldn't rename it in the project?
|
||||
MessageBox.Show("Couldn't rename ytyp in project! This shouldn't happen - check the project file XML.");
|
||||
}
|
||||
}
|
||||
SetProjectHasChanged(true);
|
||||
SetCurrentSaveItem();
|
||||
}
|
||||
|
||||
if (CurrentYtypFile.SaveWarnings != null)
|
||||
{
|
||||
string w = string.Join("\n", CurrentYtypFile.SaveWarnings);
|
||||
MessageBox.Show(CurrentYtypFile.SaveWarnings.Count.ToString() + " warnings were generated while saving the ytyp:\n" + w);
|
||||
CurrentYtypFile.SaveWarnings = null;//clear it out for next time..
|
||||
}
|
||||
}
|
||||
public void AddYtypToProject(YtypFile ytyp)
|
||||
{
|
||||
@ -1968,6 +2117,241 @@ namespace CodeWalker.Project
|
||||
return CurrentProjectFile.ContainsYtyp(ytyp);
|
||||
}
|
||||
|
||||
public void NewArchetype(Archetype copy = null, bool copyPosition = false)
|
||||
{
|
||||
if (CurrentYtypFile == null) return;
|
||||
var archetype = CurrentYtypFile.AddArchetype();
|
||||
var archetypeDef = archetype._BaseArchetypeDef;
|
||||
if (copy == null)
|
||||
{
|
||||
copy = CurrentArchetype;
|
||||
archetype._BaseArchetypeDef.name = JenkHash.GenHash("prop_alien_egg_01");
|
||||
}
|
||||
if (copy != null)
|
||||
{
|
||||
archetype.Init(CurrentYtypFile, ref copy._BaseArchetypeDef);
|
||||
}
|
||||
archetype._BaseArchetypeDef = archetypeDef;
|
||||
|
||||
LoadProjectTree();
|
||||
ProjectExplorer?.TrySelectArchetypeTreeNode(archetype);
|
||||
CurrentArchetype = archetype;
|
||||
}
|
||||
public void NewMloEntity(YmapEntityDef copy = null, bool copyTransform = false)
|
||||
{
|
||||
if ((CurrentArchetype == null) || !(CurrentArchetype is MloArchetype mloArch))
|
||||
{
|
||||
var arch = CurrentEntity?.MloParent.Archetype ?? CurrentMloRoom?.Archetype;
|
||||
if (arch == null)
|
||||
return;
|
||||
|
||||
mloArch = arch as MloArchetype;
|
||||
if (mloArch == null)
|
||||
return;
|
||||
|
||||
CurrentArchetype = mloArch;
|
||||
}
|
||||
|
||||
if (CurrentMloRoom == null) CurrentMloRoom = mloArch?.GetEntityRoom(CurrentMloEntity);
|
||||
if (CurrentMloRoom == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
MloInstanceData mloInstance = TryGetMloInstance(mloArch);
|
||||
if (mloInstance == null) return;
|
||||
|
||||
if (mloArch.rooms.Length <= 0)
|
||||
{
|
||||
MessageBox.Show($@"Mlo {mloArch.Name} has no rooms! Cannot create entity.");
|
||||
return;
|
||||
}
|
||||
|
||||
int roomIndex = CurrentMloRoom.Index;
|
||||
if (roomIndex < 0)
|
||||
{
|
||||
MessageBox.Show(@"Invalid room index.");
|
||||
return;
|
||||
}
|
||||
if (roomIndex >= mloArch.rooms.Length)
|
||||
{
|
||||
MessageBox.Show(
|
||||
$@"Room at index {roomIndex} does not exist in {mloArch.Name}! {mloArch.Name} only has {
|
||||
mloArch.rooms.Length
|
||||
} rooms.");
|
||||
return;
|
||||
}
|
||||
|
||||
float spawndist = 5.0f; //use archetype BSradius if starting with a copy...
|
||||
if (copy != null)
|
||||
{
|
||||
spawndist = copy.BSRadius * 2.5f;
|
||||
}
|
||||
|
||||
bool cp = copyTransform && (copy != null);
|
||||
Vector3 pos = cp ? copy.CEntityDef.position : GetSpawnPosRel(spawndist, mloInstance.Owner.Position, mloInstance.Owner.Orientation);
|
||||
Quaternion rot = cp ? copy.CEntityDef.rotation.ToQuaternion() : Quaternion.Identity;
|
||||
|
||||
|
||||
CEntityDef cent = new CEntityDef();
|
||||
|
||||
if (copy != null)
|
||||
{
|
||||
cent = copy.CEntityDef;
|
||||
//TODO: copy entity extensions!
|
||||
}
|
||||
else
|
||||
{
|
||||
cent.archetypeName = new MetaHash(JenkHash.GenHash("prop_alien_egg_01"));
|
||||
cent.rotation = new Vector4(0, 0, 0, 1);
|
||||
cent.scaleXY = 1.0f;
|
||||
cent.scaleZ = 1.0f;
|
||||
cent.flags = 1572872;
|
||||
cent.parentIndex = -1;
|
||||
cent.lodDist = 200.0f;
|
||||
cent.lodLevel = Unk_1264241711.LODTYPES_DEPTH_ORPHANHD;
|
||||
cent.priorityLevel = Unk_648413703.PRI_REQUIRED;
|
||||
cent.ambientOcclusionMultiplier = 255;
|
||||
cent.artificialAmbientOcclusion = 255;
|
||||
}
|
||||
|
||||
cent.position = pos;
|
||||
cent.rotation = rot.ToVector4();
|
||||
|
||||
var createindex = mloArch.entities.Length;
|
||||
MCEntityDef ment = new MCEntityDef(ref cent, mloArch);
|
||||
|
||||
YmapEntityDef outEnt;
|
||||
try
|
||||
{
|
||||
if (WorldForm != null)
|
||||
{
|
||||
lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering...
|
||||
{
|
||||
// Add the entity to the mlo instance and archetype.
|
||||
outEnt = mloInstance.CreateYmapEntity(mloInstance.Owner, ment, createindex);
|
||||
mloArch.AddEntity(outEnt, roomIndex);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
outEnt = mloInstance.CreateYmapEntity(mloInstance.Owner, ment, createindex);
|
||||
mloArch.AddEntity(outEnt, roomIndex);
|
||||
}
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
MessageBox.Show(this, e.Message, "Create MLO Entity Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
mloInstance.AddEntity(outEnt);
|
||||
outEnt.SetArchetype(GameFileCache.GetArchetype(cent.archetypeName));
|
||||
|
||||
LoadProjectTree();
|
||||
ProjectExplorer?.TrySelectMloEntityTreeNode(mloInstance.TryGetArchetypeEntity(outEnt));
|
||||
CurrentEntity = outEnt;
|
||||
CurrentYtypFile = CurrentEntity.MloParent?.Archetype?.Ytyp;
|
||||
}
|
||||
private bool DeleteMloArchetypeEntity()
|
||||
{
|
||||
if (CurrentEntity?.MloParent?.Archetype?.Ytyp == null) return false;
|
||||
if (CurrentEntity.MloParent.Archetype.Ytyp != CurrentYtypFile) return false;
|
||||
if (!(CurrentEntity.MloParent.Archetype is MloArchetype mloArchetype)) return false;
|
||||
if (mloArchetype.entities == null) return false; //nothing to delete..
|
||||
//if (mloArchetype.InstancedEntities == null) return false; //nothing to delete..
|
||||
|
||||
if (CurrentEntity._CEntityDef.numChildren != 0)
|
||||
{
|
||||
MessageBox.Show("This entity's numChildren is not 0 - deleting entities with children is not currently supported by CodeWalker.");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (MessageBox.Show("Are you sure you want to delete this entity?\n" + CurrentEntity._CEntityDef.archetypeName.ToString() + "\n" + CurrentEntity.Position.ToString() + "\n\nThis operation cannot be undone. Continue?", "Confirm delete", MessageBoxButtons.YesNo) != DialogResult.Yes)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
MloInstanceData mloInstance = CurrentEntity.MloParent.MloInstance;
|
||||
if (mloInstance == null) return false;
|
||||
|
||||
var ent = CurrentEntity;
|
||||
var mcEnt = mloInstance.TryGetArchetypeEntity(ent);
|
||||
ProjectExplorer?.RemoveMloEntityTreeNode(mcEnt);
|
||||
|
||||
try
|
||||
{
|
||||
if (WorldForm != null)
|
||||
{
|
||||
lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering...
|
||||
{
|
||||
mloInstance.DeleteEntity(ent);
|
||||
//WorldForm.SelectItem(null, null, null);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mloInstance.DeleteEntity(ent);
|
||||
}
|
||||
}
|
||||
catch (Exception e) // various failures could happen so we'll use a trycatch for when an exception is thrown.
|
||||
{
|
||||
MessageBox.Show(this, "Cannot delete entity: " + Environment.NewLine + e.Message);
|
||||
return false;
|
||||
}
|
||||
|
||||
var delent = ent;
|
||||
var delytyp = delent.MloParent.Archetype.Ytyp;
|
||||
|
||||
ProjectExplorer?.SetYtypHasChanged(delytyp, true);
|
||||
|
||||
ClosePanel((EditYmapEntityPanel p) => { return p.Tag == delent; });
|
||||
CurrentEntity = null;
|
||||
WorldForm.SelectItem(null);
|
||||
|
||||
return true;
|
||||
}
|
||||
public bool DeleteArchetype()
|
||||
{
|
||||
if (CurrentArchetype == null) return false;
|
||||
if (CurrentArchetype.Ytyp != CurrentYtypFile) return false;
|
||||
|
||||
if (MessageBox.Show("Are you sure you want to delete this archetype?\n" + CurrentArchetype._BaseArchetypeDef.name.ToString() + "\n\nThis operation cannot be undone. Continue?", "Confirm delete", MessageBoxButtons.YesNo) != DialogResult.Yes)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool res = false;
|
||||
if (WorldForm != null)
|
||||
{
|
||||
lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering...
|
||||
{
|
||||
res = CurrentArchetype.Ytyp.RemoveArchetype(CurrentArchetype);
|
||||
//WorldForm.SelectItem(null, null, null);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
res = CurrentArchetype.Ytyp.RemoveArchetype(CurrentArchetype);
|
||||
}
|
||||
if (!res)
|
||||
{
|
||||
MessageBox.Show("Archetype couldn't be removed!");
|
||||
return false;
|
||||
}
|
||||
|
||||
var delarch = CurrentArchetype;
|
||||
var delytyp = delarch.Ytyp;
|
||||
|
||||
ProjectExplorer?.RemoveArchetypeTreeNode(delarch);
|
||||
ProjectExplorer?.SetYtypHasChanged(delytyp, true);
|
||||
|
||||
ClosePanel((EditYtypArchetypePanel p) => { return p.Tag == delarch; });
|
||||
|
||||
CurrentArchetype = null;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void NewYnd()
|
||||
{
|
||||
@ -3998,6 +4382,18 @@ namespace CodeWalker.Project
|
||||
ymaps[isnew ? JenkHash.GenHash(ymap.Name) : ymap.RpfFileEntry.ShortNameHash] = ymap;
|
||||
}
|
||||
}
|
||||
|
||||
visiblemloentities.Clear();
|
||||
foreach (var kvp in ymaps)
|
||||
{
|
||||
var ymap = kvp.Value;
|
||||
if (ymap.MloEntities == null) continue;
|
||||
foreach (var mloDef in ymap.MloEntities)
|
||||
{
|
||||
if (mloDef.Archetype == null) continue; // archetype was changed from an mlo to a regular archetype
|
||||
visiblemloentities[mloDef.Archetype._BaseArchetypeDef.name] = mloDef;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4158,6 +4554,18 @@ namespace CodeWalker.Project
|
||||
|
||||
}
|
||||
|
||||
public MloInstanceData TryGetMloInstance(MloArchetype arch)
|
||||
{
|
||||
lock (projectsyncroot)
|
||||
{
|
||||
if (arch == null) return null;
|
||||
MetaHash name = arch._BaseArchetypeDef.name;
|
||||
if (name == 0) return null;
|
||||
if (!visiblemloentities.ContainsKey(name)) return null;
|
||||
return visiblemloentities[name]?.MloInstance;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void OnWorldSelectionChanged(MapSelection sel)
|
||||
{
|
||||
@ -4169,6 +4577,8 @@ namespace CodeWalker.Project
|
||||
}
|
||||
else
|
||||
{
|
||||
var mlo = sel.MloEntityDef;
|
||||
var room = sel.MloRoomDef;
|
||||
var ent = sel.EntityDef;
|
||||
var cargen = sel.CarGenerator;
|
||||
var grassbatch = sel.GrassBatch;
|
||||
@ -4181,7 +4591,9 @@ namespace CodeWalker.Project
|
||||
var scenariond = sel.ScenarioNode;
|
||||
var scenarioedge = sel.ScenarioEdge;
|
||||
var audiopl = sel.Audio;
|
||||
YmapFile ymap = ent?.Ymap ?? cargen?.Ymap ?? grassbatch?.Ymap;
|
||||
Archetype arch = mlo?.Archetype ?? ent?.MloParent?.Archetype ?? ent?.Archetype;
|
||||
YtypFile ytyp = mlo?.Archetype?.Ytyp ?? ent?.MloParent?.Archetype?.Ytyp ?? ent?.Archetype?.Ytyp ?? room?.Archetype?.Ytyp;
|
||||
YmapFile ymap = ent?.Ymap ?? cargen?.Ymap ?? grassbatch?.Ymap ?? mlo?.Ymap;
|
||||
YndFile ynd = pathnode?.Ynd;
|
||||
YnvFile ynv = navpoly?.Ynv ?? navpoint?.Ynv ?? navportal?.Ynv;
|
||||
TrainTrack traintrack = trainnode?.Track;
|
||||
@ -4205,6 +4617,26 @@ namespace CodeWalker.Project
|
||||
}
|
||||
|
||||
}
|
||||
else if (YtypExistsInProject(ytyp))
|
||||
{
|
||||
if (arch != CurrentArchetype)
|
||||
{
|
||||
ProjectExplorer?.TrySelectArchetypeTreeNode(mlo?.Archetype);
|
||||
}
|
||||
if (ent != CurrentEntity)
|
||||
{
|
||||
MloInstanceData mloInstance = ent.MloParent?.MloInstance;
|
||||
if (mloInstance != null)
|
||||
{
|
||||
MCEntityDef entityDef = mloInstance.TryGetArchetypeEntity(ent);
|
||||
ProjectExplorer?.TrySelectMloEntityTreeNode(entityDef);
|
||||
}
|
||||
}
|
||||
if (room != CurrentMloRoom)
|
||||
{
|
||||
ProjectExplorer?.TrySelectMloRoomTreeNode(room);
|
||||
}
|
||||
}
|
||||
else if (YndExistsInProject(ynd))
|
||||
{
|
||||
if (pathnode != CurrentPathNode)
|
||||
@ -4259,9 +4691,11 @@ namespace CodeWalker.Project
|
||||
showcurrent = true;
|
||||
}
|
||||
|
||||
CurrentMloRoom = room;
|
||||
CurrentYmapFile = ymap;
|
||||
CurrentYtypFile = null;//TODO: interiors!
|
||||
CurrentEntity = ent;
|
||||
CurrentYtypFile = ytyp;
|
||||
CurrentArchetype = arch;
|
||||
CurrentEntity = ent ?? mlo;
|
||||
CurrentCarGen = cargen;
|
||||
CurrentGrassBatch = grassbatch;
|
||||
CurrentYndFile = ynd;
|
||||
@ -4335,7 +4769,6 @@ namespace CodeWalker.Project
|
||||
OnWorldAudioPlacementModified(sel.Audio);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnWorldEntityModified(YmapEntityDef ent)
|
||||
{
|
||||
try
|
||||
@ -4346,7 +4779,7 @@ namespace CodeWalker.Project
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((ent.Ymap == null) || (ent.MloParent != null))
|
||||
if ((ent.Ymap == null) && (ent.MloParent == null))
|
||||
{
|
||||
return;//TODO: properly handle interior entities!
|
||||
}
|
||||
@ -4356,26 +4789,62 @@ namespace CodeWalker.Project
|
||||
NewProject();
|
||||
}
|
||||
|
||||
if (!YmapExistsInProject(ent.Ymap))
|
||||
if (ent.MloParent == null && ent.Ymap != null)
|
||||
{
|
||||
ent.Ymap.HasChanged = true;
|
||||
AddYmapToProject(ent.Ymap);
|
||||
ProjectExplorer?.TrySelectEntityTreeNode(ent);
|
||||
}
|
||||
|
||||
if (ent != CurrentEntity)
|
||||
{
|
||||
CurrentEntity = ent;
|
||||
ProjectExplorer?.TrySelectEntityTreeNode(ent);
|
||||
}
|
||||
|
||||
if (ent == CurrentEntity)
|
||||
{
|
||||
ShowEditYmapEntityPanel(false);
|
||||
|
||||
if (ent.Ymap != null)
|
||||
if (!YmapExistsInProject(ent.Ymap))
|
||||
{
|
||||
SetYmapHasChanged(true);
|
||||
ent.Ymap.HasChanged = true;
|
||||
AddYmapToProject(ent.Ymap);
|
||||
ProjectExplorer?.TrySelectEntityTreeNode(ent);
|
||||
}
|
||||
|
||||
if (ent != CurrentEntity)
|
||||
{
|
||||
CurrentEntity = ent;
|
||||
ProjectExplorer?.TrySelectEntityTreeNode(ent);
|
||||
}
|
||||
|
||||
if (ent == CurrentEntity)
|
||||
{
|
||||
ShowEditYmapEntityPanel(false);
|
||||
|
||||
if (ent.Ymap != null)
|
||||
{
|
||||
SetYmapHasChanged(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (ent.MloParent != null && ent.Ymap == null)
|
||||
{
|
||||
MloInstanceData mloInstance = ent.MloParent?.MloInstance;
|
||||
if (mloInstance != null)
|
||||
{
|
||||
var mcEntity = mloInstance.TryGetArchetypeEntity(ent);
|
||||
if (mcEntity != null)
|
||||
{
|
||||
if (!YtypExistsInProject(ent.MloParent.Archetype.Ytyp))
|
||||
{
|
||||
ent.MloParent.Archetype.Ytyp.HasChanged = true;
|
||||
AddYtypToProject(ent.MloParent.Archetype.Ytyp);
|
||||
ProjectExplorer?.TrySelectMloEntityTreeNode(mcEntity);
|
||||
}
|
||||
|
||||
if (ent != CurrentEntity)
|
||||
{
|
||||
CurrentEntity = ent;
|
||||
ProjectExplorer?.TrySelectMloEntityTreeNode(mcEntity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ent == CurrentEntity)
|
||||
{
|
||||
ShowEditYmapEntityPanel(false);
|
||||
|
||||
if (ent.MloParent.Archetype.Ytyp != null)
|
||||
{
|
||||
SetYtypHasChanged(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4909,6 +5378,23 @@ namespace CodeWalker.Project
|
||||
return pos;
|
||||
}
|
||||
|
||||
public Vector3 GetSpawnPosRel(float dist, Vector3 relPos, Quaternion relRot)
|
||||
{
|
||||
Vector3 pos = Vector3.Zero;
|
||||
if (WorldForm != null)
|
||||
{
|
||||
Vector3 campos = WorldForm.GetCameraPosition();
|
||||
Vector3 camdir = WorldForm.GetCameraViewDir();
|
||||
pos = campos + camdir * dist;
|
||||
|
||||
Quaternion rot = Quaternion.Invert(relRot);
|
||||
Vector3 delta = pos - relPos;
|
||||
Vector3 relativePos = rot.Multiply(delta);
|
||||
pos = relativePos;
|
||||
}
|
||||
return pos;
|
||||
}
|
||||
|
||||
public RpfFileEntry FindParentYmapEntry(uint hash)
|
||||
{
|
||||
if (CurrentProjectFile != null)
|
||||
@ -4944,7 +5430,7 @@ namespace CodeWalker.Project
|
||||
|
||||
ymap.Load(data);
|
||||
|
||||
GameFileCache.InitYmapEntityArchetypes(ymap); //this needs to be done after calling YmapFile.Load()
|
||||
ymap.InitYmapEntityArchetypes(GameFileCache); //this needs to be done after calling YmapFile.Load()
|
||||
}
|
||||
private void LoadYtypFromFile(YtypFile ytyp, string filename)
|
||||
{
|
||||
@ -5117,8 +5603,11 @@ namespace CodeWalker.Project
|
||||
{
|
||||
bool enable = (CurrentYtypFile != null);
|
||||
bool inproj = YtypExistsInProject(CurrentYtypFile);
|
||||
bool ismlo = ((CurrentEntity != null) && (CurrentEntity.MloParent != null) || (CurrentMloRoom != null)) || (CurrentArchetype is MloArchetype);
|
||||
|
||||
YtypNewArchetypeMenu.Enabled = enable && inproj;
|
||||
YtypMloToolStripMenuItem.Enabled = enable && inproj && ismlo;
|
||||
YtypMloNewEntityToolStripMenuItem.Enabled = YtypMloToolStripMenuItem.Enabled;
|
||||
|
||||
if (CurrentYtypFile != null)
|
||||
{
|
||||
@ -5516,10 +6005,6 @@ namespace CodeWalker.Project
|
||||
RemoveYmapFromProject();
|
||||
}
|
||||
|
||||
private void YtypNewArchetypeMenu_Click(object sender, EventArgs e)
|
||||
{
|
||||
//NewArchetype();
|
||||
}
|
||||
private void YtypAddToProjectMenu_Click(object sender, EventArgs e)
|
||||
{
|
||||
AddYtypToProject(CurrentYtypFile);
|
||||
@ -5528,6 +6013,14 @@ namespace CodeWalker.Project
|
||||
{
|
||||
RemoveYtypFromProject();
|
||||
}
|
||||
private void YtypNewArchetypeMenu_Click(object sender, EventArgs e)
|
||||
{
|
||||
NewArchetype();
|
||||
}
|
||||
private void YtypMloNewEntityToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
NewMloEntity();
|
||||
}
|
||||
|
||||
private void YndNewNodeMenu_Click(object sender, EventArgs e)
|
||||
{
|
||||
|
@ -1262,7 +1262,7 @@ namespace CodeWalker
|
||||
|
||||
ymap.Load(data);
|
||||
|
||||
GameFileCache.InitYmapEntityArchetypes(ymap); //this needs to be done after calling YmapFile.Load()
|
||||
ymap.InitYmapEntityArchetypes(GameFileCache); //this needs to be done after calling YmapFile.Load()
|
||||
}
|
||||
|
||||
private void LoadYmapTreeNodes(YmapFile ymap, TreeNode node)
|
||||
@ -1282,7 +1282,7 @@ namespace CodeWalker
|
||||
for (int i = 0; i < ents.Length; i++)
|
||||
{
|
||||
var ent = ents[i];
|
||||
var edef = ent.CEntityDef;
|
||||
var edef = ent._CEntityDef;
|
||||
var enode = entsnode.Nodes.Add(edef.archetypeName.ToString());
|
||||
enode.Tag = ent;
|
||||
}
|
||||
@ -7542,7 +7542,7 @@ namespace CodeWalker
|
||||
if (CurrentEntity._CEntityDef.rotation != v)
|
||||
{
|
||||
Quaternion q = new Quaternion(v);
|
||||
CurrentEntity.SetOrientationInv(q);
|
||||
CurrentEntity.SetOrientation(q, true);
|
||||
SetYmapHasChanged(true);
|
||||
if (WorldForm != null)
|
||||
{
|
||||
|
@ -1745,24 +1745,55 @@ namespace CodeWalker.Rendering
|
||||
|
||||
if (renderinteriors && ent.IsMlo) //render Mlo child entities...
|
||||
{
|
||||
if ((ent.MloInstance != null) && (ent.MloInstance.Entities != null))
|
||||
if ((ent.MloInstance != null))
|
||||
{
|
||||
for (int j = 0; j < ent.MloInstance.Entities.Length; j++)
|
||||
if (ent.MloInstance.Entities != null)
|
||||
{
|
||||
var intent = ent.MloInstance.Entities[j];
|
||||
if (intent.Archetype == null) continue; //missing archetype...
|
||||
if (!RenderIsEntityFinalRender(intent)) continue; //proxy or something..
|
||||
|
||||
intent.IsVisible = true;
|
||||
|
||||
var iebscent = intent.Position + intent.BSCenter - camera.Position;
|
||||
float iebsrad = intent.BSRadius;
|
||||
if (!camera.ViewFrustum.ContainsSphereNoClipNoOpt(ref iebscent, iebsrad))
|
||||
for (int j = 0; j < ent.MloInstance.Entities.Length; j++)
|
||||
{
|
||||
continue; //frustum cull interior ents
|
||||
}
|
||||
var intent = ent.MloInstance.Entities[j];
|
||||
if (intent.Archetype == null) continue; //missing archetype...
|
||||
if (!RenderIsEntityFinalRender(intent)) continue; //proxy or something..
|
||||
|
||||
renderworldentities.Add(intent);
|
||||
intent.IsVisible = true;
|
||||
|
||||
var iebscent = intent.Position + intent.BSCenter - camera.Position;
|
||||
float iebsrad = intent.BSRadius;
|
||||
if (!camera.ViewFrustum.ContainsSphereNoClipNoOpt(ref iebscent, iebsrad))
|
||||
{
|
||||
continue; //frustum cull interior ents
|
||||
}
|
||||
|
||||
renderworldentities.Add(intent);
|
||||
}
|
||||
}
|
||||
if (ent.MloInstance.EntitySets != null)
|
||||
{
|
||||
foreach (var entitysets in ent.MloInstance.EntitySets)
|
||||
{
|
||||
var entityset = entitysets.Value;
|
||||
if (!entityset.Visible) continue;
|
||||
|
||||
var entities = entityset.Entities;
|
||||
for (int i = 0; i < entities.Count; i++)
|
||||
{
|
||||
var intent = entities[i];
|
||||
if (intent.Archetype == null) continue; //missing archetype...
|
||||
if (!RenderIsEntityFinalRender(intent)) continue; //proxy or something..
|
||||
|
||||
intent.IsVisible = true;
|
||||
|
||||
var iebscent = intent.Position + intent.BSCenter - camera.Position;
|
||||
float iebsrad = intent.BSRadius;
|
||||
if (!camera.ViewFrustum.ContainsSphereNoClipNoOpt(ref iebscent, iebsrad))
|
||||
{
|
||||
continue; //frustum cull interior ents
|
||||
}
|
||||
|
||||
renderworldentities.Add(intent);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -182,6 +182,7 @@ namespace CodeWalker
|
||||
public YmapGrassInstanceBatch GrassBatch { get; set; }
|
||||
public YmapDistantLODLights DistantLodLights { get; set; }
|
||||
public YmapEntityDef MloEntityDef { get; set; }
|
||||
public MCMloRoomDef MloRoomDef { get; set; }
|
||||
public WaterQuad WaterQuad { get; set; }
|
||||
public Bounds CollisionBounds { get; set; }
|
||||
public YnvPoly NavPoly { get; set; }
|
||||
@ -227,7 +228,8 @@ namespace CodeWalker
|
||||
(DistantLodLights != null) ||
|
||||
(MloEntityDef != null) ||
|
||||
(ScenarioNode != null) ||
|
||||
(Audio != null);
|
||||
(Audio != null) ||
|
||||
(MloRoomDef != null);
|
||||
}
|
||||
}
|
||||
|
||||
@ -257,7 +259,8 @@ namespace CodeWalker
|
||||
|| (PathNode != mhit.PathNode)
|
||||
|| (TrainTrackNode != mhit.TrainTrackNode)
|
||||
|| (ScenarioNode != mhit.ScenarioNode)
|
||||
|| (Audio != mhit.Audio);
|
||||
|| (Audio != mhit.Audio)
|
||||
|| (MloRoomDef != mhit.MloRoomDef);
|
||||
}
|
||||
public bool CheckForChanges()
|
||||
{
|
||||
@ -280,7 +283,8 @@ namespace CodeWalker
|
||||
|| (PathLink != null)
|
||||
|| (TrainTrackNode != null)
|
||||
|| (ScenarioNode != null)
|
||||
|| (Audio != null);
|
||||
|| (Audio != null)
|
||||
|| (MloRoomDef != null);
|
||||
}
|
||||
|
||||
|
||||
@ -386,6 +390,10 @@ namespace CodeWalker
|
||||
{
|
||||
name = Audio.ShortTypeName + " " + Audio.GetNameString();// FloatUtil.GetVector3String(Audio.InnerPos);
|
||||
}
|
||||
if (MloRoomDef != null)
|
||||
{
|
||||
name = "MloRoomDef " + MloRoomDef.RoomName;
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
@ -460,6 +468,10 @@ namespace CodeWalker
|
||||
{
|
||||
name = Audio.ShortTypeName + " " + Audio.GetNameString();// + FloatUtil.GetVector3String(Audio.InnerPos);
|
||||
}
|
||||
if (MloRoomDef != null)
|
||||
{
|
||||
name = "MloRoomDef " + MloRoomDef.RoomName;
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
|
62
WorldForm.cs
62
WorldForm.cs
@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
@ -3368,6 +3367,37 @@ namespace CodeWalker
|
||||
SelectItem(ms);
|
||||
}
|
||||
}
|
||||
|
||||
public void SelectGrassBatch(YmapGrassInstanceBatch batch)
|
||||
{
|
||||
if (batch == null)
|
||||
{
|
||||
SelectItem(null);
|
||||
}
|
||||
else
|
||||
{
|
||||
MapSelection ms = new MapSelection();
|
||||
ms.GrassBatch = batch;
|
||||
ms.AABB = new BoundingBox(batch.AABBMin, batch.AABBMax);
|
||||
SelectItem(ms);
|
||||
}
|
||||
}
|
||||
public void SelectMloRoom(MCMloRoomDef room, MloInstanceData instance)
|
||||
{
|
||||
if (room == null)
|
||||
{
|
||||
SelectItem(null);
|
||||
}
|
||||
else if (instance != null)
|
||||
{
|
||||
MapSelection ms = new MapSelection();
|
||||
ms.MloRoomDef = room;
|
||||
Vector3 min = instance.Owner.Position + instance.Owner.Orientation.Multiply(room.BBMin_CW);
|
||||
Vector3 max = instance.Owner.Position + instance.Owner.Orientation.Multiply(room.BBMax_CW);
|
||||
ms.AABB = new BoundingBox(min, max);
|
||||
SelectItem(ms);
|
||||
}
|
||||
}
|
||||
public void SelectNavPoly(YnvPoly poly)
|
||||
{
|
||||
if (poly == null)
|
||||
@ -3915,6 +3945,7 @@ namespace CodeWalker
|
||||
{
|
||||
ProjectForm = new ProjectForm(this);
|
||||
ProjectForm.Show(this);
|
||||
ProjectForm.OnWorldSelectionChanged(SelectedItem); // so that the project form isn't stuck on the welcome window.
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -5063,11 +5094,25 @@ namespace CodeWalker
|
||||
}
|
||||
else
|
||||
{
|
||||
//project not open, or entity not selected there, just remove the entity from the ymap...
|
||||
//project not open, or entity not selected there, just remove the entity from the ymap/nlo...
|
||||
var ymap = ent.Ymap;
|
||||
var instance = ent.MloParent?.MloInstance;
|
||||
if (ymap == null)
|
||||
{
|
||||
MessageBox.Show("Sorry, deleting interior entities is not currently supported.");
|
||||
if (instance != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!instance.DeleteEntity(ent))
|
||||
{
|
||||
SelectItem(null);
|
||||
}
|
||||
}
|
||||
catch (Exception e) // various failures can happen here.
|
||||
{
|
||||
MessageBox.Show("Unable to remove entity..." + Environment.NewLine + e.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!ymap.RemoveEntity(ent))
|
||||
{
|
||||
@ -5088,7 +5133,16 @@ namespace CodeWalker
|
||||
{
|
||||
if (CopiedEntity == null) return;
|
||||
if (ProjectForm == null) return;
|
||||
ProjectForm.NewEntity(CopiedEntity);
|
||||
MloInstanceData instance = CopiedEntity.MloParent?.MloInstance;
|
||||
MCEntityDef entdef = instance?.TryGetArchetypeEntity(CopiedEntity);
|
||||
if (entdef != null)
|
||||
{
|
||||
ProjectForm.NewMloEntity(CopiedEntity, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
ProjectForm.NewEntity(CopiedEntity, true);
|
||||
}
|
||||
}
|
||||
private void CloneEntity()
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user