public static void SetupButtons(Type type, object value, ReferenceChain refChain) { if (value is VehicleInfo) { var info = (VehicleInfo)value; if (info.m_mesh != null) { if (GUILayout.Button("Preview")) { MeshViewer.CreateMeshViewer(info.name, info.m_mesh, info.m_material); } } if (info.m_lodMesh != null) { if (GUILayout.Button("Preview LOD")) { MeshViewer.CreateMeshViewer(info.name + "_LOD", info.m_lodMesh, info.m_lodMaterial); } } } else if (value is NetInfo) { SetupPlopButton(value); } else if (value is BuildingInfo) { var info = (BuildingInfo)value; SetupPlopButton(value); if (info.m_mesh != null) { if (GUILayout.Button("Preview")) { MeshViewer.CreateMeshViewer(info.name, info.m_mesh, info.m_material); } } if (info.m_lodMesh != null) { if (GUILayout.Button("Preview LOD")) { MeshViewer.CreateMeshViewer(info.name + "_LOD", info.m_lodMesh, info.m_lodMaterial); } } } else if (value is PropInfo) { var info = (PropInfo)value; SetupPlopButton(value); if (info.m_mesh != null) { if (GUILayout.Button("Preview")) { MeshViewer.CreateMeshViewer(info.name, info.m_mesh, info.m_material); } } if (info.m_lodMesh != null) { if (GUILayout.Button("Preview LOD")) { MeshViewer.CreateMeshViewer(info.name + "_LOD", info.m_lodMesh, info.m_lodMaterial); } } } else if (value is TreeInfo) { var info = (TreeInfo)value; SetupPlopButton(value); if (info.m_mesh != null) { if (GUILayout.Button("Preview")) { MeshViewer.CreateMeshViewer(info.name, info.m_mesh, info.m_material); } } } else if (value is CitizenInfo) { var info = (CitizenInfo)value; if (info.m_lodMesh != null) { if (GUILayout.Button("Preview LOD")) { MeshViewer.CreateMeshViewer(info.name, info.m_lodMesh, info.m_lodMaterial); } } } else if (value is MilestoneInfo) { var info = (MilestoneInfo)value; if (GUILayout.Button("Unlock")) { var wrapper = new MilestonesWrapper(UnlockManager.instance); wrapper.UnlockMilestone(info.name); } } else if (value is NetInfo.Segment) { var info = (NetInfo.Segment)value; if (info.m_mesh != null) { if (GUILayout.Button("Preview")) { MeshViewer.CreateMeshViewer(null, info.m_mesh, info.m_material); } if (GUILayout.Button("Preview LOD")) { MeshViewer.CreateMeshViewer(null, info.m_lodMesh, info.m_lodMaterial); } } } else if (value is NetInfo.Node) { var info = (NetInfo.Node)value; if (info.m_mesh != null) { if (GUILayout.Button("Preview")) { MeshViewer.CreateMeshViewer(null, info.m_mesh, info.m_material); } if (GUILayout.Button("Preview LOD")) { MeshViewer.CreateMeshViewer(null, info.m_lodMesh, info.m_lodMaterial); } } } else if (TypeUtil.IsTextureType(type) && value != null) { var texture = (Texture)value; if (GUILayout.Button("Preview")) { TextureViewer.CreateTextureViewer(refChain, texture); } if (GUILayout.Button("Dump .png")) { TextureUtil.DumpTextureToPNG(texture); } } else if (TypeUtil.IsMeshType(type) && value != null) { if (GUILayout.Button("Preview")) { MeshViewer.CreateMeshViewer(null, (Mesh)value, null); } if (((Mesh)value).isReadable) { if (GUILayout.Button("Dump .obj")) { var outPath = refChain.ToString().Replace(' ', '_'); DumpUtil.DumpMeshAndTextures(outPath, value as Mesh); } } } if (GUILayout.Button("Copy")) { _buffer = value; } }
public static void SetupCommonButtons(ReferenceChain refChain, object value, uint valueIndex, TypeUtil.SmartType smartType = TypeUtil.SmartType.Undefined) { switch (value) { case null: if (GUILayout.Button("Watch")) { MainWindow.Instance.Watches.AddWatch(refChain); } return; case PrefabInfo prefabInfo: SetupButtonsForPrefab(prefabInfo); break; case MilestoneInfo milestoneInfo: if (GUILayout.Button("Unlock")) { var wrapper = new MilestonesWrapper(UnlockManager.instance); wrapper.UnlockMilestone(milestoneInfo.name); } break; case NetInfo.Segment segmentInfo: SetupSegmentButtons(refChain, segmentInfo); break; case NetInfo.Node nodeInfo: SetupNodeButtons(refChain, nodeInfo); break; case BuildingInfo.MeshInfo buildingSumMeshInfo: SetupMeshPreviewButtons( name: null, buildingSumMeshInfo.m_subInfo?.m_mesh, buildingSumMeshInfo.m_subInfo?.m_material, buildingSumMeshInfo.m_subInfo?.m_lodMesh, buildingSumMeshInfo.m_subInfo?.m_lodMaterial); break; case VehicleInfo.MeshInfo vehicleSumMeshInfo: SetupMeshPreviewButtons( name: null, vehicleSumMeshInfo.m_subInfo?.m_mesh, vehicleSumMeshInfo.m_subInfo?.m_material, vehicleSumMeshInfo.m_subInfo?.m_lodMesh, vehicleSumMeshInfo.m_subInfo?.m_lodMaterial); break; case CitizenInstance instance when valueIndex > 0 && (instance.m_flags & (CitizenInstance.Flags.Created | CitizenInstance.Flags.Deleted)) == CitizenInstance.Flags.Created: InstanceID citizenInstanceInst = default; citizenInstanceInst.CitizenInstance = (ushort)valueIndex; SetupGotoButton(citizenInstanceInst, instance.GetLastFramePosition()); break; case Citizen citizen when citizen.m_instance > 0: ref var citizenInstance = ref CitizenManager.instance.m_instances.m_buffer[citizen.m_instance]; if ((citizenInstance.m_flags & (CitizenInstance.Flags.Created | CitizenInstance.Flags.Deleted)) == CitizenInstance.Flags.Created) { InstanceID citizenInstanceInst2 = default; citizenInstanceInst2.CitizenInstance = citizen.m_instance; SetupGotoButton(citizenInstanceInst2, citizenInstance.GetLastFramePosition()); } break; case Vehicle vehicle when valueIndex > 0 && (vehicle.m_flags & (Vehicle.Flags.Created | Vehicle.Flags.Deleted)) == Vehicle.Flags.Created: InstanceID vehicleInst = default; vehicleInst.Vehicle = (ushort)valueIndex; SetupGotoButton(vehicleInst, vehicle.GetLastFramePosition()); break; case VehicleParked parkedVehicle when valueIndex > 0 && (parkedVehicle.m_flags & 3) == 1: InstanceID parkedVehicleInst = default; parkedVehicleInst.ParkedVehicle = (ushort)valueIndex; SetupGotoButton(parkedVehicleInst, parkedVehicle.m_position); break; case Building building when valueIndex > 0 && (building.m_flags & (Building.Flags.Created | Building.Flags.Deleted)) == Building.Flags.Created: InstanceID buildingInst = default; buildingInst.Building = (ushort)valueIndex; SetupGotoButton(buildingInst, building.m_position); break; case PropInstance prop when valueIndex > 0 && ((PropInstance.Flags)prop.m_flags & (PropInstance.Flags.Created | PropInstance.Flags.Deleted)) == PropInstance.Flags.Created: InstanceID propInst = default; propInst.Prop = (ushort)valueIndex; SetupGotoButton(propInst, prop.Position); break; case TreeInstance tree when valueIndex > 0 && ((TreeInstance.Flags)tree.m_flags & (TreeInstance.Flags.Created | TreeInstance.Flags.Deleted)) == TreeInstance.Flags.Created: InstanceID treeInst = default; treeInst.Tree = valueIndex; SetupGotoButton(treeInst, tree.Position); break; case NetSegment segment when valueIndex > 0 && (segment.m_flags & (NetSegment.Flags.Created | NetSegment.Flags.Deleted)) == NetSegment.Flags.Created: InstanceID segmentInst = default; segmentInst.NetSegment = (ushort)valueIndex; SetupGotoButton(segmentInst, segment.m_middlePosition); break; case NetNode node when valueIndex > 0 && (node.m_flags & (NetNode.Flags.Created | NetNode.Flags.Deleted)) == NetNode.Flags.Created: InstanceID nodeInst = default; nodeInst.NetNode = (ushort)valueIndex; SetupGotoButton(nodeInst, node.m_position); break; case NetLane lane when valueIndex > 0 && ((NetLane.Flags)lane.m_flags & (NetLane.Flags.Created | NetLane.Flags.Deleted)) == NetLane.Flags.Created: InstanceID segmentInst1 = default; segmentInst1.NetSegment = lane.m_segment; var segment1 = NetManager.instance.m_segments.m_buffer[lane.m_segment]; SetupGotoButton(segmentInst1, segment1.m_middlePosition); break; case Texture texture: SetupTextureButtons(texture); break; case UITextureAtlas.SpriteInfo spriteInfo: SetupTextureButtons(spriteInfo.texture); break; case UITextureSprite textureSprite: SetupTextureButtons(textureSprite.texture); break; case Mesh mesh: SetupMeshButtons(refChain, mesh); break; } SetupSmartShowButtons(value, smartType); if (GUILayout.Button("Watch")) { MainWindow.Instance.Watches.AddWatch(refChain); } if (GUILayout.Button("Copy")) { buffer = value; } }