Moved all GameFiles to CodeWalker.Core

This commit is contained in:
dexyfex 2018-02-25 00:59:00 +11:00
parent 375db771ee
commit cbd242b8cc
86 changed files with 1194 additions and 1085 deletions

View File

@ -41,7 +41,7 @@ namespace CodeWalker
{ {
Task.Run(() => Task.Run(() =>
{ {
GTA5Keys.LoadFromPath(Settings.Default.GTAFolder, Settings.Default.Key); GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key);
RpfMan = new RpfManager(); RpfMan = new RpfManager();
RpfMan.Init(GTAFolder.CurrentGTAFolder, UpdateStatus, UpdateStatus, false, false); RpfMan.Init(GTAFolder.CurrentGTAFolder, UpdateStatus, UpdateStatus, false, false);
RPFScanComplete(); RPFScanComplete();

View File

@ -64,7 +64,7 @@ namespace CodeWalker
try try
{ {
GTA5Keys.LoadFromPath(Settings.Default.GTAFolder, Settings.Default.Key); GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key);
KeysLoaded = true; KeysLoaded = true;
UpdateStatus("Ready to scan..."); UpdateStatus("Ready to scan...");
} }

View File

@ -47,6 +47,61 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="GameFiles\FileTypes\AwcFile.cs" />
<Compile Include="GameFiles\FileTypes\CacheDatFile.cs" />
<Compile Include="GameFiles\FileTypes\CutFile.cs" />
<Compile Include="GameFiles\FileTypes\DlcContentFile.cs" />
<Compile Include="GameFiles\FileTypes\DlcSetupFile.cs" />
<Compile Include="GameFiles\FileTypes\FxcFile.cs" />
<Compile Include="GameFiles\FileTypes\GtxdFile.cs" />
<Compile Include="GameFiles\FileTypes\Gxt2File.cs" />
<Compile Include="GameFiles\FileTypes\JPsoFile.cs" />
<Compile Include="GameFiles\FileTypes\RelFile.cs" />
<Compile Include="GameFiles\FileTypes\Stats.cs" />
<Compile Include="GameFiles\FileTypes\YbnFile.cs" />
<Compile Include="GameFiles\FileTypes\YcdFile.cs" />
<Compile Include="GameFiles\FileTypes\YddFile.cs" />
<Compile Include="GameFiles\FileTypes\YdrFile.cs" />
<Compile Include="GameFiles\FileTypes\YftFile.cs" />
<Compile Include="GameFiles\FileTypes\YmapFile.cs" />
<Compile Include="GameFiles\FileTypes\YmfFile.cs" />
<Compile Include="GameFiles\FileTypes\YmtFile.cs" />
<Compile Include="GameFiles\FileTypes\YndFile.cs" />
<Compile Include="GameFiles\FileTypes\YnvFile.cs" />
<Compile Include="GameFiles\FileTypes\YptFile.cs" />
<Compile Include="GameFiles\FileTypes\YtdFile.cs" />
<Compile Include="GameFiles\FileTypes\YtypFile.cs" />
<Compile Include="GameFiles\FileTypes\YvrFile.cs" />
<Compile Include="GameFiles\FileTypes\YwrFile.cs" />
<Compile Include="GameFiles\GameFile.cs" />
<Compile Include="GameFiles\GameFileCache.cs" />
<Compile Include="GameFiles\MetaTypes\Archetype.cs" />
<Compile Include="GameFiles\MetaTypes\Meta.cs" />
<Compile Include="GameFiles\MetaTypes\MetaBuilder.cs" />
<Compile Include="GameFiles\MetaTypes\MetaNames.cs" />
<Compile Include="GameFiles\MetaTypes\MetaTypes.cs" />
<Compile Include="GameFiles\MetaTypes\MetaXml.cs" />
<Compile Include="GameFiles\MetaTypes\Pso.cs" />
<Compile Include="GameFiles\MetaTypes\PsoTypes.cs" />
<Compile Include="GameFiles\MetaTypes\Rbf.cs" />
<Compile Include="GameFiles\MetaTypes\XmlMeta.cs" />
<Compile Include="GameFiles\Resources\Bounds.cs" />
<Compile Include="GameFiles\Resources\Clip.cs" />
<Compile Include="GameFiles\Resources\Drawable.cs" />
<Compile Include="GameFiles\Resources\Frag.cs" />
<Compile Include="GameFiles\Resources\Nav.cs" />
<Compile Include="GameFiles\Resources\Node.cs" />
<Compile Include="GameFiles\Resources\Particle.cs" />
<Compile Include="GameFiles\Resources\ResourceBaseTypes.cs" />
<Compile Include="GameFiles\Resources\ResourceBuilder.cs" />
<Compile Include="GameFiles\Resources\ResourceData.cs" />
<Compile Include="GameFiles\Resources\ResourceFile.cs" />
<Compile Include="GameFiles\Resources\Texture.cs" />
<Compile Include="GameFiles\Resources\VehicleRecord.cs" />
<Compile Include="GameFiles\Resources\VertexType.cs" />
<Compile Include="GameFiles\Resources\WaypointRecord.cs" />
<Compile Include="GameFiles\RpfFile.cs" />
<Compile Include="GameFiles\RpfManager.cs" />
<Compile Include="GameFiles\Utils\Data.cs" /> <Compile Include="GameFiles\Utils\Data.cs" />
<Compile Include="GameFiles\Utils\GTACrypto.cs" /> <Compile Include="GameFiles\Utils\GTACrypto.cs" />
<Compile Include="GameFiles\Utils\GTAKeys.cs" /> <Compile Include="GameFiles\Utils\GTAKeys.cs" />
@ -63,6 +118,18 @@
<Compile Include="Utils\Utils.cs" /> <Compile Include="Utils\Utils.cs" />
<Compile Include="Utils\Vectors.cs" /> <Compile Include="Utils\Vectors.cs" />
<Compile Include="Utils\Xml.cs" /> <Compile Include="Utils\Xml.cs" />
<Compile Include="World\AudioZones.cs" />
<Compile Include="World\Camera.cs" />
<Compile Include="World\Clouds.cs" />
<Compile Include="World\Entity.cs" />
<Compile Include="World\PopZones.cs" />
<Compile Include="World\Scenarios.cs" />
<Compile Include="World\Space.cs" />
<Compile Include="World\Timecycle.cs" />
<Compile Include="World\TimecycleMods.cs" />
<Compile Include="World\Trains.cs" />
<Compile Include="World\Water.cs" />
<Compile Include="World\Weather.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="packages.config" /> <None Include="packages.config" />

View File

@ -1,5 +1,4 @@
using SharpDX.D3DCompiler; using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.IO; using System.IO;
@ -104,8 +103,9 @@ namespace CodeWalker.GameFiles
for (int s = 1; s < sc0; s++) for (int s = 1; s < sc0; s++)
{ {
bool exbyteflag1 = (gindex==5); //GS seems to be in diff format?? bool exbyteflag1 = (gindex==5); //GS seems to be in diff format??
bool vsgsps = (gindex == 1) || (gindex == 2) || (gindex == 5);
FxcShader shader = new FxcShader(); FxcShader shader = new FxcShader();
if (!shader.Read(br, exbyteflag1)) if (!shader.Read(br, exbyteflag1, vsgsps))
{ {
LastError += shader.LastError; LastError += shader.LastError;
//gindex = 6; //get outta the loop? //gindex = 6; //get outta the loop?
@ -537,13 +537,14 @@ namespace CodeWalker.GameFiles
public FxcShaderBufferRef[] Buffers { get; set; }//CBuffers public FxcShaderBufferRef[] Buffers { get; set; }//CBuffers
public byte VersionMajor { get; set; } public byte VersionMajor { get; set; }
public byte VersionMinor { get; set; } public byte VersionMinor { get; set; }
public string VersionString { get; set; }
public byte[] ByteCode { get; set; } public byte[] ByteCode { get; set; }
public ShaderBytecode ByteCodeObj { get; set; } //public ShaderBytecode ByteCodeObj { get; set; }
public ShaderProfile ShaderProfile { get; set; } //public ShaderProfile ShaderProfile { get; set; }
public string Disassembly { get; set; } public string Disassembly { get; set; }
public string LastError { get; set; } public string LastError { get; set; }
public bool Read(BinaryReader br, bool exbyteflag) public bool Read(BinaryReader br, bool exbyteflag, bool vsgsps)
{ {
Offset = br.BaseStream.Position; Offset = br.BaseStream.Position;
@ -592,38 +593,37 @@ namespace CodeWalker.GameFiles
ByteCode = br.ReadBytes((int)datalength); ByteCode = br.ReadBytes((int)datalength);
if (vsgsps)
try
{ {
ByteCodeObj = new ShaderBytecode(ByteCode); VersionMajor = br.ReadByte();//4,5 //appears to be shader model version
VersionMinor = br.ReadByte(); //perhaps shader minor version
ShaderProfile = ByteCodeObj.GetVersion();
switch (ShaderProfile.Version)
{
case ShaderVersion.VertexShader:
case ShaderVersion.PixelShader:
case ShaderVersion.GeometryShader:
VersionMajor = br.ReadByte();//4,5 //appears to be shader model version
VersionMinor = br.ReadByte(); //perhaps shader minor version
break;
default:
VersionMajor = (byte)ShaderProfile.Major;
VersionMinor = (byte)ShaderProfile.Minor;
break;
}
//do disassembly last, so any errors won't cause the file read to break
Disassembly = ByteCodeObj.Disassemble();
}
catch (Exception ex)
{
LastError += ex.ToString() + "\r\n";
return false;
} }
//try
//{
// ByteCodeObj = new ShaderBytecode(ByteCode);
// ShaderProfile = ByteCodeObj.GetVersion();
// switch (ShaderProfile.Version)
// {
// case ShaderVersion.VertexShader:
// case ShaderVersion.PixelShader:
// case ShaderVersion.GeometryShader:
// VersionMajor = br.ReadByte();//4,5 //appears to be shader model version
// VersionMinor = br.ReadByte(); //perhaps shader minor version
// break;
// default:
// VersionMajor = (byte)ShaderProfile.Major;
// VersionMinor = (byte)ShaderProfile.Minor;
// break;
// }
// //do disassembly last, so any errors won't cause the file read to break
// Disassembly = ByteCodeObj.Disassemble();
//}
//catch (Exception ex)
//{
// LastError += ex.ToString() + "\r\n";
// return false;
//}
} }
else else
{ {

View File

@ -72,4 +72,22 @@ namespace CodeWalker.GameFiles
Gtxd = 16, Gtxd = 16,
} }
public struct GameFileCacheKey
{
public uint Hash { get; set; }
public GameFileType Type { get; set; }
public GameFileCacheKey(uint hash, GameFileType type)
{
Hash = hash;
Type = type;
}
}
} }

View File

@ -1,5 +1,4 @@
using CodeWalker.Properties; using SharpDX;
using SharpDX;
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
@ -22,7 +21,7 @@ namespace CodeWalker.GameFiles
private ConcurrentStack<GameFile> requestQueue = new ConcurrentStack<GameFile>(); private ConcurrentStack<GameFile> requestQueue = new ConcurrentStack<GameFile>();
////dynamic cache ////dynamic cache
private Cache<GameFileCacheKey, GameFile> mainCache = new Cache<GameFileCacheKey, GameFile>(Settings.Default.CacheSize, Settings.Default.CacheTime);//2GB private Cache<GameFileCacheKey, GameFile> mainCache;
public volatile bool IsInited = false; public volatile bool IsInited = false;
private volatile bool archetypesLoaded = false; private volatile bool archetypesLoaded = false;
@ -86,6 +85,18 @@ namespace CodeWalker.GameFiles
private bool PreloadedMode = false; private bool PreloadedMode = false;
private string GTAFolder;
private string ExcludeFolders;
public GameFileCache(long size, double cacheTime, string folder, string dlc, bool mods, string excludeFolders)
{
mainCache = new Cache<GameFileCacheKey, GameFile>(size, cacheTime);//2GB is good as default
SelectedDlc = dlc;
EnableDlc = !string.IsNullOrEmpty(SelectedDlc);
EnableMods = mods;
GTAFolder = folder;
ExcludeFolders = excludeFolders;
}
public void Clear() public void Clear()
@ -110,18 +121,14 @@ namespace CodeWalker.GameFiles
if (RpfMan == null) if (RpfMan == null)
{ {
SelectedDlc = Settings.Default.DLC;
EnableDlc = !string.IsNullOrEmpty(SelectedDlc); EnableDlc = !string.IsNullOrEmpty(SelectedDlc);
EnableMods = Settings.Default.EnableMods;
RpfMan = new RpfManager(); RpfMan = new RpfManager();
RpfMan.ExcludePaths = GetExcludePaths(); RpfMan.ExcludePaths = GetExcludePaths();
RpfMan.EnableMods = EnableMods; RpfMan.EnableMods = EnableMods;
RpfMan.Init(GTAFolder.CurrentGTAFolder, UpdateStatus, ErrorLog);//, true); RpfMan.Init(GTAFolder, UpdateStatus, ErrorLog);//, true);
//RE test area! //RE test area!
//DecodeRelFiles(); //DecodeRelFiles();
@ -2078,7 +2085,7 @@ namespace CodeWalker.GameFiles
private string[] GetExcludePaths() private string[] GetExcludePaths()
{ {
string[] exclpaths = Settings.Default.ExcludeFolders.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); string[] exclpaths = ExcludeFolders.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
if (exclpaths.Length > 0) if (exclpaths.Length > 0)
{ {
for (int i = 0; i < exclpaths.Length; i++) for (int i = 0; i < exclpaths.Length; i++)
@ -2647,17 +2654,5 @@ namespace CodeWalker.GameFiles
} }
public struct GameFileCacheKey
{
public uint Hash { get; set; }
public GameFileType Type { get; set; }
public GameFileCacheKey(uint hash, GameFileType type)
{
Hash = hash;
Type = type;
}
}
} }

View File

@ -6,7 +6,7 @@ using SharpDX;
namespace CodeWalker.GameFiles namespace CodeWalker.GameFiles
{ {
class XmlMeta public class XmlMeta
{ {
public static Meta GetMeta(XmlDocument doc) public static Meta GetMeta(XmlDocument doc)
{ {

View File

@ -24,7 +24,6 @@
using SharpDX; using SharpDX;
using SharpDX.DXGI;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;

View File

@ -24,7 +24,6 @@
using SharpDX; using SharpDX;
using SharpDX.DXGI;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;

View File

@ -1,5 +1,4 @@
using SharpDX.DXGI; using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Linq; using System.Linq;
@ -443,149 +442,4 @@ namespace CodeWalker.GameFiles
//UNKNOWN //UNKNOWN
} }
public static class TextureFormats
{
public static SharpDX.DXGI.Format GetDXGIFormat(TextureFormat fmt)
{
SharpDX.DXGI.Format format = SharpDX.DXGI.Format.Unknown;
switch (fmt)
{
// compressed
case TextureFormat.D3DFMT_DXT1: format = SharpDX.DXGI.Format.BC1_UNorm; break;
case TextureFormat.D3DFMT_DXT3: format = SharpDX.DXGI.Format.BC2_UNorm; break;
case TextureFormat.D3DFMT_DXT5: format = SharpDX.DXGI.Format.BC3_UNorm; break;
case TextureFormat.D3DFMT_ATI1: format = SharpDX.DXGI.Format.BC4_UNorm; break;
case TextureFormat.D3DFMT_ATI2: format = SharpDX.DXGI.Format.BC5_UNorm; break;
case TextureFormat.D3DFMT_BC7: format = SharpDX.DXGI.Format.BC7_UNorm; break;
// uncompressed
case TextureFormat.D3DFMT_A1R5G5B5: format = SharpDX.DXGI.Format.B5G5R5A1_UNorm; break;
case TextureFormat.D3DFMT_A8: format = SharpDX.DXGI.Format.A8_UNorm; break;
case TextureFormat.D3DFMT_A8B8G8R8: format = SharpDX.DXGI.Format.R8G8B8A8_UNorm; break;
case TextureFormat.D3DFMT_L8: format = SharpDX.DXGI.Format.R8_UNorm; break;
case TextureFormat.D3DFMT_A8R8G8B8: format = SharpDX.DXGI.Format.B8G8R8A8_UNorm; break;
}
return format;
}
public static int ByteSize(TextureFormat fmt)
{
switch (fmt)
{
// compressed
case TextureFormat.D3DFMT_DXT1: return 4;// BC1_UNorm
case TextureFormat.D3DFMT_DXT3: return 8;// BC2_UNorm
case TextureFormat.D3DFMT_DXT5: return 8;// BC3_UNorm
case TextureFormat.D3DFMT_ATI1: return 4;// BC4_UNorm
case TextureFormat.D3DFMT_ATI2: return 8;// BC5_UNorm
case TextureFormat.D3DFMT_BC7: return 8;// BC7_UNorm
// uncompressed
case TextureFormat.D3DFMT_A1R5G5B5: return 16;// B5G5R5A1_UNorm
case TextureFormat.D3DFMT_A8: return 8;// A8_UNorm
case TextureFormat.D3DFMT_A8B8G8R8: return 32;// R8G8B8A8_UNorm
case TextureFormat.D3DFMT_L8: return 8;// R8_UNorm
case TextureFormat.D3DFMT_A8R8G8B8: return 32;// B8G8R8A8_UNorm
default: return 0;
}
}
public static void ComputePitch(Format fmt, int width, int height, out int rowPitch, out int slicePitch, uint flags)
{
int nbw, nbh;
switch (fmt)
{
case Format.BC1_Typeless:
case Format.BC1_UNorm:
case Format.BC1_UNorm_SRgb:
case Format.BC4_Typeless:
case Format.BC4_UNorm:
case Format.BC4_SNorm:
nbw = Math.Max(1, (width + 3) / 4);
nbh = Math.Max(1, (height + 3) / 4);
rowPitch = nbw * 8;
slicePitch = rowPitch * nbh;
break;
case Format.BC2_Typeless:
case Format.BC2_UNorm:
case Format.BC2_UNorm_SRgb:
case Format.BC3_Typeless:
case Format.BC3_UNorm:
case Format.BC3_UNorm_SRgb:
case Format.BC5_Typeless:
case Format.BC5_UNorm:
case Format.BC5_SNorm:
case Format.BC6H_Typeless:
case Format.BC6H_Uf16:
case Format.BC6H_Sf16:
case Format.BC7_Typeless:
case Format.BC7_UNorm:
case Format.BC7_UNorm_SRgb:
nbw = Math.Max(1, (width + 3) / 4);
nbh = Math.Max(1, (height + 3) / 4);
rowPitch = nbw * 16;
slicePitch = rowPitch * nbh;
break;
case Format.R8G8_B8G8_UNorm:
case Format.G8R8_G8B8_UNorm:
case Format.YUY2:
rowPitch = ((width + 1) >> 1) * 4;
slicePitch = rowPitch * height;
break;
case Format.Y210:
case Format.Y216:
rowPitch = ((width + 1) >> 1) * 8;
slicePitch = rowPitch * height;
break;
case Format.NV12:
case Format.Opaque420:
rowPitch = ((width + 1) >> 1) * 2;
slicePitch = rowPitch * (height + ((height + 1) >> 1));
break;
case Format.P010:
case Format.P016:
//case Format.XBOX_DXGI_FORMAT_D16_UNORM_S8_UINT:
//case Format.XBOX_DXGI_FORMAT_R16_UNORM_X8_TYPELESS:
//case Format.XBOX_DXGI_FORMAT_X16_TYPELESS_G8_UINT:
rowPitch = ((width + 1) >> 1) * 4;
slicePitch = rowPitch * (height + ((height + 1) >> 1));
break;
case Format.NV11:
rowPitch = ((width + 3) >> 2) * 4;
slicePitch = rowPitch * height * 2;
break;
//case Format.WIN10_DXGI_FORMAT_P208:
// rowPitch = ((width + 1) >> 1) * 2;
// slicePitch = rowPitch * height * 2;
// break;
//case Format.WIN10_DXGI_FORMAT_V208:
// rowPitch = width;
// slicePitch = rowPitch * (height + (((height + 1) >> 1) * 2));
// break;
//case Format.WIN10_DXGI_FORMAT_V408:
// rowPitch = width;
// slicePitch = rowPitch * (height + ((height >> 1) * 4));
// break;
default:
int bpp = FormatHelper.SizeOfInBytes(fmt) * 8;
// Default byte alignment
rowPitch = (width * bpp + 7) / 8;
slicePitch = rowPitch * height;
break;
}
}
}
} }

View File

@ -1,5 +1,4 @@
using CodeWalker.Properties; using SharpDX;
using SharpDX;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -12,8 +11,8 @@ namespace CodeWalker.World
{ {
public Vector3 TargetRotation = Vector3.Zero; public Vector3 TargetRotation = Vector3.Zero;
public Vector3 CurrentRotation = Vector3.Zero; public Vector3 CurrentRotation = Vector3.Zero;
public float Smoothness = Settings.Default.CameraSmoothing;// 10.0f;//0.15f; public float Smoothness;// 10.0f;//0.15f;
public float Sensitivity = Settings.Default.CameraSensitivity;// 0.005f; public float Sensitivity;// 0.005f;
public float TargetDistance = 1.0f; public float TargetDistance = 1.0f;
public float CurrentDistance = 1.0f; public float CurrentDistance = 1.0f;
public float ZoomCurrentTime = 0.0f; public float ZoomCurrentTime = 0.0f;
@ -22,7 +21,7 @@ namespace CodeWalker.World
public float ZoomSpeed = 0.1f; public float ZoomSpeed = 0.1f;
public float Width = 1920.0f; public float Width = 1920.0f;
public float Height = 1080.0f; public float Height = 1080.0f;
public float FieldOfView = Settings.Default.CameraFieldOfView;// 1.0f; public float FieldOfView;// 1.0f;
public float FieldOfViewFactor = 0.5f / (float)Math.Tan(/*FieldOfView*/ 1.0f * 0.5f); public float FieldOfViewFactor = 0.5f / (float)Math.Tan(/*FieldOfView*/ 1.0f * 0.5f);
public float AspectRatio = 1920.0f / 1080.0f; public float AspectRatio = 1920.0f / 1080.0f;
public float ZNear = 0.5f; public float ZNear = 0.5f;
@ -54,6 +53,15 @@ namespace CodeWalker.World
private object syncRoot = new object(); private object syncRoot = new object();
public Camera(float smoothness, float sensitivity, float fov)
{
Smoothness = smoothness;
Sensitivity = sensitivity;
FieldOfView = fov;
FieldOfViewFactor = 0.5f / (float)Math.Tan(FieldOfView * 0.5f);
}
public void SetMousePosition(int x, int y) public void SetMousePosition(int x, int y)
{ {
MouseX = (x / Width) * 2.0f - 1.0f; MouseX = (x / Width) * 2.0f - 1.0f;

View File

@ -258,59 +258,8 @@
<Compile Include="Forms\YwrForm.Designer.cs"> <Compile Include="Forms\YwrForm.Designer.cs">
<DependentUpon>YwrForm.cs</DependentUpon> <DependentUpon>YwrForm.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="GameFiles\FileTypes\AwcFile.cs" /> <Compile Include="GameFiles\FxcParser.cs" />
<Compile Include="GameFiles\FileTypes\CutFile.cs" /> <Compile Include="GameFiles\GameFileCacheFactory.cs" />
<Compile Include="GameFiles\FileTypes\DlcContentFile.cs" />
<Compile Include="GameFiles\FileTypes\DlcSetupFile.cs" />
<Compile Include="GameFiles\FileTypes\GtxdFile.cs" />
<Compile Include="GameFiles\FileTypes\Gxt2File.cs" />
<Compile Include="GameFiles\FileTypes\JPsoFile.cs" />
<Compile Include="GameFiles\FileTypes\RelFile.cs" />
<Compile Include="GameFiles\FileTypes\Stats.cs" />
<Compile Include="GameFiles\FileTypes\YbnFile.cs" />
<Compile Include="GameFiles\FileTypes\YcdFile.cs" />
<Compile Include="GameFiles\FileTypes\YnvFile.cs" />
<Compile Include="GameFiles\FileTypes\YptFile.cs" />
<Compile Include="GameFiles\FileTypes\YvrFile.cs" />
<Compile Include="GameFiles\FileTypes\YwrFile.cs" />
<Compile Include="GameFiles\MetaTypes\MetaBuilder.cs" />
<Compile Include="GameFiles\MetaTypes\MetaXml.cs" />
<Compile Include="GameFiles\MetaTypes\XmlMeta.cs" />
<Compile Include="GameFiles\Resources\Archetype.cs" />
<Compile Include="GameFiles\FileTypes\CacheDatFile.cs" />
<Compile Include="GameFiles\Resources\Bounds.cs" />
<Compile Include="GameFiles\Resources\Clip.cs" />
<Compile Include="GameFiles\Resources\Drawable.cs" />
<Compile Include="GameFiles\Resources\Frag.cs" />
<Compile Include="GameFiles\FileTypes\FxcFile.cs" />
<Compile Include="GameFiles\GameFile.cs" />
<Compile Include="GameFiles\GameFileCache.cs" />
<Compile Include="GameFiles\Resources\Nav.cs" />
<Compile Include="GameFiles\Resources\Node.cs" />
<Compile Include="GameFiles\Resources\Particle.cs" />
<Compile Include="GameFiles\Resources\ResourceBuilder.cs" />
<Compile Include="GameFiles\Resources\Texture.cs" />
<Compile Include="GameFiles\Resources\VehicleRecord.cs" />
<Compile Include="GameFiles\Resources\WaypointRecord.cs" />
<Compile Include="GameFiles\MetaTypes\Meta.cs" />
<Compile Include="GameFiles\MetaTypes\MetaTypes.cs" />
<Compile Include="GameFiles\MetaTypes\MetaNames.cs" />
<Compile Include="GameFiles\MetaTypes\Pso.cs" />
<Compile Include="GameFiles\MetaTypes\PsoTypes.cs" />
<Compile Include="GameFiles\MetaTypes\Rbf.cs" />
<Compile Include="GameFiles\Resources\ResourceData.cs" />
<Compile Include="GameFiles\Resources\ResourceFile.cs" />
<Compile Include="GameFiles\Resources\ResourceBaseTypes.cs" />
<Compile Include="GameFiles\Resources\RpfManager.cs" />
<Compile Include="GameFiles\Resources\VertexType.cs" />
<Compile Include="GameFiles\FileTypes\YddFile.cs" />
<Compile Include="GameFiles\FileTypes\YdrFile.cs" />
<Compile Include="GameFiles\FileTypes\YftFile.cs" />
<Compile Include="GameFiles\FileTypes\YmapFile.cs" />
<Compile Include="GameFiles\FileTypes\YmfFile.cs" />
<Compile Include="GameFiles\FileTypes\YmtFile.cs" />
<Compile Include="GameFiles\FileTypes\YtypFile.cs" />
<Compile Include="GameFiles\FileTypes\YndFile.cs" />
<Compile Include="JenkGenForm.cs"> <Compile Include="JenkGenForm.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
@ -340,7 +289,6 @@
<Compile Include="Project\ProjectFile.cs" /> <Compile Include="Project\ProjectFile.cs" />
<Compile Include="Project\UndoStep.cs" /> <Compile Include="Project\UndoStep.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="GameFiles\Resources\RpfFile.cs" />
<Compile Include="Rendering\DirectX\DXUtility.cs" /> <Compile Include="Rendering\DirectX\DXUtility.cs" />
<Compile Include="Rendering\Renderer.cs" /> <Compile Include="Rendering\Renderer.cs" />
<Compile Include="Rendering\Shaders\BasicShader.cs" /> <Compile Include="Rendering\Shaders\BasicShader.cs" />
@ -393,6 +341,7 @@
<Compile Include="Utils\GTAFolder.cs" /> <Compile Include="Utils\GTAFolder.cs" />
<Compile Include="Utils\InputUtils.cs" /> <Compile Include="Utils\InputUtils.cs" />
<Compile Include="Utils\MapUtils.cs" /> <Compile Include="Utils\MapUtils.cs" />
<Compile Include="GameFiles\TextureFormats.cs" />
<Compile Include="Utils\TextureLoader.cs" /> <Compile Include="Utils\TextureLoader.cs" />
<Compile Include="ProjectForm.cs"> <Compile Include="ProjectForm.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
@ -412,8 +361,6 @@
<Compile Include="WorldSearchForm.Designer.cs"> <Compile Include="WorldSearchForm.Designer.cs">
<DependentUpon>WorldSearchForm.cs</DependentUpon> <DependentUpon>WorldSearchForm.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="World\AudioZones.cs" />
<Compile Include="World\Camera.cs" />
<Compile Include="Rendering\DirectX\DXForm.cs" /> <Compile Include="Rendering\DirectX\DXForm.cs" />
<Compile Include="Rendering\DirectX\DXManager.cs" /> <Compile Include="Rendering\DirectX\DXManager.cs" />
<Compile Include="Rendering\Utils\UnitQuad.cs" /> <Compile Include="Rendering\Utils\UnitQuad.cs" />
@ -429,17 +376,6 @@
<Compile Include="WorldForm.Designer.cs"> <Compile Include="WorldForm.Designer.cs">
<DependentUpon>WorldForm.cs</DependentUpon> <DependentUpon>WorldForm.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="GameFiles\FileTypes\YtdFile.cs" />
<Compile Include="World\Clouds.cs" />
<Compile Include="World\Entity.cs" />
<Compile Include="World\PopZones.cs" />
<Compile Include="World\Scenarios.cs" />
<Compile Include="World\Space.cs" />
<Compile Include="World\Timecycle.cs" />
<Compile Include="World\TimecycleMods.cs" />
<Compile Include="World\Trains.cs" />
<Compile Include="World\Water.cs" />
<Compile Include="World\Weather.cs" />
<Compile Include="World\Widget.cs" /> <Compile Include="World\Widget.cs" />
<EmbeddedResource Include="AboutForm.resx"> <EmbeddedResource Include="AboutForm.resx">
<DependentUpon>AboutForm.cs</DependentUpon> <DependentUpon>AboutForm.cs</DependentUpon>

View File

@ -40,7 +40,7 @@ namespace CodeWalker
private MainTreeFolder SearchResults; private MainTreeFolder SearchResults;
private List<RpfFile> AllRpfs { get; set; } private List<RpfFile> AllRpfs { get; set; }
private GameFileCache FileCache { get; set; } = new GameFileCache(); private GameFileCache FileCache { get; set; } = GameFileCacheFactory.Create();
private object FileCacheSyncRoot = new object(); private object FileCacheSyncRoot = new object();
private bool EditMode = false; private bool EditMode = false;
@ -73,7 +73,7 @@ namespace CodeWalker
{ {
try try
{ {
GTA5Keys.LoadFromPath(Settings.Default.GTAFolder, Settings.Default.Key); GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key);
} }
catch catch
{ {

View File

@ -30,7 +30,7 @@ namespace CodeWalker
try try
{ {
GTA5Keys.LoadFromPath(Settings.Default.GTAFolder, Settings.Default.Key); GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key);
KeysLoaded = true; KeysLoaded = true;
UpdateStatus("Keys loaded. Nothing to do here!"); UpdateStatus("Keys loaded. Nothing to do here!");
} }

View File

@ -31,7 +31,7 @@ namespace CodeWalker
try try
{ {
GTA5Keys.LoadFromPath(Settings.Default.GTAFolder, Settings.Default.Key); GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key);
KeysLoaded = true; KeysLoaded = true;
UpdateExtractStatus("Ready to extract."); UpdateExtractStatus("Ready to extract.");
} }

View File

@ -33,7 +33,7 @@ namespace CodeWalker
try try
{ {
GTA5Keys.LoadFromPath(Settings.Default.GTAFolder, Settings.Default.Key); GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key);
KeysLoaded = true; KeysLoaded = true;
UpdateDumpStatus("Ready."); UpdateDumpStatus("Ready.");
UpdateExtractStatus("Ready to extract."); UpdateExtractStatus("Ready to extract.");

View File

@ -31,7 +31,7 @@ namespace CodeWalker
try try
{ {
GTA5Keys.LoadFromPath(Settings.Default.GTAFolder, Settings.Default.Key); GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key);
KeysLoaded = true; KeysLoaded = true;
UpdateExtractStatus("Ready to extract."); UpdateExtractStatus("Ready to extract.");
} }
@ -163,6 +163,7 @@ namespace CodeWalker
if (asm) if (asm)
{ {
string asmfile = filebase + ".hlsl"; string asmfile = filebase + ".hlsl";
FxcParser.ParseShader(shader);
File.WriteAllText(asmfile, shader.Disassembly); File.WriteAllText(asmfile, shader.Disassembly);
} }
} }

View File

@ -32,7 +32,7 @@ namespace CodeWalker
try try
{ {
GTA5Keys.LoadFromPath(Settings.Default.GTAFolder, Settings.Default.Key); GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key);
KeysLoaded = true; KeysLoaded = true;
UpdateExtractStatus("Ready to extract."); UpdateExtractStatus("Ready to extract.");
} }

View File

@ -100,6 +100,7 @@ namespace CodeWalker.Forms
else else
{ {
ShaderPanel.Enabled = true; ShaderPanel.Enabled = true;
FxcParser.ParseShader(s);
if (!string.IsNullOrEmpty(s.LastError)) if (!string.IsNullOrEmpty(s.LastError))
{ {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();

50
GameFiles/FxcParser.cs Normal file
View File

@ -0,0 +1,50 @@
using SharpDX.D3DCompiler;
using System;
namespace CodeWalker.GameFiles
{
public static class FxcParser
{
public static bool ParseShader(FxcShader shader)
{
ShaderBytecode ByteCodeObj;
ShaderProfile ShaderProfile;
try
{
ByteCodeObj = new ShaderBytecode(shader.ByteCode);
ShaderProfile = ByteCodeObj.GetVersion();
switch (ShaderProfile.Version)
{
case ShaderVersion.VertexShader:
case ShaderVersion.PixelShader:
case ShaderVersion.GeometryShader:
//VersionMajor = br.ReadByte();//4,5 //appears to be shader model version
//VersionMinor = br.ReadByte(); //perhaps shader minor version
break;
default:
shader.VersionMajor = (byte)ShaderProfile.Major;
shader.VersionMinor = (byte)ShaderProfile.Minor;
break;
}
shader.Disassembly = ByteCodeObj.Disassemble();
}
catch (Exception ex)
{
shader.LastError += ex.ToString() + "\r\n";
return false;
}
return true;
}
}
}

View File

@ -0,0 +1,20 @@

using CodeWalker.Properties;
namespace CodeWalker.GameFiles
{
public static class GameFileCacheFactory
{
public static GameFileCache Create()
{
var s = Settings.Default;
return new GameFileCache(s.CacheSize, s.CacheTime, GTAFolder.CurrentGTAFolder, s.DLC, s.EnableMods, s.ExcludeFolders);
}
}
}

157
GameFiles/TextureFormats.cs Normal file
View File

@ -0,0 +1,157 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SharpDX.DXGI;
namespace CodeWalker.GameFiles
{
public static class TextureFormats
{
public static Format GetDXGIFormat(TextureFormat fmt)
{
Format format = Format.Unknown;
switch (fmt)
{
// compressed
case TextureFormat.D3DFMT_DXT1: format = Format.BC1_UNorm; break;
case TextureFormat.D3DFMT_DXT3: format = Format.BC2_UNorm; break;
case TextureFormat.D3DFMT_DXT5: format = Format.BC3_UNorm; break;
case TextureFormat.D3DFMT_ATI1: format = Format.BC4_UNorm; break;
case TextureFormat.D3DFMT_ATI2: format = Format.BC5_UNorm; break;
case TextureFormat.D3DFMT_BC7: format = Format.BC7_UNorm; break;
// uncompressed
case TextureFormat.D3DFMT_A1R5G5B5: format = Format.B5G5R5A1_UNorm; break;
case TextureFormat.D3DFMT_A8: format = Format.A8_UNorm; break;
case TextureFormat.D3DFMT_A8B8G8R8: format = Format.R8G8B8A8_UNorm; break;
case TextureFormat.D3DFMT_L8: format = Format.R8_UNorm; break;
case TextureFormat.D3DFMT_A8R8G8B8: format = Format.B8G8R8A8_UNorm; break;
}
return format;
}
public static int ByteSize(TextureFormat fmt)
{
switch (fmt)
{
// compressed
case TextureFormat.D3DFMT_DXT1: return 4;// BC1_UNorm
case TextureFormat.D3DFMT_DXT3: return 8;// BC2_UNorm
case TextureFormat.D3DFMT_DXT5: return 8;// BC3_UNorm
case TextureFormat.D3DFMT_ATI1: return 4;// BC4_UNorm
case TextureFormat.D3DFMT_ATI2: return 8;// BC5_UNorm
case TextureFormat.D3DFMT_BC7: return 8;// BC7_UNorm
// uncompressed
case TextureFormat.D3DFMT_A1R5G5B5: return 16;// B5G5R5A1_UNorm
case TextureFormat.D3DFMT_A8: return 8;// A8_UNorm
case TextureFormat.D3DFMT_A8B8G8R8: return 32;// R8G8B8A8_UNorm
case TextureFormat.D3DFMT_L8: return 8;// R8_UNorm
case TextureFormat.D3DFMT_A8R8G8B8: return 32;// B8G8R8A8_UNorm
default: return 0;
}
}
public static void ComputePitch(Format fmt, int width, int height, out int rowPitch, out int slicePitch, uint flags)
{
int nbw, nbh;
switch (fmt)
{
case Format.BC1_Typeless:
case Format.BC1_UNorm:
case Format.BC1_UNorm_SRgb:
case Format.BC4_Typeless:
case Format.BC4_UNorm:
case Format.BC4_SNorm:
nbw = Math.Max(1, (width + 3) / 4);
nbh = Math.Max(1, (height + 3) / 4);
rowPitch = nbw * 8;
slicePitch = rowPitch * nbh;
break;
case Format.BC2_Typeless:
case Format.BC2_UNorm:
case Format.BC2_UNorm_SRgb:
case Format.BC3_Typeless:
case Format.BC3_UNorm:
case Format.BC3_UNorm_SRgb:
case Format.BC5_Typeless:
case Format.BC5_UNorm:
case Format.BC5_SNorm:
case Format.BC6H_Typeless:
case Format.BC6H_Uf16:
case Format.BC6H_Sf16:
case Format.BC7_Typeless:
case Format.BC7_UNorm:
case Format.BC7_UNorm_SRgb:
nbw = Math.Max(1, (width + 3) / 4);
nbh = Math.Max(1, (height + 3) / 4);
rowPitch = nbw * 16;
slicePitch = rowPitch * nbh;
break;
case Format.R8G8_B8G8_UNorm:
case Format.G8R8_G8B8_UNorm:
case Format.YUY2:
rowPitch = ((width + 1) >> 1) * 4;
slicePitch = rowPitch * height;
break;
case Format.Y210:
case Format.Y216:
rowPitch = ((width + 1) >> 1) * 8;
slicePitch = rowPitch * height;
break;
case Format.NV12:
case Format.Opaque420:
rowPitch = ((width + 1) >> 1) * 2;
slicePitch = rowPitch * (height + ((height + 1) >> 1));
break;
case Format.P010:
case Format.P016:
//case Format.XBOX_DXGI_FORMAT_D16_UNORM_S8_UINT:
//case Format.XBOX_DXGI_FORMAT_R16_UNORM_X8_TYPELESS:
//case Format.XBOX_DXGI_FORMAT_X16_TYPELESS_G8_UINT:
rowPitch = ((width + 1) >> 1) * 4;
slicePitch = rowPitch * (height + ((height + 1) >> 1));
break;
case Format.NV11:
rowPitch = ((width + 3) >> 2) * 4;
slicePitch = rowPitch * height * 2;
break;
//case Format.WIN10_DXGI_FORMAT_P208:
// rowPitch = ((width + 1) >> 1) * 2;
// slicePitch = rowPitch * height * 2;
// break;
//case Format.WIN10_DXGI_FORMAT_V208:
// rowPitch = width;
// slicePitch = rowPitch * (height + (((height + 1) >> 1) * 2));
// break;
//case Format.WIN10_DXGI_FORMAT_V408:
// rowPitch = width;
// slicePitch = rowPitch * (height + ((height >> 1) * 4));
// break;
default:
int bpp = FormatHelper.SizeOfInBytes(fmt) * 8;
// Default byte alignment
rowPitch = (width * bpp + 7) / 8;
slicePitch = rowPitch * height;
break;
}
}
}
}

View File

@ -37,7 +37,7 @@ namespace CodeWalker
Task.Run(() => Task.Run(() =>
{ {
GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key); GTA5Keys.LoadFromPath(GTAFolder.CurrentGTAFolder, Settings.Default.Key);
GameFileCache gfc = new GameFileCache(); GameFileCache gfc = GameFileCacheFactory.Create();
gfc.DoFullStringIndex = true; gfc.DoFullStringIndex = true;
gfc.Init(UpdateStatus, UpdateStatus); gfc.Init(UpdateStatus, UpdateStatus);
IndexBuildComplete(); IndexBuildComplete();

View File

@ -86,7 +86,7 @@ namespace CodeWalker
} }
else else
{ {
GameFileCache = new GameFileCache(); GameFileCache = GameFileCacheFactory.Create();
new Thread(new ThreadStart(() => { new Thread(new ThreadStart(() => {
GameFileCache.Init(UpdateStatus, UpdateStatus); GameFileCache.Init(UpdateStatus, UpdateStatus);
RpfMan = GameFileCache.RpfMan; RpfMan = GameFileCache.RpfMan;

View File

@ -27,7 +27,7 @@ namespace CodeWalker.Rendering
public ShaderManager shaders; public ShaderManager shaders;
public Camera camera = new Camera(); public Camera camera;
private double currentRealTime = 0; private double currentRealTime = 0;
private float currentElapsedTime = 0; private float currentElapsedTime = 0;
@ -154,9 +154,12 @@ namespace CodeWalker.Rendering
gameFileCache = cache; gameFileCache = cache;
if (gameFileCache == null) if (gameFileCache == null)
{ {
gameFileCache = new GameFileCache(); gameFileCache = GameFileCacheFactory.Create();
} }
renderableCache = new RenderableCache(); renderableCache = new RenderableCache();
var s = Settings.Default;
camera = new Camera(s.CameraSmoothing, s.CameraSensitivity, s.CameraFieldOfView);
} }

View File

@ -86,6 +86,7 @@ namespace CodeWalker
{ {
CurrentGTAFolder = folder; CurrentGTAFolder = folder;
Settings.Default.GTAFolder = folder; Settings.Default.GTAFolder = folder;
Settings.Default.Save();
return true; return true;
} }

View File

@ -60,7 +60,7 @@ namespace CodeWalker
public GameFileCache GameFileCache { get { return gameFileCache; } } public GameFileCache GameFileCache { get { return gameFileCache; } }
GameFileCache gameFileCache = new GameFileCache(); GameFileCache gameFileCache = GameFileCacheFactory.Create();
WorldControlMode ControlMode = WorldControlMode.Free; WorldControlMode ControlMode = WorldControlMode.Free;