Compare commits
72 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c85873b729 | |||
| b146d251a7 | |||
| 3129d67fc1 | |||
| 850ba63a10 | |||
| 17b91984d6 | |||
| 7ab2cda120 | |||
| 4345885cc9 | |||
| 53720e37ab | |||
| 7c3cb36630 | |||
| c1cddce031 | |||
| 973a1076e4 | |||
| 089e164756 | |||
| c2b6691fd9 | |||
| 8dec094304 | |||
| bedee240be | |||
| d963d71b12 | |||
| 77a0c9c40a | |||
| f3e406983b | |||
| 08b7bfcf9a | |||
| 57e4f7cefd | |||
| c9cf2d188e | |||
| ab98585b6a | |||
| 075d53a455 | |||
| 432116d834 | |||
| caa45216ef | |||
| c9394cd957 | |||
| 46c0e8ffe1 | |||
| d14c232015 | |||
| 4002bdecb8 | |||
| 17259e00c7 | |||
| 44b02b92d8 | |||
| 251854cc41 | |||
| 6f7b77245d | |||
| 6d99f5ebf6 | |||
| f1f2430f97 | |||
| b52696c965 | |||
| 5fba52dc83 | |||
| dfb74baf79 | |||
| 978e90a403 | |||
| c17d7d6331 | |||
| 9fef18d6ea | |||
| ee0cd4ab52 | |||
| f904bc138b | |||
| 7ed5345b1b | |||
| d7f652d572 | |||
| 32ce032655 | |||
| e1cf36aa3c | |||
| f644396a15 | |||
| 3e77c34bd5 | |||
| 052c60f629 | |||
| a1f2e3e7fe | |||
| 32ee8b326f | |||
| 06ce479eb6 | |||
| 03f74bac64 | |||
| 344b675745 | |||
| 86590d95a5 | |||
| bbea1341b2 | |||
| ca60dd9834 | |||
| 7aa35b5b8c | |||
| bd2decdb8f | |||
| 9b2c85bcae | |||
| efbab7c43a | |||
| 729a8a8263 | |||
| 0ec29f62ca | |||
| 796317f9d9 | |||
| 7596dcc7cd | |||
| 422851cdab | |||
| ec0a2a47f1 | |||
| 8ce5b947f6 | |||
| 419ca63f9d | |||
| 6fdb0c7b0e | |||
| 4e97b4b898 |
@@ -1,51 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<TargetFrameworks>net472;netstandard2.0</TargetFrameworks>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<ProjectGuid>{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}</ProjectGuid>
|
|
||||||
<OutputType>Library</OutputType>
|
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<RootNamespace>AssetStudio.PInvoke</RootNamespace>
|
|
||||||
<AssemblyName>AssetStudio.PInvoke</AssemblyName>
|
|
||||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<Deterministic>true</Deterministic>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<Version>0.16.0.0</Version>
|
||||||
|
<AssemblyVersion>0.16.0.0</AssemblyVersion>
|
||||||
|
<FileVersion>0.16.0.0</FileVersion>
|
||||||
|
<Copyright>Copyright © Perfare 2020-2021; Copyright © hozuki 2020</Copyright>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<DebugType>pdbonly</DebugType>
|
</Project>
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="Microsoft.CSharp" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Net.Http" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="DllLoader.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
<Compile Include="Utf8StringHandle.cs" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
</Project>
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
@@ -26,7 +27,7 @@ namespace AssetStudio.PInvoke
|
|||||||
|
|
||||||
private static string GetDirectedDllDirectory()
|
private static string GetDirectedDllDirectory()
|
||||||
{
|
{
|
||||||
var localPath = new Uri(typeof(DllLoader).Assembly.CodeBase).LocalPath;
|
var localPath = Process.GetCurrentProcess().MainModule.FileName;
|
||||||
var localDir = Path.GetDirectoryName(localPath);
|
var localDir = Path.GetDirectoryName(localPath);
|
||||||
|
|
||||||
var subDir = Environment.Is64BitProcess ? "x64" : "x86";
|
var subDir = Environment.Is64BitProcess ? "x64" : "x86";
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
using System.Reflection;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
// 有关程序集的一般信息由以下
|
|
||||||
// 控制。更改这些特性值可修改
|
|
||||||
// 与程序集关联的信息。
|
|
||||||
[assembly: AssemblyTitle("AssetStudio.PInvoke")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
|
||||||
[assembly: AssemblyProduct("AssetStudio.PInvoke")]
|
|
||||||
[assembly: AssemblyCopyright("Copyright © 2020")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
|
|
||||||
// 将 ComVisible 设置为 false 会使此程序集中的类型
|
|
||||||
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
|
|
||||||
//请将此类型的 ComVisible 特性设置为 true。
|
|
||||||
[assembly: ComVisible(false)]
|
|
||||||
|
|
||||||
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
|
|
||||||
[assembly: Guid("40c796b5-88ce-4adc-acd6-2f4862b7f136")]
|
|
||||||
|
|
||||||
// 程序集的版本信息由下列四个值组成:
|
|
||||||
//
|
|
||||||
// 主版本
|
|
||||||
// 次版本
|
|
||||||
// 生成号
|
|
||||||
// 修订号
|
|
||||||
//
|
|
||||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
|
|
||||||
//通过使用 "*",如下所示:
|
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
||||||
+84
-84
@@ -1,29 +1,29 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio Version 16
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 16.0.29920.165
|
VisualStudioVersion = 16.0.31410.357
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssetStudio", "AssetStudio\AssetStudio.csproj", "{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AssetStudio", "AssetStudio\AssetStudio.csproj", "{422FEC21-EF60-4F29-AA56-95DFDA23C913}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssetStudioUtility", "AssetStudioUtility\AssetStudioUtility.csproj", "{80AEC261-21EE-4E4F-A93B-7A744DC84888}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AssetStudio.PInvoke", "AssetStudio.PInvoke\AssetStudio.PInvoke.csproj", "{0B2BE613-3049-4021-85D1-21C325F729F4}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssetStudioGUI", "AssetStudioGUI\AssetStudioGUI.csproj", "{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AssetStudioFBXWrapper", "AssetStudioFBXWrapper\AssetStudioFBXWrapper.csproj", "{E301AFEA-84E7-4BCE-8D65-A2576D8D105B}"
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AssetStudioFBXNative", "AssetStudioFBXNative\AssetStudioFBXNative.vcxproj", "{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssetStudioFBXWrapper", "AssetStudioFBXWrapper\AssetStudioFBXWrapper.csproj", "{BD76E63F-1517-47FA-8233-33E853A3ACEE}"
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027} = {11EA25A3-ED68-40EE-A9D0-7FDE3B583027}
|
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027} = {11EA25A3-ED68-40EE-A9D0-7FDE3B583027}
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Texture2DDecoderNative", "Texture2DDecoderNative\Texture2DDecoderNative.vcxproj", "{29356642-C46E-4144-83D8-22DC09D0D7FD}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AssetStudioGUI", "AssetStudioGUI\AssetStudioGUI.csproj", "{29EAD018-1C67-497A-AB8E-727D595AD756}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Texture2DDecoderWrapper", "Texture2DDecoderWrapper\Texture2DDecoderWrapper.csproj", "{2AFCE830-B463-49B3-A026-877E5EAFC0A4}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AssetStudioUtility", "AssetStudioUtility\AssetStudioUtility.csproj", "{65EAFFA3-01D3-4EF5-B092-8B4647E9A1FF}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Texture2DDecoderWrapper", "Texture2DDecoderWrapper\Texture2DDecoderWrapper.csproj", "{6438FEC1-56B0-488C-A5E2-FBDB23E9574B}"
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
{29356642-C46E-4144-83D8-22DC09D0D7FD} = {29356642-C46E-4144-83D8-22DC09D0D7FD}
|
{29356642-C46E-4144-83D8-22DC09D0D7FD} = {29356642-C46E-4144-83D8-22DC09D0D7FD}
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssetStudio.PInvoke", "AssetStudio.PInvoke\AssetStudio.PInvoke.csproj", "{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AssetStudioFBXNative", "AssetStudioFBXNative\AssetStudioFBXNative.vcxproj", "{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Texture2DDecoderNative", "Texture2DDecoderNative\Texture2DDecoderNative.vcxproj", "{29356642-C46E-4144-83D8-22DC09D0D7FD}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@@ -35,42 +35,78 @@ Global
|
|||||||
Release|x86 = Release|x86
|
Release|x86 = Release|x86
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{422FEC21-EF60-4F29-AA56-95DFDA23C913}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{422FEC21-EF60-4F29-AA56-95DFDA23C913}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{422FEC21-EF60-4F29-AA56-95DFDA23C913}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}.Debug|x64.Build.0 = Debug|Any CPU
|
{422FEC21-EF60-4F29-AA56-95DFDA23C913}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{422FEC21-EF60-4F29-AA56-95DFDA23C913}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}.Debug|x86.Build.0 = Debug|Any CPU
|
{422FEC21-EF60-4F29-AA56-95DFDA23C913}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{422FEC21-EF60-4F29-AA56-95DFDA23C913}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}.Release|Any CPU.Build.0 = Release|Any CPU
|
{422FEC21-EF60-4F29-AA56-95DFDA23C913}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}.Release|x64.ActiveCfg = Release|Any CPU
|
{422FEC21-EF60-4F29-AA56-95DFDA23C913}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}.Release|x64.Build.0 = Release|Any CPU
|
{422FEC21-EF60-4F29-AA56-95DFDA23C913}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}.Release|x86.ActiveCfg = Release|Any CPU
|
{422FEC21-EF60-4F29-AA56-95DFDA23C913}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}.Release|x86.Build.0 = Release|Any CPU
|
{422FEC21-EF60-4F29-AA56-95DFDA23C913}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{80AEC261-21EE-4E4F-A93B-7A744DC84888}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{0B2BE613-3049-4021-85D1-21C325F729F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{80AEC261-21EE-4E4F-A93B-7A744DC84888}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{0B2BE613-3049-4021-85D1-21C325F729F4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{80AEC261-21EE-4E4F-A93B-7A744DC84888}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{0B2BE613-3049-4021-85D1-21C325F729F4}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
{80AEC261-21EE-4E4F-A93B-7A744DC84888}.Debug|x64.Build.0 = Debug|Any CPU
|
{0B2BE613-3049-4021-85D1-21C325F729F4}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
{80AEC261-21EE-4E4F-A93B-7A744DC84888}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{0B2BE613-3049-4021-85D1-21C325F729F4}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
{80AEC261-21EE-4E4F-A93B-7A744DC84888}.Debug|x86.Build.0 = Debug|Any CPU
|
{0B2BE613-3049-4021-85D1-21C325F729F4}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{80AEC261-21EE-4E4F-A93B-7A744DC84888}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{0B2BE613-3049-4021-85D1-21C325F729F4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{80AEC261-21EE-4E4F-A93B-7A744DC84888}.Release|Any CPU.Build.0 = Release|Any CPU
|
{0B2BE613-3049-4021-85D1-21C325F729F4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{80AEC261-21EE-4E4F-A93B-7A744DC84888}.Release|x64.ActiveCfg = Release|Any CPU
|
{0B2BE613-3049-4021-85D1-21C325F729F4}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{80AEC261-21EE-4E4F-A93B-7A744DC84888}.Release|x64.Build.0 = Release|Any CPU
|
{0B2BE613-3049-4021-85D1-21C325F729F4}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{80AEC261-21EE-4E4F-A93B-7A744DC84888}.Release|x86.ActiveCfg = Release|Any CPU
|
{0B2BE613-3049-4021-85D1-21C325F729F4}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{80AEC261-21EE-4E4F-A93B-7A744DC84888}.Release|x86.Build.0 = Release|Any CPU
|
{0B2BE613-3049-4021-85D1-21C325F729F4}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{E301AFEA-84E7-4BCE-8D65-A2576D8D105B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{E301AFEA-84E7-4BCE-8D65-A2576D8D105B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{E301AFEA-84E7-4BCE-8D65-A2576D8D105B}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}.Debug|x64.Build.0 = Debug|Any CPU
|
{E301AFEA-84E7-4BCE-8D65-A2576D8D105B}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{E301AFEA-84E7-4BCE-8D65-A2576D8D105B}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}.Debug|x86.Build.0 = Debug|Any CPU
|
{E301AFEA-84E7-4BCE-8D65-A2576D8D105B}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{E301AFEA-84E7-4BCE-8D65-A2576D8D105B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}.Release|Any CPU.Build.0 = Release|Any CPU
|
{E301AFEA-84E7-4BCE-8D65-A2576D8D105B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}.Release|x64.ActiveCfg = Release|Any CPU
|
{E301AFEA-84E7-4BCE-8D65-A2576D8D105B}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}.Release|x64.Build.0 = Release|Any CPU
|
{E301AFEA-84E7-4BCE-8D65-A2576D8D105B}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}.Release|x86.ActiveCfg = Release|Any CPU
|
{E301AFEA-84E7-4BCE-8D65-A2576D8D105B}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}.Release|x86.Build.0 = Release|Any CPU
|
{E301AFEA-84E7-4BCE-8D65-A2576D8D105B}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{29EAD018-1C67-497A-AB8E-727D595AD756}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{29EAD018-1C67-497A-AB8E-727D595AD756}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{29EAD018-1C67-497A-AB8E-727D595AD756}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{29EAD018-1C67-497A-AB8E-727D595AD756}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{29EAD018-1C67-497A-AB8E-727D595AD756}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{29EAD018-1C67-497A-AB8E-727D595AD756}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{29EAD018-1C67-497A-AB8E-727D595AD756}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{29EAD018-1C67-497A-AB8E-727D595AD756}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{29EAD018-1C67-497A-AB8E-727D595AD756}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{29EAD018-1C67-497A-AB8E-727D595AD756}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{29EAD018-1C67-497A-AB8E-727D595AD756}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{29EAD018-1C67-497A-AB8E-727D595AD756}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{65EAFFA3-01D3-4EF5-B092-8B4647E9A1FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{65EAFFA3-01D3-4EF5-B092-8B4647E9A1FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{65EAFFA3-01D3-4EF5-B092-8B4647E9A1FF}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{65EAFFA3-01D3-4EF5-B092-8B4647E9A1FF}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{65EAFFA3-01D3-4EF5-B092-8B4647E9A1FF}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{65EAFFA3-01D3-4EF5-B092-8B4647E9A1FF}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{65EAFFA3-01D3-4EF5-B092-8B4647E9A1FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{65EAFFA3-01D3-4EF5-B092-8B4647E9A1FF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{65EAFFA3-01D3-4EF5-B092-8B4647E9A1FF}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{65EAFFA3-01D3-4EF5-B092-8B4647E9A1FF}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{65EAFFA3-01D3-4EF5-B092-8B4647E9A1FF}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{65EAFFA3-01D3-4EF5-B092-8B4647E9A1FF}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{6438FEC1-56B0-488C-A5E2-FBDB23E9574B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{6438FEC1-56B0-488C-A5E2-FBDB23E9574B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{6438FEC1-56B0-488C-A5E2-FBDB23E9574B}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{6438FEC1-56B0-488C-A5E2-FBDB23E9574B}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{6438FEC1-56B0-488C-A5E2-FBDB23E9574B}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{6438FEC1-56B0-488C-A5E2-FBDB23E9574B}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{6438FEC1-56B0-488C-A5E2-FBDB23E9574B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{6438FEC1-56B0-488C-A5E2-FBDB23E9574B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{6438FEC1-56B0-488C-A5E2-FBDB23E9574B}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{6438FEC1-56B0-488C-A5E2-FBDB23E9574B}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{6438FEC1-56B0-488C-A5E2-FBDB23E9574B}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{6438FEC1-56B0-488C-A5E2-FBDB23E9574B}.Release|x86.Build.0 = Release|Any CPU
|
||||||
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||||
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}.Debug|Any CPU.Build.0 = Debug|Win32
|
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}.Debug|Any CPU.Build.0 = Debug|Win32
|
||||||
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}.Debug|x64.ActiveCfg = Debug|x64
|
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
@@ -83,18 +119,6 @@ Global
|
|||||||
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}.Release|x64.Build.0 = Release|x64
|
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}.Release|x64.Build.0 = Release|x64
|
||||||
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}.Release|x86.ActiveCfg = Release|Win32
|
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}.Release|x86.Build.0 = Release|Win32
|
{11EA25A3-ED68-40EE-A9D0-7FDE3B583027}.Release|x86.Build.0 = Release|Win32
|
||||||
{BD76E63F-1517-47FA-8233-33E853A3ACEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{BD76E63F-1517-47FA-8233-33E853A3ACEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{BD76E63F-1517-47FA-8233-33E853A3ACEE}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{BD76E63F-1517-47FA-8233-33E853A3ACEE}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{BD76E63F-1517-47FA-8233-33E853A3ACEE}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{BD76E63F-1517-47FA-8233-33E853A3ACEE}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{BD76E63F-1517-47FA-8233-33E853A3ACEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{BD76E63F-1517-47FA-8233-33E853A3ACEE}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{BD76E63F-1517-47FA-8233-33E853A3ACEE}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{BD76E63F-1517-47FA-8233-33E853A3ACEE}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{BD76E63F-1517-47FA-8233-33E853A3ACEE}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{BD76E63F-1517-47FA-8233-33E853A3ACEE}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{29356642-C46E-4144-83D8-22DC09D0D7FD}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
{29356642-C46E-4144-83D8-22DC09D0D7FD}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||||
{29356642-C46E-4144-83D8-22DC09D0D7FD}.Debug|Any CPU.Build.0 = Debug|Win32
|
{29356642-C46E-4144-83D8-22DC09D0D7FD}.Debug|Any CPU.Build.0 = Debug|Win32
|
||||||
{29356642-C46E-4144-83D8-22DC09D0D7FD}.Debug|x64.ActiveCfg = Debug|x64
|
{29356642-C46E-4144-83D8-22DC09D0D7FD}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
@@ -107,35 +131,11 @@ Global
|
|||||||
{29356642-C46E-4144-83D8-22DC09D0D7FD}.Release|x64.Build.0 = Release|x64
|
{29356642-C46E-4144-83D8-22DC09D0D7FD}.Release|x64.Build.0 = Release|x64
|
||||||
{29356642-C46E-4144-83D8-22DC09D0D7FD}.Release|x86.ActiveCfg = Release|Win32
|
{29356642-C46E-4144-83D8-22DC09D0D7FD}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{29356642-C46E-4144-83D8-22DC09D0D7FD}.Release|x86.Build.0 = Release|Win32
|
{29356642-C46E-4144-83D8-22DC09D0D7FD}.Release|x86.Build.0 = Release|Win32
|
||||||
{2AFCE830-B463-49B3-A026-877E5EAFC0A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{2AFCE830-B463-49B3-A026-877E5EAFC0A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{2AFCE830-B463-49B3-A026-877E5EAFC0A4}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{2AFCE830-B463-49B3-A026-877E5EAFC0A4}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{2AFCE830-B463-49B3-A026-877E5EAFC0A4}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{2AFCE830-B463-49B3-A026-877E5EAFC0A4}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{2AFCE830-B463-49B3-A026-877E5EAFC0A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{2AFCE830-B463-49B3-A026-877E5EAFC0A4}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{2AFCE830-B463-49B3-A026-877E5EAFC0A4}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{2AFCE830-B463-49B3-A026-877E5EAFC0A4}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{2AFCE830-B463-49B3-A026-877E5EAFC0A4}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{2AFCE830-B463-49B3-A026-877E5EAFC0A4}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{40C796B5-88CE-4ADC-ACD6-2F4862B7F136}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {F8734F96-97B6-40CA-B791-6D5467F2F713}
|
SolutionGuid = {3C074481-9CDD-4780-B9F6-57BBC5092EA2}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|||||||
@@ -1,154 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<TargetFrameworks>net472;netstandard2.0</TargetFrameworks>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
<Version>0.16.0.0</Version>
|
||||||
<ProjectGuid>{7662F8C2-7BFD-442E-A948-A43B4F7EB06E}</ProjectGuid>
|
<AssemblyVersion>0.16.0.0</AssemblyVersion>
|
||||||
<OutputType>Library</OutputType>
|
<FileVersion>0.16.0.0</FileVersion>
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<Copyright>Copyright © Perfare 2018-2021</Copyright>
|
||||||
<RootNamespace>AssetStudio</RootNamespace>
|
|
||||||
<AssemblyName>AssetStudio</AssemblyName>
|
|
||||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<Deterministic>true</Deterministic>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
</Project>
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Drawing" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="Microsoft.CSharp" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Net.Http" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="7zip\Common\CommandLineParser.cs" />
|
|
||||||
<Compile Include="7zip\Common\CRC.cs" />
|
|
||||||
<Compile Include="7zip\Common\InBuffer.cs" />
|
|
||||||
<Compile Include="7zip\Common\OutBuffer.cs" />
|
|
||||||
<Compile Include="7zip\Compress\LZMA\LzmaBase.cs" />
|
|
||||||
<Compile Include="7zip\Compress\LZMA\LzmaDecoder.cs" />
|
|
||||||
<Compile Include="7zip\Compress\LZMA\LzmaEncoder.cs" />
|
|
||||||
<Compile Include="7zip\Compress\LZ\IMatchFinder.cs" />
|
|
||||||
<Compile Include="7zip\Compress\LZ\LzBinTree.cs" />
|
|
||||||
<Compile Include="7zip\Compress\LZ\LzInWindow.cs" />
|
|
||||||
<Compile Include="7zip\Compress\LZ\LzOutWindow.cs" />
|
|
||||||
<Compile Include="7zip\Compress\RangeCoder\RangeCoder.cs" />
|
|
||||||
<Compile Include="7zip\Compress\RangeCoder\RangeCoderBit.cs" />
|
|
||||||
<Compile Include="7zip\Compress\RangeCoder\RangeCoderBitTree.cs" />
|
|
||||||
<Compile Include="7zip\ICoder.cs" />
|
|
||||||
<Compile Include="AssetsManager.cs" />
|
|
||||||
<Compile Include="Brotli\BitReader.cs" />
|
|
||||||
<Compile Include="Brotli\BrotliInputStream.cs" />
|
|
||||||
<Compile Include="Brotli\BrotliRuntimeException.cs" />
|
|
||||||
<Compile Include="Brotli\Context.cs" />
|
|
||||||
<Compile Include="Brotli\Decode.cs" />
|
|
||||||
<Compile Include="Brotli\Dictionary.cs" />
|
|
||||||
<Compile Include="Brotli\Huffman.cs" />
|
|
||||||
<Compile Include="Brotli\HuffmanTreeGroup.cs" />
|
|
||||||
<Compile Include="Brotli\IntReader.cs" />
|
|
||||||
<Compile Include="Brotli\Prefix.cs" />
|
|
||||||
<Compile Include="Brotli\RunningState.cs" />
|
|
||||||
<Compile Include="Brotli\State.cs" />
|
|
||||||
<Compile Include="Brotli\Transform.cs" />
|
|
||||||
<Compile Include="Brotli\Utils.cs" />
|
|
||||||
<Compile Include="Brotli\WordTransformType.cs" />
|
|
||||||
<Compile Include="BuildTarget.cs" />
|
|
||||||
<Compile Include="BuildType.cs" />
|
|
||||||
<Compile Include="BundleFile.cs" />
|
|
||||||
<Compile Include="Classes\Animation.cs" />
|
|
||||||
<Compile Include="Classes\AnimationClip.cs" />
|
|
||||||
<Compile Include="Classes\Animator.cs" />
|
|
||||||
<Compile Include="Classes\AnimatorController.cs" />
|
|
||||||
<Compile Include="Classes\AnimatorOverrideController.cs" />
|
|
||||||
<Compile Include="Classes\AssetBundle.cs" />
|
|
||||||
<Compile Include="Classes\AudioClip.cs" />
|
|
||||||
<Compile Include="Classes\Avatar.cs" />
|
|
||||||
<Compile Include="Classes\Behaviour.cs" />
|
|
||||||
<Compile Include="Classes\BuildSettings.cs" />
|
|
||||||
<Compile Include="Classes\Component.cs" />
|
|
||||||
<Compile Include="Classes\EditorExtension.cs" />
|
|
||||||
<Compile Include="Classes\Font.cs" />
|
|
||||||
<Compile Include="Classes\GameObject.cs" />
|
|
||||||
<Compile Include="Classes\Material.cs" />
|
|
||||||
<Compile Include="Classes\Mesh.cs" />
|
|
||||||
<Compile Include="Classes\MeshFilter.cs" />
|
|
||||||
<Compile Include="Classes\MeshRenderer.cs" />
|
|
||||||
<Compile Include="Classes\MonoBehaviour.cs" />
|
|
||||||
<Compile Include="Classes\MonoScript.cs" />
|
|
||||||
<Compile Include="Classes\MovieTexture.cs" />
|
|
||||||
<Compile Include="Classes\NamedObject.cs" />
|
|
||||||
<Compile Include="Classes\Object.cs" />
|
|
||||||
<Compile Include="Classes\PlayerSettings.cs" />
|
|
||||||
<Compile Include="Classes\PPtr.cs" />
|
|
||||||
<Compile Include="Classes\RectTransform.cs" />
|
|
||||||
<Compile Include="Classes\Renderer.cs" />
|
|
||||||
<Compile Include="Classes\RuntimeAnimatorController.cs" />
|
|
||||||
<Compile Include="Classes\Shader.cs" />
|
|
||||||
<Compile Include="Classes\SkinnedMeshRenderer.cs" />
|
|
||||||
<Compile Include="Classes\Sprite.cs" />
|
|
||||||
<Compile Include="Classes\SpriteAtlas.cs" />
|
|
||||||
<Compile Include="Classes\TextAsset.cs" />
|
|
||||||
<Compile Include="Classes\Texture.cs" />
|
|
||||||
<Compile Include="Classes\Texture2D.cs" />
|
|
||||||
<Compile Include="Classes\Transform.cs" />
|
|
||||||
<Compile Include="Classes\VideoClip.cs" />
|
|
||||||
<Compile Include="ClassIDType.cs" />
|
|
||||||
<Compile Include="CommonString.cs" />
|
|
||||||
<Compile Include="EndianBinaryReader.cs" />
|
|
||||||
<Compile Include="Extensions\BinaryReaderExtensions.cs" />
|
|
||||||
<Compile Include="Extensions\BinaryWriterExtensions.cs" />
|
|
||||||
<Compile Include="Extensions\StreamExtensions.cs" />
|
|
||||||
<Compile Include="FileIdentifier.cs" />
|
|
||||||
<Compile Include="IImported.cs" />
|
|
||||||
<Compile Include="ILogger.cs" />
|
|
||||||
<Compile Include="ImportHelper.cs" />
|
|
||||||
<Compile Include="IProgress.cs" />
|
|
||||||
<Compile Include="LocalSerializedObjectIdentifier.cs" />
|
|
||||||
<Compile Include="Logger.cs" />
|
|
||||||
<Compile Include="Lz4DecoderStream.cs" />
|
|
||||||
<Compile Include="Math\Color.cs" />
|
|
||||||
<Compile Include="Math\Half.cs" />
|
|
||||||
<Compile Include="Math\HalfHelper.cs" />
|
|
||||||
<Compile Include="Math\Matrix4x4.cs" />
|
|
||||||
<Compile Include="Math\Quaternion.cs" />
|
|
||||||
<Compile Include="Math\Vector2.cs" />
|
|
||||||
<Compile Include="Math\Vector3.cs" />
|
|
||||||
<Compile Include="Math\Vector4.cs" />
|
|
||||||
<Compile Include="ObjectInfo.cs" />
|
|
||||||
<Compile Include="ObjectReader.cs" />
|
|
||||||
<Compile Include="Progress.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
<Compile Include="ResourceReader.cs" />
|
|
||||||
<Compile Include="SerializedFile.cs" />
|
|
||||||
<Compile Include="SerializedFileHeader.cs" />
|
|
||||||
<Compile Include="SerializedType.cs" />
|
|
||||||
<Compile Include="SevenZipHelper.cs" />
|
|
||||||
<Compile Include="StreamFile.cs" />
|
|
||||||
<Compile Include="TypeTreeHelper.cs" />
|
|
||||||
<Compile Include="TypeTreeNode.cs" />
|
|
||||||
<Compile Include="UType.cs" />
|
|
||||||
<Compile Include="WebFile.cs" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
</Project>
|
|
||||||
|
|||||||
@@ -2,13 +2,16 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
using static AssetStudio.ImportHelper;
|
using static AssetStudio.ImportHelper;
|
||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
public class AssetsManager
|
public class AssetsManager
|
||||||
{
|
{
|
||||||
|
public string SpecifyUnityVersion;
|
||||||
public List<SerializedFile> assetsFileList = new List<SerializedFile>();
|
public List<SerializedFile> assetsFileList = new List<SerializedFile>();
|
||||||
|
|
||||||
internal Dictionary<string, int> assetsFileIndexCache = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
|
internal Dictionary<string, int> assetsFileIndexCache = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
|
||||||
internal Dictionary<string, BinaryReader> resourceFileReaders = new Dictionary<string, BinaryReader>(StringComparer.OrdinalIgnoreCase);
|
internal Dictionary<string, BinaryReader> resourceFileReaders = new Dictionary<string, BinaryReader>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
@@ -58,42 +61,43 @@ namespace AssetStudio
|
|||||||
|
|
||||||
private void LoadFile(string fullName)
|
private void LoadFile(string fullName)
|
||||||
{
|
{
|
||||||
switch (CheckFileType(fullName, out var reader))
|
var reader = new FileReader(fullName);
|
||||||
|
switch (reader.FileType)
|
||||||
{
|
{
|
||||||
case FileType.AssetsFile:
|
case FileType.AssetsFile:
|
||||||
LoadAssetsFile(fullName, reader);
|
LoadAssetsFile(reader);
|
||||||
break;
|
break;
|
||||||
case FileType.BundleFile:
|
case FileType.BundleFile:
|
||||||
LoadBundleFile(fullName, reader);
|
LoadBundleFile(reader);
|
||||||
break;
|
break;
|
||||||
case FileType.WebFile:
|
case FileType.WebFile:
|
||||||
LoadWebFile(fullName, reader);
|
LoadWebFile(reader);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LoadAssetsFile(string fullName, EndianBinaryReader reader)
|
private void LoadAssetsFile(FileReader reader)
|
||||||
{
|
{
|
||||||
var fileName = Path.GetFileName(fullName);
|
if (!assetsFileListHash.Contains(reader.FileName))
|
||||||
if (!assetsFileListHash.Contains(fileName))
|
|
||||||
{
|
{
|
||||||
Logger.Info($"Loading {fileName}");
|
Logger.Info($"Loading {reader.FileName}");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var assetsFile = new SerializedFile(this, fullName, reader);
|
var assetsFile = new SerializedFile(reader, this);
|
||||||
|
CheckStrippedVersion(assetsFile);
|
||||||
assetsFileList.Add(assetsFile);
|
assetsFileList.Add(assetsFile);
|
||||||
assetsFileListHash.Add(assetsFile.fileName);
|
assetsFileListHash.Add(assetsFile.fileName);
|
||||||
|
|
||||||
foreach (var sharedFile in assetsFile.m_Externals)
|
foreach (var sharedFile in assetsFile.m_Externals)
|
||||||
{
|
{
|
||||||
var sharedFilePath = Path.GetDirectoryName(fullName) + "\\" + sharedFile.fileName;
|
|
||||||
var sharedFileName = sharedFile.fileName;
|
var sharedFileName = sharedFile.fileName;
|
||||||
|
|
||||||
if (!importFilesHash.Contains(sharedFileName))
|
if (!importFilesHash.Contains(sharedFileName))
|
||||||
{
|
{
|
||||||
|
var sharedFilePath = Path.Combine(Path.GetDirectoryName(reader.FullPath), sharedFileName);
|
||||||
if (!File.Exists(sharedFilePath))
|
if (!File.Exists(sharedFilePath))
|
||||||
{
|
{
|
||||||
var findFiles = Directory.GetFiles(Path.GetDirectoryName(fullName), sharedFileName, SearchOption.AllDirectories);
|
var findFiles = Directory.GetFiles(Path.GetDirectoryName(reader.FullPath), sharedFileName, SearchOption.AllDirectories);
|
||||||
if (findFiles.Length > 0)
|
if (findFiles.Length > 0)
|
||||||
{
|
{
|
||||||
sharedFilePath = findFiles[0];
|
sharedFilePath = findFiles[0];
|
||||||
@@ -108,10 +112,10 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
Logger.Error($"Error while reading assets file {reader.FileName}", e);
|
||||||
reader.Dispose();
|
reader.Dispose();
|
||||||
//Logger.Warning($"Unable to load assets file {fileName}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -120,59 +124,58 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LoadAssetsFromMemory(string fullName, EndianBinaryReader reader, string originalPath, string unityVersion = null)
|
private void LoadAssetsFromMemory(FileReader reader, string originalPath, string unityVersion = null)
|
||||||
{
|
{
|
||||||
var fileName = Path.GetFileName(fullName);
|
if (!assetsFileListHash.Contains(reader.FileName))
|
||||||
if (!assetsFileListHash.Contains(fileName))
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var assetsFile = new SerializedFile(this, fullName, reader);
|
var assetsFile = new SerializedFile(reader, this);
|
||||||
assetsFile.originalPath = originalPath;
|
assetsFile.originalPath = originalPath;
|
||||||
if (assetsFile.header.m_Version < 7)
|
if (!string.IsNullOrEmpty(unityVersion) && assetsFile.header.m_Version < SerializedFileFormatVersion.kUnknown_7)
|
||||||
{
|
{
|
||||||
assetsFile.SetVersion(unityVersion);
|
assetsFile.SetVersion(unityVersion);
|
||||||
}
|
}
|
||||||
|
CheckStrippedVersion(assetsFile);
|
||||||
assetsFileList.Add(assetsFile);
|
assetsFileList.Add(assetsFile);
|
||||||
assetsFileListHash.Add(assetsFile.fileName);
|
assetsFileListHash.Add(assetsFile.fileName);
|
||||||
}
|
}
|
||||||
catch
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
//Logger.Error($"Unable to load assets file {fileName} from {Path.GetFileName(originalPath)}");
|
Logger.Error($"Error while reading assets file {reader.FileName} from {Path.GetFileName(originalPath)}", e);
|
||||||
resourceFileReaders.Add(fileName, reader);
|
resourceFileReaders.Add(reader.FileName, reader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LoadBundleFile(string fullName, EndianBinaryReader reader, string parentPath = null)
|
private void LoadBundleFile(FileReader reader, string originalPath = null)
|
||||||
{
|
{
|
||||||
var fileName = Path.GetFileName(fullName);
|
Logger.Info("Loading " + reader.FileName);
|
||||||
Logger.Info("Loading " + fileName);
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var bundleFile = new BundleFile(reader, fullName);
|
var bundleFile = new BundleFile(reader);
|
||||||
foreach (var file in bundleFile.fileList)
|
foreach (var file in bundleFile.fileList)
|
||||||
{
|
{
|
||||||
var subReader = new EndianBinaryReader(file.stream);
|
var dummyPath = Path.Combine(Path.GetDirectoryName(reader.FullPath), file.fileName);
|
||||||
if (SerializedFile.IsSerializedFile(subReader))
|
var subReader = new FileReader(dummyPath, file.stream);
|
||||||
|
if (subReader.FileType == FileType.AssetsFile)
|
||||||
{
|
{
|
||||||
var dummyPath = Path.GetDirectoryName(fullName) + Path.DirectorySeparatorChar + file.fileName;
|
LoadAssetsFromMemory(subReader, originalPath ?? reader.FullPath, bundleFile.m_Header.unityRevision);
|
||||||
LoadAssetsFromMemory(dummyPath, subReader, parentPath ?? fullName, bundleFile.m_Header.unityRevision);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
resourceFileReaders.Add(file.fileName, subReader);
|
resourceFileReaders[file.fileName] = subReader; //TODO
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
/*var str = $"Unable to load bundle file {fileName}";
|
var str = $"Error while reading bundle file {reader.FileName}";
|
||||||
if (parentPath != null)
|
if (originalPath != null)
|
||||||
{
|
{
|
||||||
str += $" from {Path.GetFileName(parentPath)}";
|
str += $" from {Path.GetFileName(originalPath)}";
|
||||||
}
|
}
|
||||||
Logger.Error(str);*/
|
Logger.Error(str, e);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
@@ -180,36 +183,36 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LoadWebFile(string fullName, EndianBinaryReader reader)
|
private void LoadWebFile(FileReader reader)
|
||||||
{
|
{
|
||||||
var fileName = Path.GetFileName(fullName);
|
Logger.Info("Loading " + reader.FileName);
|
||||||
Logger.Info("Loading " + fileName);
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var webFile = new WebFile(reader);
|
var webFile = new WebFile(reader);
|
||||||
foreach (var file in webFile.fileList)
|
foreach (var file in webFile.fileList)
|
||||||
{
|
{
|
||||||
var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName;
|
var dummyPath = Path.Combine(Path.GetDirectoryName(reader.FullPath), file.fileName);
|
||||||
switch (CheckFileType(file.stream, out var fileReader))
|
var subReader = new FileReader(dummyPath, file.stream);
|
||||||
|
switch (subReader.FileType)
|
||||||
{
|
{
|
||||||
case FileType.AssetsFile:
|
case FileType.AssetsFile:
|
||||||
LoadAssetsFromMemory(dummyPath, fileReader, fullName);
|
LoadAssetsFromMemory(subReader, reader.FullPath);
|
||||||
break;
|
break;
|
||||||
case FileType.BundleFile:
|
case FileType.BundleFile:
|
||||||
LoadBundleFile(dummyPath, fileReader, fullName);
|
LoadBundleFile(subReader, reader.FullPath);
|
||||||
break;
|
break;
|
||||||
case FileType.WebFile:
|
case FileType.WebFile:
|
||||||
LoadWebFile(dummyPath, fileReader);
|
LoadWebFile(subReader);
|
||||||
break;
|
break;
|
||||||
case FileType.ResourceFile:
|
case FileType.ResourceFile:
|
||||||
resourceFileReaders.Add(file.fileName, fileReader);
|
resourceFileReaders[file.fileName] = subReader; //TODO
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
//Logger.Error($"Unable to load web file {fileName}");
|
Logger.Error($"Error while reading web file {reader.FileName}", e);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
@@ -217,6 +220,18 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void CheckStrippedVersion(SerializedFile assetsFile)
|
||||||
|
{
|
||||||
|
if (assetsFile.IsVersionStripped && string.IsNullOrEmpty(SpecifyUnityVersion))
|
||||||
|
{
|
||||||
|
throw new Exception("The Unity version has been stripped, please set the version in the options");
|
||||||
|
}
|
||||||
|
if (!string.IsNullOrEmpty(SpecifyUnityVersion))
|
||||||
|
{
|
||||||
|
assetsFile.SetVersion(SpecifyUnityVersion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
foreach (var assetsFile in assetsFileList)
|
foreach (var assetsFile in assetsFileList)
|
||||||
@@ -333,6 +348,9 @@ namespace AssetStudio
|
|||||||
case ClassIDType.VideoClip:
|
case ClassIDType.VideoClip:
|
||||||
obj = new VideoClip(objectReader);
|
obj = new VideoClip(objectReader);
|
||||||
break;
|
break;
|
||||||
|
case ClassIDType.ResourceManager:
|
||||||
|
obj = new ResourceManager(objectReader);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
obj = new Object(objectReader);
|
obj = new Object(objectReader);
|
||||||
break;
|
break;
|
||||||
@@ -341,13 +359,13 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
/*var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
sb.AppendLine("Unable to load object")
|
sb.AppendLine("Unable to load object")
|
||||||
.AppendLine($"Assets {assetsFile.fileName}")
|
.AppendLine($"Assets {assetsFile.fileName}")
|
||||||
.AppendLine($"Type {objectReader.type}")
|
.AppendLine($"Type {objectReader.type}")
|
||||||
.AppendLine($"PathID {objectInfo.m_PathID}")
|
.AppendLine($"PathID {objectInfo.m_PathID}")
|
||||||
.Append(e);
|
.Append(e);
|
||||||
Logger.Error(sb.ToString());*/
|
Logger.Error(sb.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
Progress.Report(++i, progressCount);
|
Progress.Report(++i, progressCount);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
public enum BuildTarget
|
public enum BuildTarget
|
||||||
{
|
{
|
||||||
UnknownPlatform = 3716,
|
NoTarget = -2,
|
||||||
DashboardWidget = 1,
|
DashboardWidget = 1,
|
||||||
StandaloneOSX = 2,
|
StandaloneOSX = 2,
|
||||||
StandaloneOSXPPC = 3,
|
StandaloneOSXPPC = 3,
|
||||||
@@ -42,6 +42,12 @@ namespace AssetStudio
|
|||||||
WiiU,
|
WiiU,
|
||||||
tvOS,
|
tvOS,
|
||||||
Switch,
|
Switch,
|
||||||
NoTarget = -2
|
Lumin,
|
||||||
|
Stadia,
|
||||||
|
CloudRendering,
|
||||||
|
GameCoreXboxSeries,
|
||||||
|
GameCoreXboxOne,
|
||||||
|
PS5,
|
||||||
|
UnknownPlatform = 9999
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+29
-21
@@ -41,30 +41,37 @@ namespace AssetStudio
|
|||||||
|
|
||||||
public StreamFile[] fileList;
|
public StreamFile[] fileList;
|
||||||
|
|
||||||
public BundleFile(EndianBinaryReader reader, string path)
|
public BundleFile(FileReader reader)
|
||||||
{
|
{
|
||||||
m_Header = new Header();
|
m_Header = new Header();
|
||||||
m_Header.signature = reader.ReadStringToNull();
|
m_Header.signature = reader.ReadStringToNull();
|
||||||
|
m_Header.version = reader.ReadUInt32();
|
||||||
|
m_Header.unityVersion = reader.ReadStringToNull();
|
||||||
|
m_Header.unityRevision = reader.ReadStringToNull();
|
||||||
switch (m_Header.signature)
|
switch (m_Header.signature)
|
||||||
{
|
{
|
||||||
case "UnityArchive":
|
case "UnityArchive":
|
||||||
break; //TODO
|
break; //TODO
|
||||||
case "UnityWeb":
|
case "UnityWeb":
|
||||||
case "UnityRaw":
|
case "UnityRaw":
|
||||||
|
if (m_Header.version == 6)
|
||||||
|
{
|
||||||
|
goto case "UnityFS";
|
||||||
|
}
|
||||||
ReadHeaderAndBlocksInfo(reader);
|
ReadHeaderAndBlocksInfo(reader);
|
||||||
using (var blocksStream = CreateBlocksStream(path))
|
using (var blocksStream = CreateBlocksStream(reader.FullPath))
|
||||||
{
|
{
|
||||||
ReadBlocksAndDirectory(reader, blocksStream);
|
ReadBlocksAndDirectory(reader, blocksStream);
|
||||||
ReadFiles(blocksStream, path);
|
ReadFiles(blocksStream, reader.FullPath);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "UnityFS":
|
case "UnityFS":
|
||||||
ReadHeader(reader);
|
ReadHeader(reader);
|
||||||
ReadBlocksInfoAndDirectory(reader);
|
ReadBlocksInfoAndDirectory(reader);
|
||||||
using (var blocksStream = CreateBlocksStream(path))
|
using (var blocksStream = CreateBlocksStream(reader.FullPath))
|
||||||
{
|
{
|
||||||
ReadBlocks(reader, blocksStream);
|
ReadBlocks(reader, blocksStream);
|
||||||
ReadFiles(blocksStream, path);
|
ReadFiles(blocksStream, reader.FullPath);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -73,16 +80,13 @@ namespace AssetStudio
|
|||||||
private void ReadHeaderAndBlocksInfo(EndianBinaryReader reader)
|
private void ReadHeaderAndBlocksInfo(EndianBinaryReader reader)
|
||||||
{
|
{
|
||||||
var isCompressed = m_Header.signature == "UnityWeb";
|
var isCompressed = m_Header.signature == "UnityWeb";
|
||||||
m_Header.version = reader.ReadUInt32();
|
|
||||||
m_Header.unityVersion = reader.ReadStringToNull();
|
|
||||||
m_Header.unityRevision = reader.ReadStringToNull();
|
|
||||||
if (m_Header.version >= 4)
|
if (m_Header.version >= 4)
|
||||||
{
|
{
|
||||||
var hash = reader.ReadBytes(16);
|
var hash = reader.ReadBytes(16);
|
||||||
var crc = reader.ReadUInt32();
|
var crc = reader.ReadUInt32();
|
||||||
}
|
}
|
||||||
var minimumStreamedBytes = reader.ReadUInt32();
|
var minimumStreamedBytes = reader.ReadUInt32();
|
||||||
var headerSize = reader.ReadUInt32();
|
m_Header.size = reader.ReadUInt32();
|
||||||
var numberOfLevelsToDownloadBeforeStreaming = reader.ReadUInt32();
|
var numberOfLevelsToDownloadBeforeStreaming = reader.ReadUInt32();
|
||||||
var levelCount = reader.ReadInt32();
|
var levelCount = reader.ReadInt32();
|
||||||
m_BlocksInfo = new StorageBlock[1];
|
m_BlocksInfo = new StorageBlock[1];
|
||||||
@@ -107,7 +111,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
var fileInfoHeaderSize = reader.ReadUInt32();
|
var fileInfoHeaderSize = reader.ReadUInt32();
|
||||||
}
|
}
|
||||||
reader.Position = headerSize;
|
reader.Position = m_Header.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Stream CreateBlocksStream(string path)
|
private Stream CreateBlocksStream(string path)
|
||||||
@@ -116,7 +120,7 @@ namespace AssetStudio
|
|||||||
var uncompressedSizeSum = m_BlocksInfo.Sum(x => x.uncompressedSize);
|
var uncompressedSizeSum = m_BlocksInfo.Sum(x => x.uncompressedSize);
|
||||||
if (uncompressedSizeSum >= int.MaxValue)
|
if (uncompressedSizeSum >= int.MaxValue)
|
||||||
{
|
{
|
||||||
/*var memoryMappedFile = MemoryMappedFile.CreateNew(Path.GetFileName(path), uncompressedSizeSum);
|
/*var memoryMappedFile = MemoryMappedFile.CreateNew(null, uncompressedSizeSum);
|
||||||
assetsDataStream = memoryMappedFile.CreateViewStream();*/
|
assetsDataStream = memoryMappedFile.CreateViewStream();*/
|
||||||
blocksStream = new FileStream(path + ".temp", FileMode.Create, FileAccess.ReadWrite, FileShare.None, 4096, FileOptions.DeleteOnClose);
|
blocksStream = new FileStream(path + ".temp", FileMode.Create, FileAccess.ReadWrite, FileShare.None, 4096, FileOptions.DeleteOnClose);
|
||||||
}
|
}
|
||||||
@@ -167,14 +171,15 @@ namespace AssetStudio
|
|||||||
var node = m_DirectoryInfo[i];
|
var node = m_DirectoryInfo[i];
|
||||||
var file = new StreamFile();
|
var file = new StreamFile();
|
||||||
fileList[i] = file;
|
fileList[i] = file;
|
||||||
|
file.path = node.path;
|
||||||
file.fileName = Path.GetFileName(node.path);
|
file.fileName = Path.GetFileName(node.path);
|
||||||
if (node.size >= int.MaxValue)
|
if (node.size >= int.MaxValue)
|
||||||
{
|
{
|
||||||
/*var memoryMappedFile = MemoryMappedFile.CreateNew(file.fileName, entryinfo_size);
|
/*var memoryMappedFile = MemoryMappedFile.CreateNew(null, entryinfo_size);
|
||||||
file.stream = memoryMappedFile.CreateViewStream();*/
|
file.stream = memoryMappedFile.CreateViewStream();*/
|
||||||
var extractPath = path + "_unpacked" + Path.DirectorySeparatorChar;
|
var extractPath = path + "_unpacked" + Path.DirectorySeparatorChar;
|
||||||
Directory.CreateDirectory(extractPath);
|
Directory.CreateDirectory(extractPath);
|
||||||
file.stream = File.Create(extractPath + file.fileName);
|
file.stream = new FileStream(extractPath + file.fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -188,18 +193,23 @@ namespace AssetStudio
|
|||||||
|
|
||||||
private void ReadHeader(EndianBinaryReader reader)
|
private void ReadHeader(EndianBinaryReader reader)
|
||||||
{
|
{
|
||||||
m_Header.version = reader.ReadUInt32();
|
|
||||||
m_Header.unityVersion = reader.ReadStringToNull();
|
|
||||||
m_Header.unityRevision = reader.ReadStringToNull();
|
|
||||||
m_Header.size = reader.ReadInt64();
|
m_Header.size = reader.ReadInt64();
|
||||||
m_Header.compressedBlocksInfoSize = reader.ReadUInt32();
|
m_Header.compressedBlocksInfoSize = reader.ReadUInt32();
|
||||||
m_Header.uncompressedBlocksInfoSize = reader.ReadUInt32();
|
m_Header.uncompressedBlocksInfoSize = reader.ReadUInt32();
|
||||||
m_Header.flags = reader.ReadUInt32();
|
m_Header.flags = reader.ReadUInt32();
|
||||||
|
if (m_Header.signature != "UnityFS")
|
||||||
|
{
|
||||||
|
reader.ReadByte();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ReadBlocksInfoAndDirectory(EndianBinaryReader reader)
|
private void ReadBlocksInfoAndDirectory(EndianBinaryReader reader)
|
||||||
{
|
{
|
||||||
byte[] blocksInfoBytes;
|
byte[] blocksInfoBytes;
|
||||||
|
if (m_Header.version >= 7)
|
||||||
|
{
|
||||||
|
reader.AlignStream(16);
|
||||||
|
}
|
||||||
if ((m_Header.flags & 0x80) != 0) //kArchiveBlocksInfoAtTheEnd
|
if ((m_Header.flags & 0x80) != 0) //kArchiveBlocksInfoAtTheEnd
|
||||||
{
|
{
|
||||||
var position = reader.Position;
|
var position = reader.Position;
|
||||||
@@ -209,10 +219,6 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
else //0x40 kArchiveBlocksAndDirectoryInfoCombined
|
else //0x40 kArchiveBlocksAndDirectoryInfoCombined
|
||||||
{
|
{
|
||||||
if (m_Header.version >= 7)
|
|
||||||
{
|
|
||||||
reader.AlignStream(16);
|
|
||||||
}
|
|
||||||
blocksInfoBytes = reader.ReadBytes((int)m_Header.compressedBlocksInfoSize);
|
blocksInfoBytes = reader.ReadBytes((int)m_Header.compressedBlocksInfoSize);
|
||||||
}
|
}
|
||||||
var blocksInfoCompressedStream = new MemoryStream(blocksInfoBytes);
|
var blocksInfoCompressedStream = new MemoryStream(blocksInfoBytes);
|
||||||
@@ -226,7 +232,9 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
case 1: //LZMA
|
case 1: //LZMA
|
||||||
{
|
{
|
||||||
blocksInfoUncompresseddStream = SevenZipHelper.StreamDecompress(blocksInfoCompressedStream);
|
blocksInfoUncompresseddStream = new MemoryStream((int)(m_Header.uncompressedBlocksInfoSize));
|
||||||
|
SevenZipHelper.StreamDecompress(blocksInfoCompressedStream, blocksInfoUncompresseddStream, m_Header.compressedBlocksInfoSize, m_Header.uncompressedBlocksInfoSize);
|
||||||
|
blocksInfoUncompresseddStream.Position = 0;
|
||||||
blocksInfoCompressedStream.Close();
|
blocksInfoCompressedStream.Close();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
+103
-10
@@ -1,4 +1,5 @@
|
|||||||
namespace AssetStudio
|
// official Class ID Reference: https://docs.unity3d.com/Manual/ClassIDReference.html
|
||||||
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
public enum ClassIDType
|
public enum ClassIDType
|
||||||
{
|
{
|
||||||
@@ -26,7 +27,7 @@
|
|||||||
ParticleRenderer = 26,
|
ParticleRenderer = 26,
|
||||||
Texture = 27,
|
Texture = 27,
|
||||||
Texture2D = 28,
|
Texture2D = 28,
|
||||||
SceneSettings = 29,
|
OcclusionCullingSettings = 29,
|
||||||
GraphicsSettings = 30,
|
GraphicsSettings = 30,
|
||||||
MeshFilter = 33,
|
MeshFilter = 33,
|
||||||
OcclusionPortal = 41,
|
OcclusionPortal = 41,
|
||||||
@@ -49,7 +50,7 @@
|
|||||||
PhysicsMaterial2D = 62,
|
PhysicsMaterial2D = 62,
|
||||||
MeshCollider = 64,
|
MeshCollider = 64,
|
||||||
BoxCollider = 65,
|
BoxCollider = 65,
|
||||||
SpriteCollider2D = 66,
|
CompositeCollider2D = 66,
|
||||||
EdgeCollider2D = 68,
|
EdgeCollider2D = 68,
|
||||||
CapsuleCollider2D = 70,
|
CapsuleCollider2D = 70,
|
||||||
ComputeShader = 72,
|
ComputeShader = 72,
|
||||||
@@ -92,6 +93,7 @@
|
|||||||
FlareLayer = 124,
|
FlareLayer = 124,
|
||||||
HaloLayer = 125,
|
HaloLayer = 125,
|
||||||
NavMeshAreas = 126,
|
NavMeshAreas = 126,
|
||||||
|
NavMeshProjectSettings = 126,
|
||||||
HaloManager = 127,
|
HaloManager = 127,
|
||||||
Font = 128,
|
Font = 128,
|
||||||
PlayerSettings = 129,
|
PlayerSettings = 129,
|
||||||
@@ -158,7 +160,7 @@
|
|||||||
BlendTree = 206,
|
BlendTree = 206,
|
||||||
Motion = 207,
|
Motion = 207,
|
||||||
NavMeshObstacle = 208,
|
NavMeshObstacle = 208,
|
||||||
TerrainInstance = 210,
|
SortingGroup = 210,
|
||||||
SpriteRenderer = 212,
|
SpriteRenderer = 212,
|
||||||
Sprite = 213,
|
Sprite = 213,
|
||||||
CachedSpriteAtlas = 214,
|
CachedSpriteAtlas = 214,
|
||||||
@@ -216,15 +218,19 @@
|
|||||||
PerformanceReportingManager = 305,
|
PerformanceReportingManager = 305,
|
||||||
UnityConnectSettings = 310,
|
UnityConnectSettings = 310,
|
||||||
AvatarMask = 319,
|
AvatarMask = 319,
|
||||||
|
PlayableDirector = 320,
|
||||||
VideoPlayer = 328,
|
VideoPlayer = 328,
|
||||||
VideoClip = 329,
|
VideoClip = 329,
|
||||||
|
ParticleSystemForceField = 330,
|
||||||
|
SpriteMask = 331,
|
||||||
|
WorldAnchor = 362,
|
||||||
OcclusionCullingData = 363,
|
OcclusionCullingData = 363,
|
||||||
//kLargestRuntimeClassID = 364
|
//kLargestRuntimeClassID = 364
|
||||||
SmallestEditorClassID = 1000,
|
SmallestEditorClassID = 1000,
|
||||||
Prefab = 1001,
|
PrefabInstance = 1001,
|
||||||
EditorExtensionImpl = 1002,
|
EditorExtensionImpl = 1002,
|
||||||
AssetImporter = 1003,
|
AssetImporter = 1003,
|
||||||
AssetDatabase = 1004,
|
AssetDatabaseV1 = 1004,
|
||||||
Mesh3DSImporter = 1005,
|
Mesh3DSImporter = 1005,
|
||||||
TextureImporter = 1006,
|
TextureImporter = 1006,
|
||||||
ShaderImporter = 1007,
|
ShaderImporter = 1007,
|
||||||
@@ -259,13 +265,13 @@
|
|||||||
AnimatorState = 1102,
|
AnimatorState = 1102,
|
||||||
HumanTemplate = 1105,
|
HumanTemplate = 1105,
|
||||||
AnimatorStateMachine = 1107,
|
AnimatorStateMachine = 1107,
|
||||||
PreviewAssetType = 1108,
|
PreviewAnimationClip = 1108,
|
||||||
AnimatorTransition = 1109,
|
AnimatorTransition = 1109,
|
||||||
SpeedTreeImporter = 1110,
|
SpeedTreeImporter = 1110,
|
||||||
AnimatorTransitionBase = 1111,
|
AnimatorTransitionBase = 1111,
|
||||||
SubstanceImporter = 1112,
|
SubstanceImporter = 1112,
|
||||||
LightmapParameters = 1113,
|
LightmapParameters = 1113,
|
||||||
LightmapSnapshot = 1120,
|
LightingDataAsset = 1120,
|
||||||
GISRaster = 1121,
|
GISRaster = 1121,
|
||||||
GISRasterImporter = 1122,
|
GISRasterImporter = 1122,
|
||||||
CadImporter = 1123,
|
CadImporter = 1123,
|
||||||
@@ -276,11 +282,98 @@
|
|||||||
ActivationLogComponent = 2000,
|
ActivationLogComponent = 2000,
|
||||||
//kLargestEditorClassID = 2001
|
//kLargestEditorClassID = 2001
|
||||||
//kClassIdOutOfHierarchy = 100000
|
//kClassIdOutOfHierarchy = 100000
|
||||||
SubDerived = 367388927,
|
//int = 100000,
|
||||||
|
//bool = 100001,
|
||||||
|
//float = 100002,
|
||||||
|
MonoObject = 100003,
|
||||||
|
Collision = 100004,
|
||||||
|
Vector3f = 100005,
|
||||||
|
RootMotionData = 100006,
|
||||||
|
Collision2D = 100007,
|
||||||
|
AudioMixerLiveUpdateFloat = 100008,
|
||||||
|
AudioMixerLiveUpdateBool = 100009,
|
||||||
|
Polygon2D = 100010,
|
||||||
|
//void = 100011,
|
||||||
|
TilemapCollider2D = 19719996,
|
||||||
|
AssetImporterLog = 41386430,
|
||||||
|
VFXRenderer = 73398921,
|
||||||
|
SerializableManagedRefTestClass = 76251197,
|
||||||
|
Grid = 156049354,
|
||||||
|
ScenesUsingAssets = 156483287,
|
||||||
|
ArticulationBody = 171741748,
|
||||||
|
Preset = 181963792,
|
||||||
|
EmptyObject = 277625683,
|
||||||
|
IConstraint = 285090594,
|
||||||
|
TestObjectWithSpecialLayoutOne = 293259124,
|
||||||
|
AssemblyDefinitionReferenceImporter = 294290339,
|
||||||
SiblingDerived = 334799969,
|
SiblingDerived = 334799969,
|
||||||
|
TestObjectWithSerializedMapStringNonAlignedStruct = 342846651,
|
||||||
|
SubDerived = 367388927,
|
||||||
|
AssetImportInProgressProxy = 369655926,
|
||||||
|
PluginBuildInfo = 382020655,
|
||||||
|
EditorProjectAccess = 426301858,
|
||||||
|
PrefabImporter = 468431735,
|
||||||
|
TestObjectWithSerializedArray = 478637458,
|
||||||
|
TestObjectWithSerializedAnimationCurve = 478637459,
|
||||||
|
TilemapRenderer = 483693784,
|
||||||
|
ScriptableCamera = 488575907,
|
||||||
|
SpriteAtlasAsset = 612988286,
|
||||||
|
SpriteAtlasDatabase = 638013454,
|
||||||
|
AudioBuildInfo = 641289076,
|
||||||
|
CachedSpriteAtlasRuntimeData = 644342135,
|
||||||
|
RendererFake = 646504946,
|
||||||
|
AssemblyDefinitionReferenceAsset = 662584278,
|
||||||
|
BuiltAssetBundleInfoSet = 668709126,
|
||||||
SpriteAtlas = 687078895,
|
SpriteAtlas = 687078895,
|
||||||
|
RayTracingShaderImporter = 747330370,
|
||||||
|
RayTracingShader = 825902497,
|
||||||
|
LightingSettings = 850595691,
|
||||||
|
PlatformModuleSetup = 877146078,
|
||||||
|
VersionControlSettings = 890905787,
|
||||||
|
AimConstraint = 895512359,
|
||||||
|
VFXManager = 937362698,
|
||||||
|
VisualEffectSubgraph = 994735392,
|
||||||
|
VisualEffectSubgraphOperator = 994735403,
|
||||||
|
VisualEffectSubgraphBlock = 994735404,
|
||||||
|
LocalizationImporter = 1027052791,
|
||||||
Derived = 1091556383,
|
Derived = 1091556383,
|
||||||
|
PropertyModificationsTargetTestObject = 1111377672,
|
||||||
|
ReferencesArtifactGenerator = 1114811875,
|
||||||
|
AssemblyDefinitionAsset = 1152215463,
|
||||||
|
SceneVisibilityState = 1154873562,
|
||||||
|
LookAtConstraint = 1183024399,
|
||||||
|
SpriteAtlasImporter = 1210832254,
|
||||||
|
MultiArtifactTestImporter = 1223240404,
|
||||||
|
GameObjectRecorder = 1268269756,
|
||||||
|
LightingDataAssetParent = 1325145578,
|
||||||
|
PresetManager = 1386491679,
|
||||||
|
TestObjectWithSpecialLayoutTwo = 1392443030,
|
||||||
|
StreamingManager = 1403656975,
|
||||||
LowerResBlitTexture = 1480428607,
|
LowerResBlitTexture = 1480428607,
|
||||||
RenderPassAttachment = 1571458007
|
StreamingController = 1542919678,
|
||||||
|
RenderPassAttachment = 1571458007,
|
||||||
|
TestObjectVectorPairStringBool = 1628831178,
|
||||||
|
GridLayout = 1742807556,
|
||||||
|
AssemblyDefinitionImporter = 1766753193,
|
||||||
|
ParentConstraint = 1773428102,
|
||||||
|
FakeComponent = 1803986026,
|
||||||
|
PositionConstraint = 1818360608,
|
||||||
|
RotationConstraint = 1818360609,
|
||||||
|
ScaleConstraint = 1818360610,
|
||||||
|
Tilemap = 1839735485,
|
||||||
|
PackageManifest = 1896753125,
|
||||||
|
PackageManifestImporter = 1896753126,
|
||||||
|
TerrainLayer = 1953259897,
|
||||||
|
SpriteShapeRenderer = 1971053207,
|
||||||
|
NativeObjectType = 1977754360,
|
||||||
|
TestObjectWithSerializedMapStringBool = 1981279845,
|
||||||
|
SerializableManagedHost = 1995898324,
|
||||||
|
VisualEffectAsset = 2058629509,
|
||||||
|
VisualEffectImporter = 2058629510,
|
||||||
|
VisualEffectResource = 2058629511,
|
||||||
|
VisualEffectObject = 2059678085,
|
||||||
|
VisualEffect = 2083052967,
|
||||||
|
LocalizationAsset = 2083778819,
|
||||||
|
ScriptedImporter = 2089858483
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -637,6 +637,50 @@ namespace AssetStudio
|
|||||||
m_Binding = new ValueArrayConstant(reader);
|
m_Binding = new ValueArrayConstant(reader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AnimationClipBindingConstant ConvertValueArrayToGenericBinding()
|
||||||
|
{
|
||||||
|
var bindings = new AnimationClipBindingConstant();
|
||||||
|
var genericBindings = new List<GenericBinding>();
|
||||||
|
var values = m_Binding;
|
||||||
|
for (int i = 0; i < values.m_ValueArray.Length;)
|
||||||
|
{
|
||||||
|
var curveID = values.m_ValueArray[i].m_ID;
|
||||||
|
var curveTypeID = values.m_ValueArray[i].m_TypeID;
|
||||||
|
var binding = new GenericBinding();
|
||||||
|
genericBindings.Add(binding);
|
||||||
|
if (curveTypeID == 4174552735) //CRC(PositionX))
|
||||||
|
{
|
||||||
|
binding.path = curveID;
|
||||||
|
binding.attribute = 1; //kBindTransformPosition
|
||||||
|
binding.typeID = ClassIDType.Transform;
|
||||||
|
i += 3;
|
||||||
|
}
|
||||||
|
else if (curveTypeID == 2211994246) //CRC(QuaternionX))
|
||||||
|
{
|
||||||
|
binding.path = curveID;
|
||||||
|
binding.attribute = 2; //kBindTransformRotation
|
||||||
|
binding.typeID = ClassIDType.Transform;
|
||||||
|
i += 4;
|
||||||
|
}
|
||||||
|
else if (curveTypeID == 1512518241) //CRC(ScaleX))
|
||||||
|
{
|
||||||
|
binding.path = curveID;
|
||||||
|
binding.attribute = 3; //kBindTransformScale
|
||||||
|
binding.typeID = ClassIDType.Transform;
|
||||||
|
i += 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
binding.typeID = ClassIDType.Animator;
|
||||||
|
binding.path = 0;
|
||||||
|
binding.attribute = curveID;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bindings.genericBindings = genericBindings.ToArray();
|
||||||
|
return bindings;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ValueDelta
|
public class ValueDelta
|
||||||
@@ -754,6 +798,8 @@ namespace AssetStudio
|
|||||||
public byte customType;
|
public byte customType;
|
||||||
public byte isPPtrCurve;
|
public byte isPPtrCurve;
|
||||||
|
|
||||||
|
public GenericBinding() { }
|
||||||
|
|
||||||
public GenericBinding(ObjectReader reader)
|
public GenericBinding(ObjectReader reader)
|
||||||
{
|
{
|
||||||
var version = reader.version;
|
var version = reader.version;
|
||||||
@@ -779,6 +825,8 @@ namespace AssetStudio
|
|||||||
public GenericBinding[] genericBindings;
|
public GenericBinding[] genericBindings;
|
||||||
public PPtr<Object>[] pptrCurveMapping;
|
public PPtr<Object>[] pptrCurveMapping;
|
||||||
|
|
||||||
|
public AnimationClipBindingConstant() { }
|
||||||
|
|
||||||
public AnimationClipBindingConstant(ObjectReader reader)
|
public AnimationClipBindingConstant(ObjectReader reader)
|
||||||
{
|
{
|
||||||
int numBindings = reader.ReadInt32();
|
int numBindings = reader.ReadInt32();
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ namespace AssetStudio
|
|||||||
public AudioCompressionFormat m_CompressionFormat;
|
public AudioCompressionFormat m_CompressionFormat;
|
||||||
|
|
||||||
public string m_Source;
|
public string m_Source;
|
||||||
public long m_Offset;
|
public long m_Offset; //ulong
|
||||||
public long m_Size;
|
public long m_Size; //ulong
|
||||||
public ResourceReader m_AudioData;
|
public ResourceReader m_AudioData;
|
||||||
|
|
||||||
public AudioClip(ObjectReader reader) : base(reader)
|
public AudioClip(ObjectReader reader) : base(reader)
|
||||||
@@ -48,7 +48,7 @@ namespace AssetStudio
|
|||||||
var tsize = m_Size % 4 != 0 ? m_Size + 4 - m_Size % 4 : m_Size;
|
var tsize = m_Size % 4 != 0 ? m_Size + 4 - m_Size % 4 : m_Size;
|
||||||
if (reader.byteSize + reader.byteStart - reader.Position != tsize)
|
if (reader.byteSize + reader.byteStart - reader.Position != tsize)
|
||||||
{
|
{
|
||||||
m_Offset = reader.ReadInt32();
|
m_Offset = reader.ReadUInt32();
|
||||||
m_Source = assetsFile.fullName + ".resS";
|
m_Source = assetsFile.fullName + ".resS";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -72,6 +72,7 @@ namespace AssetStudio
|
|||||||
m_Legacy3D = reader.ReadBoolean();
|
m_Legacy3D = reader.ReadBoolean();
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
|
|
||||||
|
//StreamedResource m_Resource
|
||||||
m_Source = reader.ReadAlignedString();
|
m_Source = reader.ReadAlignedString();
|
||||||
m_Offset = reader.ReadInt64();
|
m_Offset = reader.ReadInt64();
|
||||||
m_Size = reader.ReadInt64();
|
m_Size = reader.ReadInt64();
|
||||||
@@ -81,11 +82,11 @@ namespace AssetStudio
|
|||||||
ResourceReader resourceReader;
|
ResourceReader resourceReader;
|
||||||
if (!string.IsNullOrEmpty(m_Source))
|
if (!string.IsNullOrEmpty(m_Source))
|
||||||
{
|
{
|
||||||
resourceReader = new ResourceReader(m_Source, assetsFile, m_Offset, (int)m_Size);
|
resourceReader = new ResourceReader(m_Source, assetsFile, m_Offset, m_Size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
resourceReader = new ResourceReader(reader, reader.BaseStream.Position, (int)m_Size);
|
resourceReader = new ResourceReader(reader, reader.BaseStream.Position, m_Size);
|
||||||
}
|
}
|
||||||
m_AudioData = resourceReader;
|
m_AudioData = resourceReader;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,11 +19,14 @@ namespace AssetStudio
|
|||||||
public class UnityPropertySheet
|
public class UnityPropertySheet
|
||||||
{
|
{
|
||||||
public KeyValuePair<string, UnityTexEnv>[] m_TexEnvs;
|
public KeyValuePair<string, UnityTexEnv>[] m_TexEnvs;
|
||||||
|
public KeyValuePair<string, int>[] m_Ints;
|
||||||
public KeyValuePair<string, float>[] m_Floats;
|
public KeyValuePair<string, float>[] m_Floats;
|
||||||
public KeyValuePair<string, Color>[] m_Colors;
|
public KeyValuePair<string, Color>[] m_Colors;
|
||||||
|
|
||||||
public UnityPropertySheet(ObjectReader reader)
|
public UnityPropertySheet(ObjectReader reader)
|
||||||
{
|
{
|
||||||
|
var version = reader.version;
|
||||||
|
|
||||||
int m_TexEnvsSize = reader.ReadInt32();
|
int m_TexEnvsSize = reader.ReadInt32();
|
||||||
m_TexEnvs = new KeyValuePair<string, UnityTexEnv>[m_TexEnvsSize];
|
m_TexEnvs = new KeyValuePair<string, UnityTexEnv>[m_TexEnvsSize];
|
||||||
for (int i = 0; i < m_TexEnvsSize; i++)
|
for (int i = 0; i < m_TexEnvsSize; i++)
|
||||||
@@ -31,6 +34,16 @@ namespace AssetStudio
|
|||||||
m_TexEnvs[i] = new KeyValuePair<string, UnityTexEnv>(reader.ReadAlignedString(), new UnityTexEnv(reader));
|
m_TexEnvs[i] = new KeyValuePair<string, UnityTexEnv>(reader.ReadAlignedString(), new UnityTexEnv(reader));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (version[0] >= 2021) //2021.1 and up
|
||||||
|
{
|
||||||
|
int m_IntsSize = reader.ReadInt32();
|
||||||
|
m_Ints = new KeyValuePair<string, int>[m_IntsSize];
|
||||||
|
for (int i = 0; i < m_IntsSize; i++)
|
||||||
|
{
|
||||||
|
m_Ints[i] = new KeyValuePair<string, int>(reader.ReadAlignedString(), reader.ReadInt32());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int m_FloatsSize = reader.ReadInt32();
|
int m_FloatsSize = reader.ReadInt32();
|
||||||
m_Floats = new KeyValuePair<string, float>[m_FloatsSize];
|
m_Floats = new KeyValuePair<string, float>[m_FloatsSize];
|
||||||
for (int i = 0; i < m_FloatsSize; i++)
|
for (int i = 0; i < m_FloatsSize; i++)
|
||||||
@@ -95,6 +108,8 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_SavedProperties = new UnityPropertySheet(reader);
|
m_SavedProperties = new UnityPropertySheet(reader);
|
||||||
|
|
||||||
|
//vector m_BuildTextureStacks 2020 and up
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+121
-120
@@ -174,7 +174,7 @@ namespace AssetStudio
|
|||||||
GetStreams(version);
|
GetStreams(version);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_DataSize = reader.ReadBytes(reader.ReadInt32());
|
m_DataSize = reader.ReadUInt8Array();
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,7 +195,7 @@ namespace AssetStudio
|
|||||||
if (m_Channel.dimension > 0)
|
if (m_Channel.dimension > 0)
|
||||||
{
|
{
|
||||||
chnMask |= 1u << chn;
|
chnMask |= 1u << chn;
|
||||||
stride += m_Channel.dimension * MeshHelper.GetFormatSize(version, m_Channel.format);
|
stride += m_Channel.dimension * MeshHelper.GetFormatSize(MeshHelper.ToVertexFormat(m_Channel.format, version));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -253,7 +253,7 @@ namespace AssetStudio
|
|||||||
m_Channel.dimension = 4;
|
m_Channel.dimension = 4;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
offset += (byte)(m_Channel.dimension * MeshHelper.GetFormatSize(version, m_Channel.format));
|
offset += (byte)(m_Channel.dimension * MeshHelper.GetFormatSize(MeshHelper.ToVertexFormat(m_Channel.format, version)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -446,7 +446,7 @@ namespace AssetStudio
|
|||||||
|
|
||||||
public sealed class Mesh : NamedObject
|
public sealed class Mesh : NamedObject
|
||||||
{
|
{
|
||||||
private bool m_Use16BitIndices = true; //3.5.0 and newer always uses 16bit indices;
|
private bool m_Use16BitIndices = true;
|
||||||
public SubMesh[] m_SubMeshes;
|
public SubMesh[] m_SubMeshes;
|
||||||
private uint[] m_IndexBuffer;
|
private uint[] m_IndexBuffer;
|
||||||
public BlendShapeData m_Shapes;
|
public BlendShapeData m_Shapes;
|
||||||
@@ -550,6 +550,7 @@ namespace AssetStudio
|
|||||||
((version[0] == 2017 && version[1] == 3) && m_MeshCompression == 0))//2017.3.xfx with no compression
|
((version[0] == 2017 && version[1] == 3) && m_MeshCompression == 0))//2017.3.xfx with no compression
|
||||||
{
|
{
|
||||||
var m_IndexFormat = reader.ReadInt32();
|
var m_IndexFormat = reader.ReadInt32();
|
||||||
|
m_Use16BitIndices = m_IndexFormat == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int m_IndexBuffer_size = reader.ReadInt32();
|
int m_IndexBuffer_size = reader.ReadInt32();
|
||||||
@@ -652,9 +653,9 @@ namespace AssetStudio
|
|||||||
|
|
||||||
if (version[0] >= 5) //5.0 and up
|
if (version[0] >= 5) //5.0 and up
|
||||||
{
|
{
|
||||||
var m_BakedConvexCollisionMesh = reader.ReadBytes(reader.ReadInt32());
|
var m_BakedConvexCollisionMesh = reader.ReadUInt8Array();
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
var m_BakedTriangleCollisionMesh = reader.ReadBytes(reader.ReadInt32());
|
var m_BakedTriangleCollisionMesh = reader.ReadUInt8Array();
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -680,7 +681,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
if (m_VertexData.m_VertexCount > 0)
|
if (m_VertexData.m_VertexCount > 0)
|
||||||
{
|
{
|
||||||
var resourceReader = new ResourceReader(m_StreamData.path, assetsFile, m_StreamData.offset, (int)m_StreamData.size);
|
var resourceReader = new ResourceReader(m_StreamData.path, assetsFile, m_StreamData.offset, m_StreamData.size);
|
||||||
m_VertexData.m_DataSize = resourceReader.GetData();
|
m_VertexData.m_DataSize = resourceReader.GetData();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -710,12 +711,13 @@ namespace AssetStudio
|
|||||||
var channelMask = new BitArray(new[] { (int)m_Stream.channelMask });
|
var channelMask = new BitArray(new[] { (int)m_Stream.channelMask });
|
||||||
if (channelMask.Get(chn))
|
if (channelMask.Get(chn))
|
||||||
{
|
{
|
||||||
if (version[0] < 2018 && chn == 2 && m_Channel.format == 2)
|
if (version[0] < 2018 && chn == 2 && m_Channel.format == 2) //kShaderChannelColor && kChannelFormatColor
|
||||||
{
|
{
|
||||||
m_Channel.dimension = 4;
|
m_Channel.dimension = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
var componentByteSize = (int)MeshHelper.GetFormatSize(version, m_Channel.format);
|
var vertexFormat = MeshHelper.ToVertexFormat(m_Channel.format, version);
|
||||||
|
var componentByteSize = (int)MeshHelper.GetFormatSize(vertexFormat);
|
||||||
var componentBytes = new byte[m_VertexCount * m_Channel.dimension * componentByteSize];
|
var componentBytes = new byte[m_VertexCount * m_Channel.dimension * componentByteSize];
|
||||||
for (int v = 0; v < m_VertexCount; v++)
|
for (int v = 0; v < m_VertexCount; v++)
|
||||||
{
|
{
|
||||||
@@ -740,10 +742,10 @@ namespace AssetStudio
|
|||||||
|
|
||||||
int[] componentsIntArray = null;
|
int[] componentsIntArray = null;
|
||||||
float[] componentsFloatArray = null;
|
float[] componentsFloatArray = null;
|
||||||
if (MeshHelper.IsIntFormat(version, m_Channel.format))
|
if (MeshHelper.IsIntFormat(vertexFormat))
|
||||||
componentsIntArray = MeshHelper.BytesToIntArray(componentBytes, componentByteSize);
|
componentsIntArray = MeshHelper.BytesToIntArray(componentBytes, vertexFormat);
|
||||||
else
|
else
|
||||||
componentsFloatArray = MeshHelper.BytesToFloatArray(componentBytes, componentByteSize);
|
componentsFloatArray = MeshHelper.BytesToFloatArray(componentBytes, vertexFormat);
|
||||||
|
|
||||||
if (version[0] >= 2018)
|
if (version[0] >= 2018)
|
||||||
{
|
{
|
||||||
@@ -1189,7 +1191,7 @@ namespace AssetStudio
|
|||||||
|
|
||||||
public static class MeshHelper
|
public static class MeshHelper
|
||||||
{
|
{
|
||||||
private enum VertexChannelFormat
|
public enum VertexChannelFormat
|
||||||
{
|
{
|
||||||
kChannelFormatFloat,
|
kChannelFormatFloat,
|
||||||
kChannelFormatFloat16,
|
kChannelFormatFloat16,
|
||||||
@@ -1198,7 +1200,7 @@ namespace AssetStudio
|
|||||||
kChannelFormatUInt32
|
kChannelFormatUInt32
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum VertexFormat
|
public enum VertexFormat2017
|
||||||
{
|
{
|
||||||
kVertexFormatFloat,
|
kVertexFormatFloat,
|
||||||
kVertexFormatFloat16,
|
kVertexFormatFloat16,
|
||||||
@@ -1215,7 +1217,7 @@ namespace AssetStudio
|
|||||||
kVertexFormatSInt32
|
kVertexFormatSInt32
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum VertexFormatV2019
|
public enum VertexFormat
|
||||||
{
|
{
|
||||||
kVertexFormatFloat,
|
kVertexFormatFloat,
|
||||||
kVertexFormatFloat16,
|
kVertexFormatFloat16,
|
||||||
@@ -1231,147 +1233,146 @@ namespace AssetStudio
|
|||||||
kVertexFormatSInt32
|
kVertexFormatSInt32
|
||||||
}
|
}
|
||||||
|
|
||||||
public static uint GetFormatSize(int[] version, int format)
|
public static VertexFormat ToVertexFormat(int format, int[] version)
|
||||||
{
|
{
|
||||||
if (version[0] < 2017)
|
if (version[0] < 2017)
|
||||||
{
|
{
|
||||||
switch ((VertexChannelFormat)format)
|
switch ((VertexChannelFormat)format)
|
||||||
{
|
{
|
||||||
case VertexChannelFormat.kChannelFormatFloat:
|
case VertexChannelFormat.kChannelFormatFloat:
|
||||||
return 4u;
|
return VertexFormat.kVertexFormatFloat;
|
||||||
case VertexChannelFormat.kChannelFormatFloat16:
|
case VertexChannelFormat.kChannelFormatFloat16:
|
||||||
return 2u;
|
return VertexFormat.kVertexFormatFloat16;
|
||||||
case VertexChannelFormat.kChannelFormatColor: //in 4.x is size 4
|
case VertexChannelFormat.kChannelFormatColor: //in 4.x is size 4
|
||||||
return 1u;
|
return VertexFormat.kVertexFormatUNorm8;
|
||||||
case VertexChannelFormat.kChannelFormatByte:
|
case VertexChannelFormat.kChannelFormatByte:
|
||||||
return 1u;
|
return VertexFormat.kVertexFormatUInt8;
|
||||||
case VertexChannelFormat.kChannelFormatUInt32: //in 5.x
|
case VertexChannelFormat.kChannelFormatUInt32: //in 5.x
|
||||||
return 4u;
|
return VertexFormat.kVertexFormatUInt32;
|
||||||
default:
|
default:
|
||||||
throw new ArgumentOutOfRangeException(nameof(format), format, null);
|
throw new ArgumentOutOfRangeException(nameof(format), format, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (version[0] < 2019)
|
else if (version[0] < 2019)
|
||||||
{
|
{
|
||||||
switch ((VertexFormat)format)
|
switch ((VertexFormat2017)format)
|
||||||
|
{
|
||||||
|
case VertexFormat2017.kVertexFormatFloat:
|
||||||
|
return VertexFormat.kVertexFormatFloat;
|
||||||
|
case VertexFormat2017.kVertexFormatFloat16:
|
||||||
|
return VertexFormat.kVertexFormatFloat16;
|
||||||
|
case VertexFormat2017.kVertexFormatColor:
|
||||||
|
case VertexFormat2017.kVertexFormatUNorm8:
|
||||||
|
return VertexFormat.kVertexFormatUNorm8;
|
||||||
|
case VertexFormat2017.kVertexFormatSNorm8:
|
||||||
|
return VertexFormat.kVertexFormatSNorm8;
|
||||||
|
case VertexFormat2017.kVertexFormatUNorm16:
|
||||||
|
return VertexFormat.kVertexFormatUNorm16;
|
||||||
|
case VertexFormat2017.kVertexFormatSNorm16:
|
||||||
|
return VertexFormat.kVertexFormatSNorm16;
|
||||||
|
case VertexFormat2017.kVertexFormatUInt8:
|
||||||
|
return VertexFormat.kVertexFormatUInt8;
|
||||||
|
case VertexFormat2017.kVertexFormatSInt8:
|
||||||
|
return VertexFormat.kVertexFormatSInt8;
|
||||||
|
case VertexFormat2017.kVertexFormatUInt16:
|
||||||
|
return VertexFormat.kVertexFormatUInt16;
|
||||||
|
case VertexFormat2017.kVertexFormatSInt16:
|
||||||
|
return VertexFormat.kVertexFormatSInt16;
|
||||||
|
case VertexFormat2017.kVertexFormatUInt32:
|
||||||
|
return VertexFormat.kVertexFormatUInt32;
|
||||||
|
case VertexFormat2017.kVertexFormatSInt32:
|
||||||
|
return VertexFormat.kVertexFormatSInt32;
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException(nameof(format), format, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return (VertexFormat)format;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static uint GetFormatSize(VertexFormat format)
|
||||||
|
{
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case VertexFormat.kVertexFormatFloat:
|
||||||
|
case VertexFormat.kVertexFormatUInt32:
|
||||||
|
case VertexFormat.kVertexFormatSInt32:
|
||||||
|
return 4u;
|
||||||
|
case VertexFormat.kVertexFormatFloat16:
|
||||||
|
case VertexFormat.kVertexFormatUNorm16:
|
||||||
|
case VertexFormat.kVertexFormatSNorm16:
|
||||||
|
case VertexFormat.kVertexFormatUInt16:
|
||||||
|
case VertexFormat.kVertexFormatSInt16:
|
||||||
|
return 2u;
|
||||||
|
case VertexFormat.kVertexFormatUNorm8:
|
||||||
|
case VertexFormat.kVertexFormatSNorm8:
|
||||||
|
case VertexFormat.kVertexFormatUInt8:
|
||||||
|
case VertexFormat.kVertexFormatSInt8:
|
||||||
|
return 1u;
|
||||||
|
default:
|
||||||
|
throw new ArgumentOutOfRangeException(nameof(format), format, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsIntFormat(VertexFormat format)
|
||||||
|
{
|
||||||
|
return format >= VertexFormat.kVertexFormatUInt8;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static float[] BytesToFloatArray(byte[] inputBytes, VertexFormat format)
|
||||||
|
{
|
||||||
|
var size = GetFormatSize(format);
|
||||||
|
var len = inputBytes.Length / size;
|
||||||
|
var result = new float[len];
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
switch (format)
|
||||||
{
|
{
|
||||||
case VertexFormat.kVertexFormatFloat:
|
case VertexFormat.kVertexFormatFloat:
|
||||||
return 4u;
|
result[i] = BitConverter.ToSingle(inputBytes, i * 4);
|
||||||
|
break;
|
||||||
case VertexFormat.kVertexFormatFloat16:
|
case VertexFormat.kVertexFormatFloat16:
|
||||||
return 2u;
|
result[i] = Half.ToHalf(inputBytes, i * 2);
|
||||||
case VertexFormat.kVertexFormatColor:
|
break;
|
||||||
return 1u;
|
|
||||||
case VertexFormat.kVertexFormatUNorm8:
|
case VertexFormat.kVertexFormatUNorm8:
|
||||||
return 1u;
|
result[i] = inputBytes[i] / 255f;
|
||||||
|
break;
|
||||||
case VertexFormat.kVertexFormatSNorm8:
|
case VertexFormat.kVertexFormatSNorm8:
|
||||||
return 1u;
|
result[i] = Math.Max((sbyte)inputBytes[i] / 127f, -1f);
|
||||||
|
break;
|
||||||
case VertexFormat.kVertexFormatUNorm16:
|
case VertexFormat.kVertexFormatUNorm16:
|
||||||
return 2u;
|
result[i] = BitConverter.ToUInt16(inputBytes, i * 2) / 65535f;
|
||||||
|
break;
|
||||||
case VertexFormat.kVertexFormatSNorm16:
|
case VertexFormat.kVertexFormatSNorm16:
|
||||||
return 2u;
|
result[i] = Math.Max(BitConverter.ToInt16(inputBytes, i * 2) / 32767f, -1f);
|
||||||
case VertexFormat.kVertexFormatUInt8:
|
|
||||||
return 1u;
|
|
||||||
case VertexFormat.kVertexFormatSInt8:
|
|
||||||
return 1u;
|
|
||||||
case VertexFormat.kVertexFormatUInt16:
|
|
||||||
return 2u;
|
|
||||||
case VertexFormat.kVertexFormatSInt16:
|
|
||||||
return 2u;
|
|
||||||
case VertexFormat.kVertexFormatUInt32:
|
|
||||||
return 4u;
|
|
||||||
case VertexFormat.kVertexFormatSInt32:
|
|
||||||
return 4u;
|
|
||||||
default:
|
|
||||||
throw new ArgumentOutOfRangeException(nameof(format), format, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch ((VertexFormatV2019)format)
|
|
||||||
{
|
|
||||||
case VertexFormatV2019.kVertexFormatFloat:
|
|
||||||
return 4u;
|
|
||||||
case VertexFormatV2019.kVertexFormatFloat16:
|
|
||||||
return 2u;
|
|
||||||
case VertexFormatV2019.kVertexFormatUNorm8:
|
|
||||||
return 1u;
|
|
||||||
case VertexFormatV2019.kVertexFormatSNorm8:
|
|
||||||
return 1u;
|
|
||||||
case VertexFormatV2019.kVertexFormatUNorm16:
|
|
||||||
return 2u;
|
|
||||||
case VertexFormatV2019.kVertexFormatSNorm16:
|
|
||||||
return 2u;
|
|
||||||
case VertexFormatV2019.kVertexFormatUInt8:
|
|
||||||
return 1u;
|
|
||||||
case VertexFormatV2019.kVertexFormatSInt8:
|
|
||||||
return 1u;
|
|
||||||
case VertexFormatV2019.kVertexFormatUInt16:
|
|
||||||
return 2u;
|
|
||||||
case VertexFormatV2019.kVertexFormatSInt16:
|
|
||||||
return 2u;
|
|
||||||
case VertexFormatV2019.kVertexFormatUInt32:
|
|
||||||
return 4u;
|
|
||||||
case VertexFormatV2019.kVertexFormatSInt32:
|
|
||||||
return 4u;
|
|
||||||
default:
|
|
||||||
throw new ArgumentOutOfRangeException(nameof(format), format, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool IsIntFormat(int[] version, int format)
|
|
||||||
{
|
|
||||||
if (version[0] < 2017)
|
|
||||||
{
|
|
||||||
return format == 4;
|
|
||||||
}
|
|
||||||
else if (version[0] < 2019)
|
|
||||||
{
|
|
||||||
return format >= 7;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return format >= 6;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static float[] BytesToFloatArray(byte[] inputBytes, int size)
|
|
||||||
{
|
|
||||||
var result = new float[inputBytes.Length / size];
|
|
||||||
for (int i = 0; i < inputBytes.Length / size; i++)
|
|
||||||
{
|
|
||||||
var value = 0f;
|
|
||||||
switch (size)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
value = inputBytes[i] / 255.0f;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
value = Half.ToHalf(inputBytes, i * 2);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
value = BitConverter.ToSingle(inputBytes, i * 4);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
result[i] = value;
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int[] BytesToIntArray(byte[] inputBytes, int size)
|
public static int[] BytesToIntArray(byte[] inputBytes, VertexFormat format)
|
||||||
{
|
{
|
||||||
var result = new int[inputBytes.Length / size];
|
var size = GetFormatSize(format);
|
||||||
for (int i = 0; i < inputBytes.Length / size; i++)
|
var len = inputBytes.Length / size;
|
||||||
|
var result = new int[len];
|
||||||
|
for (int i = 0; i < len; i++)
|
||||||
{
|
{
|
||||||
switch (size)
|
switch (format)
|
||||||
{
|
{
|
||||||
case 1:
|
case VertexFormat.kVertexFormatUInt8:
|
||||||
|
case VertexFormat.kVertexFormatSInt8:
|
||||||
result[i] = inputBytes[i];
|
result[i] = inputBytes[i];
|
||||||
break;
|
break;
|
||||||
case 2:
|
case VertexFormat.kVertexFormatUInt16:
|
||||||
|
case VertexFormat.kVertexFormatSInt16:
|
||||||
result[i] = BitConverter.ToInt16(inputBytes, i * 2);
|
result[i] = BitConverter.ToInt16(inputBytes, i * 2);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case VertexFormat.kVertexFormatUInt32:
|
||||||
|
case VertexFormat.kVertexFormatSInt32:
|
||||||
result[i] = BitConverter.ToInt32(inputBytes, i * 4);
|
result[i] = BitConverter.ToInt32(inputBytes, i * 4);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace AssetStudio
|
|||||||
public sealed class MonoScript : NamedObject
|
public sealed class MonoScript : NamedObject
|
||||||
{
|
{
|
||||||
public string m_ClassName;
|
public string m_ClassName;
|
||||||
public string m_Namespace = string.Empty;
|
public string m_Namespace;
|
||||||
public string m_AssemblyName;
|
public string m_AssemblyName;
|
||||||
|
|
||||||
public MonoScript(ObjectReader reader) : base(reader)
|
public MonoScript(ObjectReader reader) : base(reader)
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ namespace AssetStudio
|
|||||||
var m_Loop = reader.ReadBoolean();
|
var m_Loop = reader.ReadBoolean();
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
m_AudioClip = new PPtr<AudioClip>(reader);
|
m_AudioClip = new PPtr<AudioClip>(reader);
|
||||||
m_MovieData = reader.ReadBytes(reader.ReadInt32());
|
m_MovieData = reader.ReadUInt8Array();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
using System;
|
using System.Collections.Specialized;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
@@ -36,19 +33,38 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected bool HasStructMember(string name)
|
|
||||||
{
|
|
||||||
return serializedType?.m_Nodes != null && serializedType.m_Nodes.Any(x => x.m_Name == name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Dump()
|
public string Dump()
|
||||||
{
|
{
|
||||||
reader.Reset();
|
if (serializedType?.m_Type != null)
|
||||||
if (serializedType?.m_Nodes != null)
|
|
||||||
{
|
{
|
||||||
var sb = new StringBuilder();
|
return TypeTreeHelper.ReadTypeString(serializedType.m_Type, reader);
|
||||||
TypeTreeHelper.ReadTypeString(sb, serializedType.m_Nodes, reader);
|
}
|
||||||
return sb.ToString();
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Dump(TypeTree m_Type)
|
||||||
|
{
|
||||||
|
if (m_Type != null)
|
||||||
|
{
|
||||||
|
return TypeTreeHelper.ReadTypeString(m_Type, reader);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderedDictionary ToType()
|
||||||
|
{
|
||||||
|
if (serializedType?.m_Type != null)
|
||||||
|
{
|
||||||
|
return TypeTreeHelper.ReadType(serializedType.m_Type, reader);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OrderedDictionary ToType(TypeTree m_Type)
|
||||||
|
{
|
||||||
|
if (m_Type != null)
|
||||||
|
{
|
||||||
|
return TypeTreeHelper.ReadType(m_Type, reader);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ namespace AssetStudio
|
|||||||
public PPtr(ObjectReader reader)
|
public PPtr(ObjectReader reader)
|
||||||
{
|
{
|
||||||
m_FileID = reader.ReadInt32();
|
m_FileID = reader.ReadInt32();
|
||||||
m_PathID = reader.m_Version < 14 ? reader.ReadInt32() : reader.ReadInt64();
|
m_PathID = reader.m_Version < SerializedFileFormatVersion.kUnknown_14 ? reader.ReadInt32() : reader.ReadInt64();
|
||||||
assetsFile = reader.assetsFile;
|
assetsFile = reader.assetsFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,10 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
var m_DynamicOccludee = reader.ReadByte();
|
var m_DynamicOccludee = reader.ReadByte();
|
||||||
}
|
}
|
||||||
|
if (version[0] >= 2021) //2021.1 and up
|
||||||
|
{
|
||||||
|
var m_StaticShadowCaster = reader.ReadByte();
|
||||||
|
}
|
||||||
var m_MotionVectors = reader.ReadByte();
|
var m_MotionVectors = reader.ReadByte();
|
||||||
var m_LightProbeUsage = reader.ReadByte();
|
var m_LightProbeUsage = reader.ReadByte();
|
||||||
var m_ReflectionProbeUsage = reader.ReadByte();
|
var m_ReflectionProbeUsage = reader.ReadByte();
|
||||||
@@ -50,6 +54,10 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
var m_RayTracingMode = reader.ReadByte();
|
var m_RayTracingMode = reader.ReadByte();
|
||||||
}
|
}
|
||||||
|
if (version[0] >= 2020) //2020.1 and up
|
||||||
|
{
|
||||||
|
var m_RayTraceProcedural = reader.ReadByte();
|
||||||
|
}
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace AssetStudio
|
||||||
|
{
|
||||||
|
public class ResourceManager : Object
|
||||||
|
{
|
||||||
|
public KeyValuePair<string, PPtr<Object>>[] m_Container;
|
||||||
|
|
||||||
|
public ResourceManager(ObjectReader reader) : base(reader)
|
||||||
|
{
|
||||||
|
var m_ContainerSize = reader.ReadInt32();
|
||||||
|
m_Container = new KeyValuePair<string, PPtr<Object>>[m_ContainerSize];
|
||||||
|
for (int i = 0; i < m_ContainerSize; i++)
|
||||||
|
{
|
||||||
|
m_Container[i] = new KeyValuePair<string, PPtr<Object>>(reader.ReadAlignedString(), new PPtr<Object>(reader));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+255
-44
@@ -5,6 +5,16 @@ using System.Linq;
|
|||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
|
public class Hash128
|
||||||
|
{
|
||||||
|
public byte[] bytes;
|
||||||
|
|
||||||
|
public Hash128(BinaryReader reader)
|
||||||
|
{
|
||||||
|
bytes = reader.ReadBytes(16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class StructParameter
|
public class StructParameter
|
||||||
{
|
{
|
||||||
public MatrixParameter[] m_MatrixParams;
|
public MatrixParameter[] m_MatrixParams;
|
||||||
@@ -201,6 +211,7 @@ namespace AssetStudio
|
|||||||
public SerializedShaderFloatValue zTest;
|
public SerializedShaderFloatValue zTest;
|
||||||
public SerializedShaderFloatValue zWrite;
|
public SerializedShaderFloatValue zWrite;
|
||||||
public SerializedShaderFloatValue culling;
|
public SerializedShaderFloatValue culling;
|
||||||
|
public SerializedShaderFloatValue conservative;
|
||||||
public SerializedShaderFloatValue offsetFactor;
|
public SerializedShaderFloatValue offsetFactor;
|
||||||
public SerializedShaderFloatValue offsetUnits;
|
public SerializedShaderFloatValue offsetUnits;
|
||||||
public SerializedShaderFloatValue alphaToMask;
|
public SerializedShaderFloatValue alphaToMask;
|
||||||
@@ -239,6 +250,10 @@ namespace AssetStudio
|
|||||||
zTest = new SerializedShaderFloatValue(reader);
|
zTest = new SerializedShaderFloatValue(reader);
|
||||||
zWrite = new SerializedShaderFloatValue(reader);
|
zWrite = new SerializedShaderFloatValue(reader);
|
||||||
culling = new SerializedShaderFloatValue(reader);
|
culling = new SerializedShaderFloatValue(reader);
|
||||||
|
if (version[0] >= 2020) //2020.1 and up
|
||||||
|
{
|
||||||
|
conservative = new SerializedShaderFloatValue(reader);
|
||||||
|
}
|
||||||
offsetFactor = new SerializedShaderFloatValue(reader);
|
offsetFactor = new SerializedShaderFloatValue(reader);
|
||||||
offsetUnits = new SerializedShaderFloatValue(reader);
|
offsetUnits = new SerializedShaderFloatValue(reader);
|
||||||
alphaToMask = new SerializedShaderFloatValue(reader);
|
alphaToMask = new SerializedShaderFloatValue(reader);
|
||||||
@@ -357,11 +372,18 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
public int m_NameIndex;
|
public int m_NameIndex;
|
||||||
public int m_Index;
|
public int m_Index;
|
||||||
|
public int m_ArraySize;
|
||||||
|
|
||||||
public BufferBinding(BinaryReader reader)
|
public BufferBinding(ObjectReader reader)
|
||||||
{
|
{
|
||||||
|
var version = reader.version;
|
||||||
|
|
||||||
m_NameIndex = reader.ReadInt32();
|
m_NameIndex = reader.ReadInt32();
|
||||||
m_Index = reader.ReadInt32();
|
m_Index = reader.ReadInt32();
|
||||||
|
if (version[0] >= 2020) //2020.1 and up
|
||||||
|
{
|
||||||
|
m_ArraySize = reader.ReadInt32();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -372,6 +394,7 @@ namespace AssetStudio
|
|||||||
public VectorParameter[] m_VectorParams;
|
public VectorParameter[] m_VectorParams;
|
||||||
public StructParameter[] m_StructParams;
|
public StructParameter[] m_StructParams;
|
||||||
public int m_Size;
|
public int m_Size;
|
||||||
|
public bool m_IsPartialCB;
|
||||||
|
|
||||||
public ConstantBuffer(ObjectReader reader)
|
public ConstantBuffer(ObjectReader reader)
|
||||||
{
|
{
|
||||||
@@ -402,6 +425,16 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_Size = reader.ReadInt32();
|
m_Size = reader.ReadInt32();
|
||||||
|
|
||||||
|
if ((version[0] == 2020 && version[1] > 3) ||
|
||||||
|
(version[0] == 2020 && version[1] == 3 && version[2] > 0) ||
|
||||||
|
(version[0] == 2020 && version[1] == 3 && version[2] == 0 && version[3] >= 2) || //2020.3.0f2 to 2020.3.x
|
||||||
|
(version[0] == 2021 && version[1] > 1) ||
|
||||||
|
(version[0] == 2021 && version[1] == 1 && version[2] >= 4)) //2021.1.4f1 to 2021.1.x
|
||||||
|
{
|
||||||
|
m_IsPartialCB = reader.ReadBoolean();
|
||||||
|
reader.AlignStream();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -447,16 +480,16 @@ namespace AssetStudio
|
|||||||
kShaderGpuProgramMetalVS = 23,
|
kShaderGpuProgramMetalVS = 23,
|
||||||
kShaderGpuProgramMetalFS = 24,
|
kShaderGpuProgramMetalFS = 24,
|
||||||
kShaderGpuProgramSPIRV = 25,
|
kShaderGpuProgramSPIRV = 25,
|
||||||
kShaderGpuProgramConsole = 26
|
kShaderGpuProgramConsoleVS = 26,
|
||||||
|
kShaderGpuProgramConsoleFS = 27,
|
||||||
|
kShaderGpuProgramConsoleHS = 28,
|
||||||
|
kShaderGpuProgramConsoleDS = 29,
|
||||||
|
kShaderGpuProgramConsoleGS = 30,
|
||||||
|
kShaderGpuProgramRayTracing = 31,
|
||||||
};
|
};
|
||||||
|
|
||||||
public class SerializedSubProgram
|
public class SerializedProgramParameters
|
||||||
{
|
{
|
||||||
public uint m_BlobIndex;
|
|
||||||
public ParserBindChannels m_Channels;
|
|
||||||
public ushort[] m_KeywordIndices;
|
|
||||||
public sbyte m_ShaderHardwareTier;
|
|
||||||
public ShaderGpuProgramType m_GpuProgramType;
|
|
||||||
public VectorParameter[] m_VectorParams;
|
public VectorParameter[] m_VectorParams;
|
||||||
public MatrixParameter[] m_MatrixParams;
|
public MatrixParameter[] m_MatrixParams;
|
||||||
public TextureParameter[] m_TextureParams;
|
public TextureParameter[] m_TextureParams;
|
||||||
@@ -466,33 +499,8 @@ namespace AssetStudio
|
|||||||
public UAVParameter[] m_UAVParams;
|
public UAVParameter[] m_UAVParams;
|
||||||
public SamplerParameter[] m_Samplers;
|
public SamplerParameter[] m_Samplers;
|
||||||
|
|
||||||
public SerializedSubProgram(ObjectReader reader)
|
public SerializedProgramParameters(ObjectReader reader)
|
||||||
{
|
{
|
||||||
var version = reader.version;
|
|
||||||
|
|
||||||
m_BlobIndex = reader.ReadUInt32();
|
|
||||||
m_Channels = new ParserBindChannels(reader);
|
|
||||||
|
|
||||||
if (version[0] >= 2019) //2019 and up
|
|
||||||
{
|
|
||||||
var m_GlobalKeywordIndices = reader.ReadUInt16Array();
|
|
||||||
reader.AlignStream();
|
|
||||||
var m_LocalKeywordIndices = reader.ReadUInt16Array();
|
|
||||||
reader.AlignStream();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_KeywordIndices = reader.ReadUInt16Array();
|
|
||||||
if (version[0] >= 2017) //2017 and up
|
|
||||||
{
|
|
||||||
reader.AlignStream();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_ShaderHardwareTier = reader.ReadSByte();
|
|
||||||
m_GpuProgramType = (ShaderGpuProgramType)reader.ReadSByte();
|
|
||||||
reader.AlignStream();
|
|
||||||
|
|
||||||
int numVectorParams = reader.ReadInt32();
|
int numVectorParams = reader.ReadInt32();
|
||||||
m_VectorParams = new VectorParameter[numVectorParams];
|
m_VectorParams = new VectorParameter[numVectorParams];
|
||||||
for (int i = 0; i < numVectorParams; i++)
|
for (int i = 0; i < numVectorParams; i++)
|
||||||
@@ -542,18 +550,139 @@ namespace AssetStudio
|
|||||||
m_UAVParams[i] = new UAVParameter(reader);
|
m_UAVParams[i] = new UAVParameter(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (version[0] >= 2017) //2017 and up
|
int numSamplers = reader.ReadInt32();
|
||||||
|
m_Samplers = new SamplerParameter[numSamplers];
|
||||||
|
for (int i = 0; i < numSamplers; i++)
|
||||||
{
|
{
|
||||||
int numSamplers = reader.ReadInt32();
|
m_Samplers[i] = new SamplerParameter(reader);
|
||||||
m_Samplers = new SamplerParameter[numSamplers];
|
}
|
||||||
for (int i = 0; i < numSamplers; i++)
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SerializedSubProgram
|
||||||
|
{
|
||||||
|
public uint m_BlobIndex;
|
||||||
|
public ParserBindChannels m_Channels;
|
||||||
|
public ushort[] m_KeywordIndices;
|
||||||
|
public sbyte m_ShaderHardwareTier;
|
||||||
|
public ShaderGpuProgramType m_GpuProgramType;
|
||||||
|
public SerializedProgramParameters m_Parameters;
|
||||||
|
public VectorParameter[] m_VectorParams;
|
||||||
|
public MatrixParameter[] m_MatrixParams;
|
||||||
|
public TextureParameter[] m_TextureParams;
|
||||||
|
public BufferBinding[] m_BufferParams;
|
||||||
|
public ConstantBuffer[] m_ConstantBuffers;
|
||||||
|
public BufferBinding[] m_ConstantBufferBindings;
|
||||||
|
public UAVParameter[] m_UAVParams;
|
||||||
|
public SamplerParameter[] m_Samplers;
|
||||||
|
|
||||||
|
public SerializedSubProgram(ObjectReader reader)
|
||||||
|
{
|
||||||
|
var version = reader.version;
|
||||||
|
|
||||||
|
m_BlobIndex = reader.ReadUInt32();
|
||||||
|
m_Channels = new ParserBindChannels(reader);
|
||||||
|
|
||||||
|
if (version[0] >= 2019) //2019 and up
|
||||||
|
{
|
||||||
|
var m_GlobalKeywordIndices = reader.ReadUInt16Array();
|
||||||
|
reader.AlignStream();
|
||||||
|
var m_LocalKeywordIndices = reader.ReadUInt16Array();
|
||||||
|
reader.AlignStream();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_KeywordIndices = reader.ReadUInt16Array();
|
||||||
|
if (version[0] >= 2017) //2017 and up
|
||||||
{
|
{
|
||||||
m_Samplers[i] = new SamplerParameter(reader);
|
reader.AlignStream();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_ShaderHardwareTier = reader.ReadSByte();
|
||||||
|
m_GpuProgramType = (ShaderGpuProgramType)reader.ReadSByte();
|
||||||
|
reader.AlignStream();
|
||||||
|
|
||||||
|
if ((version[0] == 2020 && version[1] > 3) ||
|
||||||
|
(version[0] == 2020 && version[1] == 3 && version[2] > 0) ||
|
||||||
|
(version[0] == 2020 && version[1] == 3 && version[2] == 0 && version[3] >= 2) || //2020.3.0f2 to 2020.3.x
|
||||||
|
(version[0] == 2021 && version[1] > 1) ||
|
||||||
|
(version[0] == 2021 && version[1] == 1 && version[2] >= 4)) //2021.1.4f1 to 2021.1.x
|
||||||
|
{
|
||||||
|
m_Parameters = new SerializedProgramParameters(reader);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int numVectorParams = reader.ReadInt32();
|
||||||
|
m_VectorParams = new VectorParameter[numVectorParams];
|
||||||
|
for (int i = 0; i < numVectorParams; i++)
|
||||||
|
{
|
||||||
|
m_VectorParams[i] = new VectorParameter(reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
int numMatrixParams = reader.ReadInt32();
|
||||||
|
m_MatrixParams = new MatrixParameter[numMatrixParams];
|
||||||
|
for (int i = 0; i < numMatrixParams; i++)
|
||||||
|
{
|
||||||
|
m_MatrixParams[i] = new MatrixParameter(reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
int numTextureParams = reader.ReadInt32();
|
||||||
|
m_TextureParams = new TextureParameter[numTextureParams];
|
||||||
|
for (int i = 0; i < numTextureParams; i++)
|
||||||
|
{
|
||||||
|
m_TextureParams[i] = new TextureParameter(reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
int numBufferParams = reader.ReadInt32();
|
||||||
|
m_BufferParams = new BufferBinding[numBufferParams];
|
||||||
|
for (int i = 0; i < numBufferParams; i++)
|
||||||
|
{
|
||||||
|
m_BufferParams[i] = new BufferBinding(reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
int numConstantBuffers = reader.ReadInt32();
|
||||||
|
m_ConstantBuffers = new ConstantBuffer[numConstantBuffers];
|
||||||
|
for (int i = 0; i < numConstantBuffers; i++)
|
||||||
|
{
|
||||||
|
m_ConstantBuffers[i] = new ConstantBuffer(reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
int numConstantBufferBindings = reader.ReadInt32();
|
||||||
|
m_ConstantBufferBindings = new BufferBinding[numConstantBufferBindings];
|
||||||
|
for (int i = 0; i < numConstantBufferBindings; i++)
|
||||||
|
{
|
||||||
|
m_ConstantBufferBindings[i] = new BufferBinding(reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
int numUAVParams = reader.ReadInt32();
|
||||||
|
m_UAVParams = new UAVParameter[numUAVParams];
|
||||||
|
for (int i = 0; i < numUAVParams; i++)
|
||||||
|
{
|
||||||
|
m_UAVParams[i] = new UAVParameter(reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (version[0] >= 2017) //2017 and up
|
||||||
|
{
|
||||||
|
int numSamplers = reader.ReadInt32();
|
||||||
|
m_Samplers = new SamplerParameter[numSamplers];
|
||||||
|
for (int i = 0; i < numSamplers; i++)
|
||||||
|
{
|
||||||
|
m_Samplers[i] = new SamplerParameter(reader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up
|
if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up
|
||||||
{
|
{
|
||||||
var m_ShaderRequirements = reader.ReadInt32();
|
if (version[0] >= 2021) //2021.1 and up
|
||||||
|
{
|
||||||
|
var m_ShaderRequirements = reader.ReadInt64();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var m_ShaderRequirements = reader.ReadInt32();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -561,15 +690,27 @@ namespace AssetStudio
|
|||||||
public class SerializedProgram
|
public class SerializedProgram
|
||||||
{
|
{
|
||||||
public SerializedSubProgram[] m_SubPrograms;
|
public SerializedSubProgram[] m_SubPrograms;
|
||||||
|
public SerializedProgramParameters m_CommonParameters;
|
||||||
|
|
||||||
public SerializedProgram(ObjectReader reader)
|
public SerializedProgram(ObjectReader reader)
|
||||||
{
|
{
|
||||||
|
var version = reader.version;
|
||||||
|
|
||||||
int numSubPrograms = reader.ReadInt32();
|
int numSubPrograms = reader.ReadInt32();
|
||||||
m_SubPrograms = new SerializedSubProgram[numSubPrograms];
|
m_SubPrograms = new SerializedSubProgram[numSubPrograms];
|
||||||
for (int i = 0; i < numSubPrograms; i++)
|
for (int i = 0; i < numSubPrograms; i++)
|
||||||
{
|
{
|
||||||
m_SubPrograms[i] = new SerializedSubProgram(reader);
|
m_SubPrograms[i] = new SerializedSubProgram(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((version[0] == 2020 && version[1] > 3) ||
|
||||||
|
(version[0] == 2020 && version[1] == 3 && version[2] > 0) ||
|
||||||
|
(version[0] == 2020 && version[1] == 3 && version[2] == 0 && version[3] >= 2) || //2020.3.0f2 to 2020.3.x
|
||||||
|
(version[0] == 2021 && version[1] > 1) ||
|
||||||
|
(version[0] == 2021 && version[1] == 1 && version[2] >= 4)) //2021.1.4f1 to 2021.1.x
|
||||||
|
{
|
||||||
|
m_CommonParameters = new SerializedProgramParameters(reader);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -582,6 +723,10 @@ namespace AssetStudio
|
|||||||
|
|
||||||
public class SerializedPass
|
public class SerializedPass
|
||||||
{
|
{
|
||||||
|
public Hash128[] m_EditorDataHash;
|
||||||
|
public byte[] m_Platforms;
|
||||||
|
public ushort[] m_LocalKeywordMask;
|
||||||
|
public ushort[] m_GlobalKeywordMask;
|
||||||
public KeyValuePair<string, int>[] m_NameIndices;
|
public KeyValuePair<string, int>[] m_NameIndices;
|
||||||
public PassType m_Type;
|
public PassType m_Type;
|
||||||
public SerializedShaderState m_State;
|
public SerializedShaderState m_State;
|
||||||
@@ -602,6 +747,23 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
var version = reader.version;
|
var version = reader.version;
|
||||||
|
|
||||||
|
if (version[0] > 2020 || (version[0] == 2020 && version[1] >= 2)) //2020.2 and up
|
||||||
|
{
|
||||||
|
int numEditorDataHash = reader.ReadInt32();
|
||||||
|
m_EditorDataHash = new Hash128[numEditorDataHash];
|
||||||
|
for (int i = 0; i < numEditorDataHash; i++)
|
||||||
|
{
|
||||||
|
m_EditorDataHash[i] = new Hash128(reader);
|
||||||
|
}
|
||||||
|
reader.AlignStream();
|
||||||
|
m_Platforms = reader.ReadUInt8Array();
|
||||||
|
reader.AlignStream();
|
||||||
|
m_LocalKeywordMask = reader.ReadUInt16Array();
|
||||||
|
reader.AlignStream();
|
||||||
|
m_GlobalKeywordMask = reader.ReadUInt16Array();
|
||||||
|
reader.AlignStream();
|
||||||
|
}
|
||||||
|
|
||||||
int numIndices = reader.ReadInt32();
|
int numIndices = reader.ReadInt32();
|
||||||
m_NameIndices = new KeyValuePair<string, int>[numIndices];
|
m_NameIndices = new KeyValuePair<string, int>[numIndices];
|
||||||
for (int i = 0; i < numIndices; i++)
|
for (int i = 0; i < numIndices; i++)
|
||||||
@@ -681,6 +843,18 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class SerializedCustomEditorForRenderPipeline
|
||||||
|
{
|
||||||
|
public string customEditorName;
|
||||||
|
public string renderPipelineType;
|
||||||
|
|
||||||
|
public SerializedCustomEditorForRenderPipeline(BinaryReader reader)
|
||||||
|
{
|
||||||
|
customEditorName = reader.ReadAlignedString();
|
||||||
|
renderPipelineType = reader.ReadAlignedString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class SerializedShader
|
public class SerializedShader
|
||||||
{
|
{
|
||||||
public SerializedProperties m_PropInfo;
|
public SerializedProperties m_PropInfo;
|
||||||
@@ -689,10 +863,13 @@ namespace AssetStudio
|
|||||||
public string m_CustomEditorName;
|
public string m_CustomEditorName;
|
||||||
public string m_FallbackName;
|
public string m_FallbackName;
|
||||||
public SerializedShaderDependency[] m_Dependencies;
|
public SerializedShaderDependency[] m_Dependencies;
|
||||||
|
public SerializedCustomEditorForRenderPipeline[] m_CustomEditorForRenderPipelines;
|
||||||
public bool m_DisableNoSubshadersMessage;
|
public bool m_DisableNoSubshadersMessage;
|
||||||
|
|
||||||
public SerializedShader(ObjectReader reader)
|
public SerializedShader(ObjectReader reader)
|
||||||
{
|
{
|
||||||
|
var version = reader.version;
|
||||||
|
|
||||||
m_PropInfo = new SerializedProperties(reader);
|
m_PropInfo = new SerializedProperties(reader);
|
||||||
|
|
||||||
int numSubShaders = reader.ReadInt32();
|
int numSubShaders = reader.ReadInt32();
|
||||||
@@ -713,6 +890,16 @@ namespace AssetStudio
|
|||||||
m_Dependencies[i] = new SerializedShaderDependency(reader);
|
m_Dependencies[i] = new SerializedShaderDependency(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (version[0] >= 2021) //2021.1 and up
|
||||||
|
{
|
||||||
|
int m_CustomEditorForRenderPipelinesSize = reader.ReadInt32();
|
||||||
|
m_CustomEditorForRenderPipelines = new SerializedCustomEditorForRenderPipeline[m_CustomEditorForRenderPipelinesSize];
|
||||||
|
for (int i = 0; i < m_CustomEditorForRenderPipelinesSize; i++)
|
||||||
|
{
|
||||||
|
m_CustomEditorForRenderPipelines[i] = new SerializedCustomEditorForRenderPipeline(reader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_DisableNoSubshadersMessage = reader.ReadBoolean();
|
m_DisableNoSubshadersMessage = reader.ReadBoolean();
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
}
|
}
|
||||||
@@ -741,7 +928,11 @@ namespace AssetStudio
|
|||||||
kShaderCompPlatformWiiU = 17,
|
kShaderCompPlatformWiiU = 17,
|
||||||
kShaderCompPlatformVulkan = 18,
|
kShaderCompPlatformVulkan = 18,
|
||||||
kShaderCompPlatformSwitch = 19,
|
kShaderCompPlatformSwitch = 19,
|
||||||
kShaderCompPlatformXboxOneD3D12 = 20
|
kShaderCompPlatformXboxOneD3D12 = 20,
|
||||||
|
kShaderCompPlatformGameCoreXboxOne = 21,
|
||||||
|
kShaderCompPlatformGameCoreScarlett = 22,
|
||||||
|
kShaderCompPlatformPS5 = 23,
|
||||||
|
kShaderCompPlatformPS5NGGC = 24,
|
||||||
};
|
};
|
||||||
|
|
||||||
public class Shader : NamedObject
|
public class Shader : NamedObject
|
||||||
@@ -776,17 +967,37 @@ namespace AssetStudio
|
|||||||
compressedLengths = reader.ReadUInt32Array();
|
compressedLengths = reader.ReadUInt32Array();
|
||||||
decompressedLengths = reader.ReadUInt32Array();
|
decompressedLengths = reader.ReadUInt32Array();
|
||||||
}
|
}
|
||||||
compressedBlob = reader.ReadBytes(reader.ReadInt32());
|
compressedBlob = reader.ReadUInt8Array();
|
||||||
|
reader.AlignStream();
|
||||||
|
|
||||||
|
var m_DependenciesCount = reader.ReadInt32();
|
||||||
|
for (int i = 0; i < m_DependenciesCount; i++)
|
||||||
|
{
|
||||||
|
new PPtr<Shader>(reader);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (version[0] >= 2018)
|
||||||
|
{
|
||||||
|
var m_NonModifiableTexturesCount = reader.ReadInt32();
|
||||||
|
for (int i = 0; i < m_NonModifiableTexturesCount; i++)
|
||||||
|
{
|
||||||
|
var first = reader.ReadAlignedString();
|
||||||
|
new PPtr<Texture>(reader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var m_ShaderIsBaked = reader.ReadBoolean();
|
||||||
|
reader.AlignStream();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_Script = reader.ReadBytes(reader.ReadInt32());
|
m_Script = reader.ReadUInt8Array();
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
var m_PathName = reader.ReadAlignedString();
|
var m_PathName = reader.ReadAlignedString();
|
||||||
if (version[0] == 5 && version[1] >= 3) //5.3 - 5.4
|
if (version[0] == 5 && version[1] >= 3) //5.3 - 5.4
|
||||||
{
|
{
|
||||||
decompressedSize = reader.ReadUInt32();
|
decompressedSize = reader.ReadUInt32();
|
||||||
m_SubProgramBlob = reader.ReadBytes(reader.ReadInt32());
|
m_SubProgramBlob = reader.ReadUInt8Array();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
@@ -88,7 +87,7 @@ namespace AssetStudio
|
|||||||
public ushort[] indices;
|
public ushort[] indices;
|
||||||
public Matrix4x4[] m_Bindpose;
|
public Matrix4x4[] m_Bindpose;
|
||||||
public BoneWeights4[] m_SourceSkin;
|
public BoneWeights4[] m_SourceSkin;
|
||||||
public RectangleF textureRect;
|
public Rectf textureRect;
|
||||||
public Vector2 textureRectOffset;
|
public Vector2 textureRectOffset;
|
||||||
public Vector2 atlasRectOffset;
|
public Vector2 atlasRectOffset;
|
||||||
public SpriteSettings settingsRaw;
|
public SpriteSettings settingsRaw;
|
||||||
@@ -124,7 +123,7 @@ namespace AssetStudio
|
|||||||
m_SubMeshes[i] = new SubMesh(reader);
|
m_SubMeshes[i] = new SubMesh(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_IndexBuffer = reader.ReadBytes(reader.ReadInt32());
|
m_IndexBuffer = reader.ReadUInt8Array();
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
|
|
||||||
m_VertexData = new VertexData(reader);
|
m_VertexData = new VertexData(reader);
|
||||||
@@ -156,7 +155,7 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
textureRect = reader.ReadRectangleF();
|
textureRect = new Rectf(reader);
|
||||||
textureRectOffset = reader.ReadVector2();
|
textureRectOffset = reader.ReadVector2();
|
||||||
if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up
|
if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up
|
||||||
{
|
{
|
||||||
@@ -176,9 +175,25 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class Rectf
|
||||||
|
{
|
||||||
|
public float x;
|
||||||
|
public float y;
|
||||||
|
public float width;
|
||||||
|
public float height;
|
||||||
|
|
||||||
|
public Rectf(BinaryReader reader)
|
||||||
|
{
|
||||||
|
x = reader.ReadSingle();
|
||||||
|
y = reader.ReadSingle();
|
||||||
|
width = reader.ReadSingle();
|
||||||
|
height = reader.ReadSingle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public sealed class Sprite : NamedObject
|
public sealed class Sprite : NamedObject
|
||||||
{
|
{
|
||||||
public RectangleF m_Rect;
|
public Rectf m_Rect;
|
||||||
public Vector2 m_Offset;
|
public Vector2 m_Offset;
|
||||||
public Vector4 m_Border;
|
public Vector4 m_Border;
|
||||||
public float m_PixelsToUnits;
|
public float m_PixelsToUnits;
|
||||||
@@ -193,7 +208,7 @@ namespace AssetStudio
|
|||||||
|
|
||||||
public Sprite(ObjectReader reader) : base(reader)
|
public Sprite(ObjectReader reader) : base(reader)
|
||||||
{
|
{
|
||||||
m_Rect = reader.ReadRectangleF();
|
m_Rect = new Rectf(reader);
|
||||||
m_Offset = reader.ReadVector2();
|
m_Offset = reader.ReadVector2();
|
||||||
if (version[0] > 4 || (version[0] == 4 && version[1] >= 5)) //4.5 and up
|
if (version[0] > 4 || (version[0] == 4 && version[1] >= 5)) //4.5 and up
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,19 +7,20 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
public PPtr<Texture2D> texture;
|
public PPtr<Texture2D> texture;
|
||||||
public PPtr<Texture2D> alphaTexture;
|
public PPtr<Texture2D> alphaTexture;
|
||||||
public System.Drawing.RectangleF textureRect;
|
public Rectf textureRect;
|
||||||
public Vector2 textureRectOffset;
|
public Vector2 textureRectOffset;
|
||||||
public Vector2 atlasRectOffset;
|
public Vector2 atlasRectOffset;
|
||||||
public Vector4 uvTransform;
|
public Vector4 uvTransform;
|
||||||
public float downscaleMultiplier;
|
public float downscaleMultiplier;
|
||||||
public SpriteSettings settingsRaw;
|
public SpriteSettings settingsRaw;
|
||||||
|
public SecondarySpriteTexture[] secondaryTextures;
|
||||||
|
|
||||||
public SpriteAtlasData(ObjectReader reader)
|
public SpriteAtlasData(ObjectReader reader)
|
||||||
{
|
{
|
||||||
var version = reader.version;
|
var version = reader.version;
|
||||||
texture = new PPtr<Texture2D>(reader);
|
texture = new PPtr<Texture2D>(reader);
|
||||||
alphaTexture = new PPtr<Texture2D>(reader);
|
alphaTexture = new PPtr<Texture2D>(reader);
|
||||||
textureRect = reader.ReadRectangleF();
|
textureRect = new Rectf(reader);
|
||||||
textureRectOffset = reader.ReadVector2();
|
textureRectOffset = reader.ReadVector2();
|
||||||
if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up
|
if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up
|
||||||
{
|
{
|
||||||
@@ -28,6 +29,16 @@ namespace AssetStudio
|
|||||||
uvTransform = reader.ReadVector4();
|
uvTransform = reader.ReadVector4();
|
||||||
downscaleMultiplier = reader.ReadSingle();
|
downscaleMultiplier = reader.ReadSingle();
|
||||||
settingsRaw = new SpriteSettings(reader);
|
settingsRaw = new SpriteSettings(reader);
|
||||||
|
if (version[0] > 2020 || (version[0] == 2020 && version[1] >= 2)) //2020.2 and up
|
||||||
|
{
|
||||||
|
var secondaryTexturesSize = reader.ReadInt32();
|
||||||
|
secondaryTextures = new SecondarySpriteTexture[secondaryTexturesSize];
|
||||||
|
for (int i = 0; i < secondaryTexturesSize; i++)
|
||||||
|
{
|
||||||
|
secondaryTextures[i] = new SecondarySpriteTexture(reader);
|
||||||
|
}
|
||||||
|
reader.AlignStream();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ namespace AssetStudio
|
|||||||
|
|
||||||
public TextAsset(ObjectReader reader) : base(reader)
|
public TextAsset(ObjectReader reader) : base(reader)
|
||||||
{
|
{
|
||||||
m_Script = reader.ReadBytes(reader.ReadInt32());
|
m_Script = reader.ReadUInt8Array();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,10 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
var m_ForcedFallbackFormat = reader.ReadInt32();
|
var m_ForcedFallbackFormat = reader.ReadInt32();
|
||||||
var m_DownscaleFallback = reader.ReadBoolean();
|
var m_DownscaleFallback = reader.ReadBoolean();
|
||||||
|
if (version[0] > 2020 || (version[0] == 2020 && version[1] >= 2)) //2020.2 and up
|
||||||
|
{
|
||||||
|
var m_IsAlphaChannelOptional = reader.ReadBoolean();
|
||||||
|
}
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,13 +4,22 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
public class StreamingInfo
|
public class StreamingInfo
|
||||||
{
|
{
|
||||||
public uint offset;
|
public long offset; //ulong
|
||||||
public uint size;
|
public uint size;
|
||||||
public string path;
|
public string path;
|
||||||
|
|
||||||
public StreamingInfo(ObjectReader reader)
|
public StreamingInfo(ObjectReader reader)
|
||||||
{
|
{
|
||||||
offset = reader.ReadUInt32();
|
var version = reader.version;
|
||||||
|
|
||||||
|
if (version[0] >= 2020) //2020.1 and up
|
||||||
|
{
|
||||||
|
offset = reader.ReadInt64();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
offset = reader.ReadUInt32();
|
||||||
|
}
|
||||||
size = reader.ReadUInt32();
|
size = reader.ReadUInt32();
|
||||||
path = reader.ReadAlignedString();
|
path = reader.ReadAlignedString();
|
||||||
}
|
}
|
||||||
@@ -59,6 +68,10 @@ namespace AssetStudio
|
|||||||
m_Width = reader.ReadInt32();
|
m_Width = reader.ReadInt32();
|
||||||
m_Height = reader.ReadInt32();
|
m_Height = reader.ReadInt32();
|
||||||
var m_CompleteImageSize = reader.ReadInt32();
|
var m_CompleteImageSize = reader.ReadInt32();
|
||||||
|
if (version[0] >= 2020) //2020.1 and up
|
||||||
|
{
|
||||||
|
var m_MipsStripped = reader.ReadInt32();
|
||||||
|
}
|
||||||
m_TextureFormat = (TextureFormat)reader.ReadInt32();
|
m_TextureFormat = (TextureFormat)reader.ReadInt32();
|
||||||
if (version[0] < 5 || (version[0] == 5 && version[1] < 2)) //5.2 down
|
if (version[0] < 5 || (version[0] == 5 && version[1] < 2)) //5.2 down
|
||||||
{
|
{
|
||||||
@@ -68,9 +81,29 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
m_MipCount = reader.ReadInt32();
|
m_MipCount = reader.ReadInt32();
|
||||||
}
|
}
|
||||||
var m_IsReadable = reader.ReadBoolean(); //2.6.0 and up
|
if (version[0] > 2 || (version[0] == 2 && version[1] >= 6)) //2.6.0 and up
|
||||||
var m_ReadAllowed = reader.ReadBoolean(); //3.0.0 - 5.4
|
{
|
||||||
//bool m_StreamingMipmaps 2018.2 and up
|
var m_IsReadable = reader.ReadBoolean();
|
||||||
|
}
|
||||||
|
if (version[0] >= 2020) //2020.1 and up
|
||||||
|
{
|
||||||
|
var m_IsPreProcessed = reader.ReadBoolean();
|
||||||
|
}
|
||||||
|
if (version[0] > 2019 || (version[0] == 2019 && version[1] >= 3)) //2019.3 and up
|
||||||
|
{
|
||||||
|
var m_IgnoreMasterTextureLimit = reader.ReadBoolean();
|
||||||
|
}
|
||||||
|
if (version[0] >= 3) //3.0.0 - 5.4
|
||||||
|
{
|
||||||
|
if (version[0] < 5 || (version[0] == 5 && version[1] <= 4))
|
||||||
|
{
|
||||||
|
var m_ReadAllowed = reader.ReadBoolean();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 2)) //2018.2 and up
|
||||||
|
{
|
||||||
|
var m_StreamingMipmaps = reader.ReadBoolean();
|
||||||
|
}
|
||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 2)) //2018.2 and up
|
if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 2)) //2018.2 and up
|
||||||
{
|
{
|
||||||
@@ -87,6 +120,11 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
var m_ColorSpace = reader.ReadInt32();
|
var m_ColorSpace = reader.ReadInt32();
|
||||||
}
|
}
|
||||||
|
if (version[0] > 2020 || (version[0] == 2020 && version[1] >= 2)) //2020.2 and up
|
||||||
|
{
|
||||||
|
var m_PlatformBlob = reader.ReadUInt8Array();
|
||||||
|
reader.AlignStream();
|
||||||
|
}
|
||||||
var image_data_size = reader.ReadInt32();
|
var image_data_size = reader.ReadInt32();
|
||||||
if (image_data_size == 0 && ((version[0] == 5 && version[1] >= 3) || version[0] > 5))//5.3.0 and up
|
if (image_data_size == 0 && ((version[0] == 5 && version[1] >= 3) || version[0] > 5))//5.3.0 and up
|
||||||
{
|
{
|
||||||
@@ -96,7 +134,7 @@ namespace AssetStudio
|
|||||||
ResourceReader resourceReader;
|
ResourceReader resourceReader;
|
||||||
if (!string.IsNullOrEmpty(m_StreamData?.path))
|
if (!string.IsNullOrEmpty(m_StreamData?.path))
|
||||||
{
|
{
|
||||||
resourceReader = new ResourceReader(m_StreamData.path, assetsFile, m_StreamData.offset, (int)m_StreamData.size);
|
resourceReader = new ResourceReader(m_StreamData.path, assetsFile, m_StreamData.offset, m_StreamData.size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -171,5 +209,8 @@ namespace AssetStudio
|
|||||||
ASTC_HDR_8x8,
|
ASTC_HDR_8x8,
|
||||||
ASTC_HDR_10x10,
|
ASTC_HDR_10x10,
|
||||||
ASTC_HDR_12x12,
|
ASTC_HDR_12x12,
|
||||||
|
RG32,
|
||||||
|
RGB48,
|
||||||
|
RGBA64
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,17 +1,26 @@
|
|||||||
using System;
|
using System.IO;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
|
public class StreamedResource
|
||||||
|
{
|
||||||
|
public string m_Source;
|
||||||
|
public long m_Offset; //ulong
|
||||||
|
public long m_Size; //ulong
|
||||||
|
|
||||||
|
public StreamedResource(BinaryReader reader)
|
||||||
|
{
|
||||||
|
m_Source = reader.ReadAlignedString();
|
||||||
|
m_Offset = reader.ReadInt64();
|
||||||
|
m_Size = reader.ReadInt64();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public sealed class VideoClip : NamedObject
|
public sealed class VideoClip : NamedObject
|
||||||
{
|
{
|
||||||
public ResourceReader m_VideoData;
|
public ResourceReader m_VideoData;
|
||||||
public string m_OriginalPath;
|
public string m_OriginalPath;
|
||||||
public string m_Source;
|
public StreamedResource m_ExternalResources;
|
||||||
public ulong m_Size;
|
|
||||||
|
|
||||||
public VideoClip(ObjectReader reader) : base(reader)
|
public VideoClip(ObjectReader reader) : base(reader)
|
||||||
{
|
{
|
||||||
@@ -32,20 +41,30 @@ namespace AssetStudio
|
|||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
var m_AudioSampleRate = reader.ReadUInt32Array();
|
var m_AudioSampleRate = reader.ReadUInt32Array();
|
||||||
var m_AudioLanguage = reader.ReadStringArray();
|
var m_AudioLanguage = reader.ReadStringArray();
|
||||||
//StreamedResource m_ExternalResources
|
if (version[0] >= 2020) //2020.1 and up
|
||||||
m_Source = reader.ReadAlignedString();
|
{
|
||||||
var m_Offset = reader.ReadUInt64();
|
var m_VideoShadersSize = reader.ReadInt32();
|
||||||
m_Size = reader.ReadUInt64();
|
var m_VideoShaders = new PPtr<Shader>[m_VideoShadersSize];
|
||||||
|
for (int i = 0; i < m_VideoShadersSize; i++)
|
||||||
|
{
|
||||||
|
m_VideoShaders[i] = new PPtr<Shader>(reader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_ExternalResources = new StreamedResource(reader);
|
||||||
var m_HasSplitAlpha = reader.ReadBoolean();
|
var m_HasSplitAlpha = reader.ReadBoolean();
|
||||||
|
if (version[0] >= 2020) //2020.1 and up
|
||||||
|
{
|
||||||
|
var m_sRGB = reader.ReadBoolean();
|
||||||
|
}
|
||||||
|
|
||||||
ResourceReader resourceReader;
|
ResourceReader resourceReader;
|
||||||
if (!string.IsNullOrEmpty(m_Source))
|
if (!string.IsNullOrEmpty(m_ExternalResources.m_Source))
|
||||||
{
|
{
|
||||||
resourceReader = new ResourceReader(m_Source, assetsFile, (long)m_Offset, (int)m_Size);
|
resourceReader = new ResourceReader(m_ExternalResources.m_Source, assetsFile, m_ExternalResources.m_Offset, m_ExternalResources.m_Size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
resourceReader = new ResourceReader(reader, reader.BaseStream.Position, (int)m_Size);
|
resourceReader = new ResourceReader(reader, reader.BaseStream.Position, m_ExternalResources.m_Size);
|
||||||
}
|
}
|
||||||
m_VideoData = resourceReader;
|
m_VideoData = resourceReader;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,7 +113,8 @@ namespace AssetStudio
|
|||||||
{1093, "m_CorrespondingSourceObject"},
|
{1093, "m_CorrespondingSourceObject"},
|
||||||
{1121, "m_PrefabInstance"},
|
{1121, "m_PrefabInstance"},
|
||||||
{1138, "m_PrefabAsset"},
|
{1138, "m_PrefabAsset"},
|
||||||
{1152, "FileSize"}
|
{1152, "FileSize"},
|
||||||
|
{1161, "Hash128"}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,11 +72,6 @@ namespace AssetStudio
|
|||||||
return new Vector4(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
|
return new Vector4(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static System.Drawing.RectangleF ReadRectangleF(this BinaryReader reader)
|
|
||||||
{
|
|
||||||
return new System.Drawing.RectangleF(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Color ReadColor4(this BinaryReader reader)
|
public static Color ReadColor4(this BinaryReader reader)
|
||||||
{
|
{
|
||||||
return new Color(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
|
return new Color(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle());
|
||||||
@@ -102,6 +97,11 @@ namespace AssetStudio
|
|||||||
return ReadArray(reader.ReadBoolean, reader.ReadInt32());
|
return ReadArray(reader.ReadBoolean, reader.ReadInt32());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static byte[] ReadUInt8Array(this BinaryReader reader)
|
||||||
|
{
|
||||||
|
return reader.ReadBytes(reader.ReadInt32());
|
||||||
|
}
|
||||||
|
|
||||||
public static ushort[] ReadUInt16Array(this BinaryReader reader)
|
public static ushort[] ReadUInt16Array(this BinaryReader reader)
|
||||||
{
|
{
|
||||||
return ReadArray(reader.ReadUInt16, reader.ReadInt32());
|
return ReadArray(reader.ReadUInt16, reader.ReadInt32());
|
||||||
|
|||||||
@@ -0,0 +1,97 @@
|
|||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace AssetStudio
|
||||||
|
{
|
||||||
|
public class FileReader : EndianBinaryReader
|
||||||
|
{
|
||||||
|
public string FullPath;
|
||||||
|
public string FileName;
|
||||||
|
public FileType FileType;
|
||||||
|
|
||||||
|
public FileReader(string path) : this(path, File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { }
|
||||||
|
|
||||||
|
public FileReader(string path, Stream stream) : base(stream, EndianType.BigEndian)
|
||||||
|
{
|
||||||
|
FullPath = Path.GetFullPath(path);
|
||||||
|
FileName = Path.GetFileName(path);
|
||||||
|
FileType = CheckFileType();
|
||||||
|
}
|
||||||
|
|
||||||
|
private FileType CheckFileType()
|
||||||
|
{
|
||||||
|
var signature = this.ReadStringToNull(20);
|
||||||
|
Position = 0;
|
||||||
|
switch (signature)
|
||||||
|
{
|
||||||
|
case "UnityWeb":
|
||||||
|
case "UnityRaw":
|
||||||
|
case "UnityArchive":
|
||||||
|
case "UnityFS":
|
||||||
|
return FileType.BundleFile;
|
||||||
|
case "UnityWebData1.0":
|
||||||
|
return FileType.WebFile;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
var magic = ReadBytes(2);
|
||||||
|
Position = 0;
|
||||||
|
if (WebFile.gzipMagic.SequenceEqual(magic))
|
||||||
|
{
|
||||||
|
return FileType.WebFile;
|
||||||
|
}
|
||||||
|
Position = 0x20;
|
||||||
|
magic = ReadBytes(6);
|
||||||
|
Position = 0;
|
||||||
|
if (WebFile.brotliMagic.SequenceEqual(magic))
|
||||||
|
{
|
||||||
|
return FileType.WebFile;
|
||||||
|
}
|
||||||
|
if (IsSerializedFile())
|
||||||
|
{
|
||||||
|
return FileType.AssetsFile;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FileType.ResourceFile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsSerializedFile()
|
||||||
|
{
|
||||||
|
var fileSize = BaseStream.Length;
|
||||||
|
if (fileSize < 20)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
var m_MetadataSize = ReadUInt32();
|
||||||
|
long m_FileSize = ReadUInt32();
|
||||||
|
var m_Version = ReadUInt32();
|
||||||
|
long m_DataOffset = ReadUInt32();
|
||||||
|
var m_Endianess = ReadByte();
|
||||||
|
var m_Reserved = ReadBytes(3);
|
||||||
|
if (m_Version >= 22)
|
||||||
|
{
|
||||||
|
if (fileSize < 48)
|
||||||
|
{
|
||||||
|
Position = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
m_MetadataSize = ReadUInt32();
|
||||||
|
m_FileSize = ReadInt64();
|
||||||
|
m_DataOffset = ReadInt64();
|
||||||
|
}
|
||||||
|
Position = 0;
|
||||||
|
if (m_FileSize != fileSize)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (m_DataOffset > fileSize)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AssetStudio
|
||||||
|
{
|
||||||
|
public enum FileType
|
||||||
|
{
|
||||||
|
AssetsFile,
|
||||||
|
BundleFile,
|
||||||
|
WebFile,
|
||||||
|
ResourceFile
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -132,6 +132,7 @@ namespace AssetStudio
|
|||||||
public class ImportedMesh
|
public class ImportedMesh
|
||||||
{
|
{
|
||||||
public string Path { get; set; }
|
public string Path { get; set; }
|
||||||
|
public List<ImportedVertex> VertexList { get; set; }
|
||||||
public List<ImportedSubmesh> SubmeshList { get; set; }
|
public List<ImportedSubmesh> SubmeshList { get; set; }
|
||||||
public List<ImportedBone> BoneList { get; set; }
|
public List<ImportedBone> BoneList { get; set; }
|
||||||
public bool hasNormal { get; set; }
|
public bool hasNormal { get; set; }
|
||||||
@@ -142,9 +143,9 @@ namespace AssetStudio
|
|||||||
|
|
||||||
public class ImportedSubmesh
|
public class ImportedSubmesh
|
||||||
{
|
{
|
||||||
public List<ImportedVertex> VertexList { get; set; }
|
|
||||||
public List<ImportedFace> FaceList { get; set; }
|
public List<ImportedFace> FaceList { get; set; }
|
||||||
public string Material { get; set; }
|
public string Material { get; set; }
|
||||||
|
public int BaseVertex { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ImportedVertex
|
public class ImportedVertex
|
||||||
|
|||||||
@@ -4,14 +4,6 @@ using System.Linq;
|
|||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
public enum FileType
|
|
||||||
{
|
|
||||||
AssetsFile,
|
|
||||||
BundleFile,
|
|
||||||
WebFile,
|
|
||||||
ResourceFile
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ImportHelper
|
public static class ImportHelper
|
||||||
{
|
{
|
||||||
public static void MergeSplitAssets(string path, bool allDirectories = false)
|
public static void MergeSplitAssets(string path, bool allDirectories = false)
|
||||||
@@ -20,8 +12,8 @@ namespace AssetStudio
|
|||||||
foreach (var splitFile in splitFiles)
|
foreach (var splitFile in splitFiles)
|
||||||
{
|
{
|
||||||
var destFile = Path.GetFileNameWithoutExtension(splitFile);
|
var destFile = Path.GetFileNameWithoutExtension(splitFile);
|
||||||
var destPath = Path.GetDirectoryName(splitFile) + "\\";
|
var destPath = Path.GetDirectoryName(splitFile);
|
||||||
var destFull = destPath + destFile;
|
var destFull = Path.Combine(destPath, destFile);
|
||||||
if (!File.Exists(destFull))
|
if (!File.Exists(destFull))
|
||||||
{
|
{
|
||||||
var splitParts = Directory.GetFiles(destPath, destFile + ".split*");
|
var splitParts = Directory.GetFiles(destPath, destFile + ".split*");
|
||||||
@@ -43,7 +35,7 @@ namespace AssetStudio
|
|||||||
public static string[] ProcessingSplitFiles(List<string> selectFile)
|
public static string[] ProcessingSplitFiles(List<string> selectFile)
|
||||||
{
|
{
|
||||||
var splitFiles = selectFile.Where(x => x.Contains(".split"))
|
var splitFiles = selectFile.Where(x => x.Contains(".split"))
|
||||||
.Select(x => Path.GetDirectoryName(x) + "\\" + Path.GetFileNameWithoutExtension(x))
|
.Select(x => Path.Combine(Path.GetDirectoryName(x), Path.GetFileNameWithoutExtension(x)))
|
||||||
.Distinct()
|
.Distinct()
|
||||||
.ToList();
|
.ToList();
|
||||||
selectFile.RemoveAll(x => x.Contains(".split"));
|
selectFile.RemoveAll(x => x.Contains(".split"));
|
||||||
@@ -56,57 +48,5 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
return selectFile.Distinct().ToArray();
|
return selectFile.Distinct().ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static FileType CheckFileType(Stream stream, out EndianBinaryReader reader)
|
|
||||||
{
|
|
||||||
reader = new EndianBinaryReader(stream);
|
|
||||||
return CheckFileType(reader);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static FileType CheckFileType(string fileName, out EndianBinaryReader reader)
|
|
||||||
{
|
|
||||||
reader = new EndianBinaryReader(File.OpenRead(fileName));
|
|
||||||
return CheckFileType(reader);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static FileType CheckFileType(EndianBinaryReader reader)
|
|
||||||
{
|
|
||||||
var signature = reader.ReadStringToNull(20);
|
|
||||||
reader.Position = 0;
|
|
||||||
switch (signature)
|
|
||||||
{
|
|
||||||
case "UnityWeb":
|
|
||||||
case "UnityRaw":
|
|
||||||
case "UnityArchive":
|
|
||||||
case "UnityFS":
|
|
||||||
return FileType.BundleFile;
|
|
||||||
case "UnityWebData1.0":
|
|
||||||
return FileType.WebFile;
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
var magic = reader.ReadBytes(2);
|
|
||||||
reader.Position = 0;
|
|
||||||
if (WebFile.gzipMagic.SequenceEqual(magic))
|
|
||||||
{
|
|
||||||
return FileType.WebFile;
|
|
||||||
}
|
|
||||||
reader.Position = 0x20;
|
|
||||||
magic = reader.ReadBytes(6);
|
|
||||||
reader.Position = 0;
|
|
||||||
if (WebFile.brotliMagic.SequenceEqual(magic))
|
|
||||||
{
|
|
||||||
return FileType.WebFile;
|
|
||||||
}
|
|
||||||
if (SerializedFile.IsSerializedFile(reader))
|
|
||||||
{
|
|
||||||
return FileType.AssetsFile;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return FileType.ResourceFile;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,5 +14,13 @@ namespace AssetStudio
|
|||||||
public static void Info(string message) => Default.Log(LoggerEvent.Info, message);
|
public static void Info(string message) => Default.Log(LoggerEvent.Info, message);
|
||||||
public static void Warning(string message) => Default.Log(LoggerEvent.Warning, message);
|
public static void Warning(string message) => Default.Log(LoggerEvent.Warning, message);
|
||||||
public static void Error(string message) => Default.Log(LoggerEvent.Error, message);
|
public static void Error(string message) => Default.Log(LoggerEvent.Error, message);
|
||||||
|
|
||||||
|
public static void Error(string message, Exception e)
|
||||||
|
{
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
sb.AppendLine(message);
|
||||||
|
sb.AppendLine(e.ToString());
|
||||||
|
Default.Log(LoggerEvent.Error, sb.ToString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ namespace AssetStudio
|
|||||||
public uint byteSize;
|
public uint byteSize;
|
||||||
public int typeID;
|
public int typeID;
|
||||||
public int classID;
|
public int classID;
|
||||||
|
public ushort isDestroyed;
|
||||||
|
public byte stripped;
|
||||||
|
|
||||||
public long m_PathID;
|
public long m_PathID;
|
||||||
public SerializedType serializedType;
|
public SerializedType serializedType;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ namespace AssetStudio
|
|||||||
public ClassIDType type;
|
public ClassIDType type;
|
||||||
public SerializedType serializedType;
|
public SerializedType serializedType;
|
||||||
public BuildTarget platform;
|
public BuildTarget platform;
|
||||||
public uint m_Version;
|
public SerializedFileFormatVersion m_Version;
|
||||||
|
|
||||||
public int[] version => assetsFile.version;
|
public int[] version => assetsFile.version;
|
||||||
public BuildType buildType => assetsFile.buildType;
|
public BuildType buildType => assetsFile.buildType;
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
using System.Reflection;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
// 有关程序集的一般信息由以下
|
|
||||||
// 控制。更改这些特性值可修改
|
|
||||||
// 与程序集关联的信息。
|
|
||||||
[assembly: AssemblyTitle("AssetStudio")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
|
||||||
[assembly: AssemblyProduct("AssetStudio")]
|
|
||||||
[assembly: AssemblyCopyright("Copyright © Perfare 2018-2020")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
|
|
||||||
// 将 ComVisible 设置为 false 会使此程序集中的类型
|
|
||||||
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
|
|
||||||
//请将此类型的 ComVisible 特性设置为 true。
|
|
||||||
[assembly: ComVisible(false)]
|
|
||||||
|
|
||||||
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
|
|
||||||
[assembly: Guid("7662f8c2-7bfd-442e-a948-a43b4f7eb06e")]
|
|
||||||
|
|
||||||
// 程序集的版本信息由下列四个值组成:
|
|
||||||
//
|
|
||||||
// 主版本
|
|
||||||
// 次版本
|
|
||||||
// 生成号
|
|
||||||
// 修订号
|
|
||||||
//
|
|
||||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
|
|
||||||
//通过使用 "*",如下所示:
|
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
||||||
@@ -8,11 +8,10 @@ namespace AssetStudio
|
|||||||
private string path;
|
private string path;
|
||||||
private SerializedFile assetsFile;
|
private SerializedFile assetsFile;
|
||||||
private long offset;
|
private long offset;
|
||||||
private int size;
|
private long size;
|
||||||
private BinaryReader reader;
|
private BinaryReader reader;
|
||||||
|
|
||||||
|
public ResourceReader(string path, SerializedFile assetsFile, long offset, long size)
|
||||||
public ResourceReader(string path, SerializedFile assetsFile, long offset, int size)
|
|
||||||
{
|
{
|
||||||
needSearch = true;
|
needSearch = true;
|
||||||
this.path = path;
|
this.path = path;
|
||||||
@@ -21,28 +20,25 @@ namespace AssetStudio
|
|||||||
this.size = size;
|
this.size = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResourceReader(BinaryReader reader, long offset, int size)
|
public ResourceReader(BinaryReader reader, long offset, long size)
|
||||||
{
|
{
|
||||||
this.reader = reader;
|
this.reader = reader;
|
||||||
this.offset = offset;
|
this.offset = offset;
|
||||||
this.size = size;
|
this.size = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] GetData()
|
private BinaryReader GetReader()
|
||||||
{
|
{
|
||||||
if (needSearch)
|
if (needSearch)
|
||||||
{
|
{
|
||||||
var resourceFileName = Path.GetFileName(path);
|
var resourceFileName = Path.GetFileName(path);
|
||||||
|
|
||||||
if (assetsFile.assetsManager.resourceFileReaders.TryGetValue(resourceFileName, out reader))
|
if (assetsFile.assetsManager.resourceFileReaders.TryGetValue(resourceFileName, out reader))
|
||||||
{
|
{
|
||||||
needSearch = false;
|
needSearch = false;
|
||||||
reader.BaseStream.Position = offset;
|
return reader;
|
||||||
return reader.ReadBytes(size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var assetsFileDirectory = Path.GetDirectoryName(assetsFile.fullName);
|
var assetsFileDirectory = Path.GetDirectoryName(assetsFile.fullName);
|
||||||
var resourceFilePath = assetsFileDirectory + Path.DirectorySeparatorChar + resourceFileName;
|
var resourceFilePath = Path.Combine(assetsFileDirectory, resourceFileName);
|
||||||
if (!File.Exists(resourceFilePath))
|
if (!File.Exists(resourceFilePath))
|
||||||
{
|
{
|
||||||
var findFiles = Directory.GetFiles(assetsFileDirectory, resourceFileName, SearchOption.AllDirectories);
|
var findFiles = Directory.GetFiles(assetsFileDirectory, resourceFileName, SearchOption.AllDirectories);
|
||||||
@@ -53,18 +49,34 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
if (File.Exists(resourceFilePath))
|
if (File.Exists(resourceFilePath))
|
||||||
{
|
{
|
||||||
reader = new BinaryReader(File.OpenRead(resourceFilePath));
|
|
||||||
needSearch = false;
|
needSearch = false;
|
||||||
|
reader = new BinaryReader(File.OpenRead(resourceFilePath));
|
||||||
assetsFile.assetsManager.resourceFileReaders.Add(resourceFileName, reader);
|
assetsFile.assetsManager.resourceFileReaders.Add(resourceFileName, reader);
|
||||||
reader.BaseStream.Position = offset;
|
return reader;
|
||||||
return reader.ReadBytes(size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new FileNotFoundException($"Can't find the resource file {resourceFileName}");
|
throw new FileNotFoundException($"Can't find the resource file {resourceFileName}");
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return reader;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
reader.BaseStream.Position = offset;
|
public byte[] GetData()
|
||||||
return reader.ReadBytes(size);
|
{
|
||||||
|
var binaryReader = GetReader();
|
||||||
|
binaryReader.BaseStream.Position = offset;
|
||||||
|
return binaryReader.ReadBytes((int)size);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteData(string path)
|
||||||
|
{
|
||||||
|
var binaryReader = GetReader();
|
||||||
|
binaryReader.BaseStream.Position = offset;
|
||||||
|
using (var writer = File.OpenWrite(path))
|
||||||
|
{
|
||||||
|
binaryReader.BaseStream.CopyTo(writer, size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+93
-111
@@ -9,7 +9,7 @@ namespace AssetStudio
|
|||||||
public class SerializedFile
|
public class SerializedFile
|
||||||
{
|
{
|
||||||
public AssetsManager assetsManager;
|
public AssetsManager assetsManager;
|
||||||
public EndianBinaryReader reader;
|
public FileReader reader;
|
||||||
public string fullName;
|
public string fullName;
|
||||||
public string originalPath;
|
public string originalPath;
|
||||||
public string fileName;
|
public string fileName;
|
||||||
@@ -19,43 +19,45 @@ namespace AssetStudio
|
|||||||
public Dictionary<long, Object> ObjectsDic;
|
public Dictionary<long, Object> ObjectsDic;
|
||||||
|
|
||||||
public SerializedFileHeader header;
|
public SerializedFileHeader header;
|
||||||
private EndianType m_FileEndianess;
|
private byte m_FileEndianess;
|
||||||
public string unityVersion = "2.5.0f5";
|
public string unityVersion = "2.5.0f5";
|
||||||
public BuildTarget m_TargetPlatform = BuildTarget.UnknownPlatform;
|
public BuildTarget m_TargetPlatform = BuildTarget.UnknownPlatform;
|
||||||
private bool m_EnableTypeTree = true;
|
private bool m_EnableTypeTree = true;
|
||||||
public List<SerializedType> m_Types;
|
public List<SerializedType> m_Types;
|
||||||
public List<SerializedType> m_RefTypes;
|
public int bigIDEnabled = 0;
|
||||||
public List<ObjectInfo> m_Objects;
|
public List<ObjectInfo> m_Objects;
|
||||||
private List<LocalSerializedObjectIdentifier> m_ScriptTypes;
|
private List<LocalSerializedObjectIdentifier> m_ScriptTypes;
|
||||||
public List<FileIdentifier> m_Externals;
|
public List<FileIdentifier> m_Externals;
|
||||||
|
public List<SerializedType> m_RefTypes;
|
||||||
|
public string userInformation;
|
||||||
|
|
||||||
public SerializedFile(AssetsManager assetsManager, string fullName, EndianBinaryReader reader)
|
public SerializedFile(FileReader reader, AssetsManager assetsManager)
|
||||||
{
|
{
|
||||||
this.assetsManager = assetsManager;
|
this.assetsManager = assetsManager;
|
||||||
this.reader = reader;
|
this.reader = reader;
|
||||||
this.fullName = fullName;
|
fullName = reader.FullPath;
|
||||||
fileName = Path.GetFileName(fullName);
|
fileName = reader.FileName;
|
||||||
|
|
||||||
//ReadHeader
|
// ReadHeader
|
||||||
header = new SerializedFileHeader();
|
header = new SerializedFileHeader();
|
||||||
header.m_MetadataSize = reader.ReadUInt32();
|
header.m_MetadataSize = reader.ReadUInt32();
|
||||||
header.m_FileSize = reader.ReadUInt32();
|
header.m_FileSize = reader.ReadUInt32();
|
||||||
header.m_Version = reader.ReadUInt32();
|
header.m_Version = (SerializedFileFormatVersion)reader.ReadUInt32();
|
||||||
header.m_DataOffset = reader.ReadUInt32();
|
header.m_DataOffset = reader.ReadUInt32();
|
||||||
|
|
||||||
if (header.m_Version >= 9)
|
if (header.m_Version >= SerializedFileFormatVersion.kUnknown_9)
|
||||||
{
|
{
|
||||||
header.m_Endianess = reader.ReadByte();
|
header.m_Endianess = reader.ReadByte();
|
||||||
header.m_Reserved = reader.ReadBytes(3);
|
header.m_Reserved = reader.ReadBytes(3);
|
||||||
m_FileEndianess = (EndianType)header.m_Endianess;
|
m_FileEndianess = header.m_Endianess;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
reader.Position = header.m_FileSize - header.m_MetadataSize;
|
reader.Position = header.m_FileSize - header.m_MetadataSize;
|
||||||
m_FileEndianess = (EndianType)reader.ReadByte();
|
m_FileEndianess = reader.ReadByte();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (header.m_Version >= 22)
|
if (header.m_Version >= SerializedFileFormatVersion.kLargeFilesSupport)
|
||||||
{
|
{
|
||||||
header.m_MetadataSize = reader.ReadUInt32();
|
header.m_MetadataSize = reader.ReadUInt32();
|
||||||
header.m_FileSize = reader.ReadInt64();
|
header.m_FileSize = reader.ReadInt64();
|
||||||
@@ -63,17 +65,17 @@ namespace AssetStudio
|
|||||||
reader.ReadInt64(); // unknown
|
reader.ReadInt64(); // unknown
|
||||||
}
|
}
|
||||||
|
|
||||||
//ReadMetadata
|
// ReadMetadata
|
||||||
if (m_FileEndianess == EndianType.LittleEndian)
|
if (m_FileEndianess == 0)
|
||||||
{
|
{
|
||||||
reader.endian = EndianType.LittleEndian;
|
reader.endian = EndianType.LittleEndian;
|
||||||
}
|
}
|
||||||
if (header.m_Version >= 7)
|
if (header.m_Version >= SerializedFileFormatVersion.kUnknown_7)
|
||||||
{
|
{
|
||||||
unityVersion = reader.ReadStringToNull();
|
unityVersion = reader.ReadStringToNull();
|
||||||
SetVersion(unityVersion);
|
SetVersion(unityVersion);
|
||||||
}
|
}
|
||||||
if (header.m_Version >= 8)
|
if (header.m_Version >= SerializedFileFormatVersion.kUnknown_8)
|
||||||
{
|
{
|
||||||
m_TargetPlatform = (BuildTarget)reader.ReadInt32();
|
m_TargetPlatform = (BuildTarget)reader.ReadInt32();
|
||||||
if (!Enum.IsDefined(typeof(BuildTarget), m_TargetPlatform))
|
if (!Enum.IsDefined(typeof(BuildTarget), m_TargetPlatform))
|
||||||
@@ -81,26 +83,25 @@ namespace AssetStudio
|
|||||||
m_TargetPlatform = BuildTarget.UnknownPlatform;
|
m_TargetPlatform = BuildTarget.UnknownPlatform;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (header.m_Version >= 13)
|
if (header.m_Version >= SerializedFileFormatVersion.kHasTypeTreeHashes)
|
||||||
{
|
{
|
||||||
m_EnableTypeTree = reader.ReadBoolean();
|
m_EnableTypeTree = reader.ReadBoolean();
|
||||||
}
|
}
|
||||||
|
|
||||||
//ReadTypes
|
// Read Types
|
||||||
int typeCount = reader.ReadInt32();
|
int typeCount = reader.ReadInt32();
|
||||||
m_Types = new List<SerializedType>(typeCount);
|
m_Types = new List<SerializedType>(typeCount);
|
||||||
for (int i = 0; i < typeCount; i++)
|
for (int i = 0; i < typeCount; i++)
|
||||||
{
|
{
|
||||||
m_Types.Add(ReadSerializedType());
|
m_Types.Add(ReadSerializedType(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
var bigIDEnabled = 0;
|
if (header.m_Version >= SerializedFileFormatVersion.kUnknown_7 && header.m_Version < SerializedFileFormatVersion.kUnknown_14)
|
||||||
if (header.m_Version >= 7 && header.m_Version < 14)
|
|
||||||
{
|
{
|
||||||
bigIDEnabled = reader.ReadInt32();
|
bigIDEnabled = reader.ReadInt32();
|
||||||
}
|
}
|
||||||
|
|
||||||
//ReadObjects
|
// Read Objects
|
||||||
int objectCount = reader.ReadInt32();
|
int objectCount = reader.ReadInt32();
|
||||||
m_Objects = new List<ObjectInfo>(objectCount);
|
m_Objects = new List<ObjectInfo>(objectCount);
|
||||||
Objects = new List<Object>(objectCount);
|
Objects = new List<Object>(objectCount);
|
||||||
@@ -112,7 +113,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
objectInfo.m_PathID = reader.ReadInt64();
|
objectInfo.m_PathID = reader.ReadInt64();
|
||||||
}
|
}
|
||||||
else if (header.m_Version < 14)
|
else if (header.m_Version < SerializedFileFormatVersion.kUnknown_14)
|
||||||
{
|
{
|
||||||
objectInfo.m_PathID = reader.ReadInt32();
|
objectInfo.m_PathID = reader.ReadInt32();
|
||||||
}
|
}
|
||||||
@@ -122,7 +123,7 @@ namespace AssetStudio
|
|||||||
objectInfo.m_PathID = reader.ReadInt64();
|
objectInfo.m_PathID = reader.ReadInt64();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (header.m_Version >= 22)
|
if (header.m_Version >= SerializedFileFormatVersion.kLargeFilesSupport)
|
||||||
objectInfo.byteStart = reader.ReadInt64();
|
objectInfo.byteStart = reader.ReadInt64();
|
||||||
else
|
else
|
||||||
objectInfo.byteStart = reader.ReadUInt32();
|
objectInfo.byteStart = reader.ReadUInt32();
|
||||||
@@ -130,7 +131,7 @@ namespace AssetStudio
|
|||||||
objectInfo.byteStart += header.m_DataOffset;
|
objectInfo.byteStart += header.m_DataOffset;
|
||||||
objectInfo.byteSize = reader.ReadUInt32();
|
objectInfo.byteSize = reader.ReadUInt32();
|
||||||
objectInfo.typeID = reader.ReadInt32();
|
objectInfo.typeID = reader.ReadInt32();
|
||||||
if (header.m_Version < 16)
|
if (header.m_Version < SerializedFileFormatVersion.kRefactoredClassId)
|
||||||
{
|
{
|
||||||
objectInfo.classID = reader.ReadUInt16();
|
objectInfo.classID = reader.ReadUInt16();
|
||||||
objectInfo.serializedType = m_Types.Find(x => x.classID == objectInfo.typeID);
|
objectInfo.serializedType = m_Types.Find(x => x.classID == objectInfo.typeID);
|
||||||
@@ -141,24 +142,24 @@ namespace AssetStudio
|
|||||||
objectInfo.serializedType = type;
|
objectInfo.serializedType = type;
|
||||||
objectInfo.classID = type.classID;
|
objectInfo.classID = type.classID;
|
||||||
}
|
}
|
||||||
if (header.m_Version < 11)
|
if (header.m_Version < SerializedFileFormatVersion.kHasScriptTypeIndex)
|
||||||
{
|
{
|
||||||
var isDestroyed = reader.ReadUInt16();
|
objectInfo.isDestroyed = reader.ReadUInt16();
|
||||||
}
|
}
|
||||||
if (header.m_Version >= 11 && header.m_Version < 17)
|
if (header.m_Version >= SerializedFileFormatVersion.kHasScriptTypeIndex && header.m_Version < SerializedFileFormatVersion.kRefactorTypeData)
|
||||||
{
|
{
|
||||||
var m_ScriptTypeIndex = reader.ReadInt16();
|
var m_ScriptTypeIndex = reader.ReadInt16();
|
||||||
if (objectInfo.serializedType != null)
|
if (objectInfo.serializedType != null)
|
||||||
objectInfo.serializedType.m_ScriptTypeIndex = m_ScriptTypeIndex;
|
objectInfo.serializedType.m_ScriptTypeIndex = m_ScriptTypeIndex;
|
||||||
}
|
}
|
||||||
if (header.m_Version == 15 || header.m_Version == 16)
|
if (header.m_Version == SerializedFileFormatVersion.kSupportsStrippedObject || header.m_Version == SerializedFileFormatVersion.kRefactoredClassId)
|
||||||
{
|
{
|
||||||
var stripped = reader.ReadByte();
|
objectInfo.stripped = reader.ReadByte();
|
||||||
}
|
}
|
||||||
m_Objects.Add(objectInfo);
|
m_Objects.Add(objectInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (header.m_Version >= 11)
|
if (header.m_Version >= SerializedFileFormatVersion.kHasScriptTypeIndex)
|
||||||
{
|
{
|
||||||
int scriptCount = reader.ReadInt32();
|
int scriptCount = reader.ReadInt32();
|
||||||
m_ScriptTypes = new List<LocalSerializedObjectIdentifier>(scriptCount);
|
m_ScriptTypes = new List<LocalSerializedObjectIdentifier>(scriptCount);
|
||||||
@@ -166,7 +167,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
var m_ScriptType = new LocalSerializedObjectIdentifier();
|
var m_ScriptType = new LocalSerializedObjectIdentifier();
|
||||||
m_ScriptType.localSerializedFileIndex = reader.ReadInt32();
|
m_ScriptType.localSerializedFileIndex = reader.ReadInt32();
|
||||||
if (header.m_Version < 14)
|
if (header.m_Version < SerializedFileFormatVersion.kUnknown_14)
|
||||||
{
|
{
|
||||||
m_ScriptType.localIdentifierInFile = reader.ReadInt32();
|
m_ScriptType.localIdentifierInFile = reader.ReadInt32();
|
||||||
}
|
}
|
||||||
@@ -184,11 +185,11 @@ namespace AssetStudio
|
|||||||
for (int i = 0; i < externalsCount; i++)
|
for (int i = 0; i < externalsCount; i++)
|
||||||
{
|
{
|
||||||
var m_External = new FileIdentifier();
|
var m_External = new FileIdentifier();
|
||||||
if (header.m_Version >= 6)
|
if (header.m_Version >= SerializedFileFormatVersion.kUnknown_6)
|
||||||
{
|
{
|
||||||
var tempEmpty = reader.ReadStringToNull();
|
var tempEmpty = reader.ReadStringToNull();
|
||||||
}
|
}
|
||||||
if (header.m_Version >= 5)
|
if (header.m_Version >= SerializedFileFormatVersion.kUnknown_5)
|
||||||
{
|
{
|
||||||
m_External.guid = new Guid(reader.ReadBytes(16));
|
m_External.guid = new Guid(reader.ReadBytes(16));
|
||||||
m_External.type = reader.ReadInt32();
|
m_External.type = reader.ReadInt32();
|
||||||
@@ -198,19 +199,19 @@ namespace AssetStudio
|
|||||||
m_Externals.Add(m_External);
|
m_Externals.Add(m_External);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (header.m_Version >= 20)
|
if (header.m_Version >= SerializedFileFormatVersion.kSupportsRefObject)
|
||||||
{
|
{
|
||||||
int refTypesCount = reader.ReadInt32();
|
int refTypesCount = reader.ReadInt32();
|
||||||
m_RefTypes = new List<SerializedType>(refTypesCount);
|
m_RefTypes = new List<SerializedType>(refTypesCount);
|
||||||
for (int i = 0; i < refTypesCount; i++)
|
for (int i = 0; i < refTypesCount; i++)
|
||||||
{
|
{
|
||||||
m_RefTypes.Add(ReadSerializedType());
|
m_RefTypes.Add(ReadSerializedType(true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (header.m_Version >= 5)
|
if (header.m_Version >= SerializedFileFormatVersion.kUnknown_5)
|
||||||
{
|
{
|
||||||
var userInformation = reader.ReadStringToNull();
|
userInformation = reader.ReadStringToNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
//reader.AlignStream(16);
|
//reader.AlignStream(16);
|
||||||
@@ -218,80 +219,94 @@ namespace AssetStudio
|
|||||||
|
|
||||||
public void SetVersion(string stringVersion)
|
public void SetVersion(string stringVersion)
|
||||||
{
|
{
|
||||||
unityVersion = stringVersion;
|
if (stringVersion != strippedVersion)
|
||||||
var buildSplit = Regex.Replace(stringVersion, @"\d", "").Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries);
|
{
|
||||||
buildType = new BuildType(buildSplit[0]);
|
unityVersion = stringVersion;
|
||||||
var versionSplit = Regex.Replace(stringVersion, @"\D", ".").Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries);
|
var buildSplit = Regex.Replace(stringVersion, @"\d", "").Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
version = versionSplit.Select(int.Parse).ToArray();
|
buildType = new BuildType(buildSplit[0]);
|
||||||
|
var versionSplit = Regex.Replace(stringVersion, @"\D", ".").Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
version = versionSplit.Select(int.Parse).ToArray();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private SerializedType ReadSerializedType()
|
private SerializedType ReadSerializedType(bool isRefType)
|
||||||
{
|
{
|
||||||
var type = new SerializedType();
|
var type = new SerializedType();
|
||||||
|
|
||||||
type.classID = reader.ReadInt32();
|
type.classID = reader.ReadInt32();
|
||||||
|
|
||||||
if (header.m_Version >= 16)
|
if (header.m_Version >= SerializedFileFormatVersion.kRefactoredClassId)
|
||||||
{
|
{
|
||||||
type.m_IsStrippedType = reader.ReadBoolean();
|
type.m_IsStrippedType = reader.ReadBoolean();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (header.m_Version >= 17)
|
if (header.m_Version >= SerializedFileFormatVersion.kRefactorTypeData)
|
||||||
{
|
{
|
||||||
type.m_ScriptTypeIndex = reader.ReadInt16();
|
type.m_ScriptTypeIndex = reader.ReadInt16();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (header.m_Version >= 13)
|
if (header.m_Version >= SerializedFileFormatVersion.kHasTypeTreeHashes)
|
||||||
{
|
{
|
||||||
if ((header.m_Version < 16 && type.classID < 0) || (header.m_Version >= 16 && type.classID == 114))
|
if (isRefType && type.m_ScriptTypeIndex >= 0)
|
||||||
{
|
{
|
||||||
type.m_ScriptID = reader.ReadBytes(16); //Hash128
|
type.m_ScriptID = reader.ReadBytes(16);
|
||||||
}
|
}
|
||||||
type.m_OldTypeHash = reader.ReadBytes(16); //Hash128
|
else if ((header.m_Version < SerializedFileFormatVersion.kRefactoredClassId && type.classID < 0) || (header.m_Version >= SerializedFileFormatVersion.kRefactoredClassId && type.classID == 114))
|
||||||
|
{
|
||||||
|
type.m_ScriptID = reader.ReadBytes(16);
|
||||||
|
}
|
||||||
|
type.m_OldTypeHash = reader.ReadBytes(16);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_EnableTypeTree)
|
if (m_EnableTypeTree)
|
||||||
{
|
{
|
||||||
var typeTree = new List<TypeTreeNode>();
|
type.m_Type = new TypeTree();
|
||||||
if (header.m_Version >= 12 || header.m_Version == 10)
|
type.m_Type.m_Nodes = new List<TypeTreeNode>();
|
||||||
|
if (header.m_Version >= SerializedFileFormatVersion.kUnknown_12 || header.m_Version == SerializedFileFormatVersion.kUnknown_10)
|
||||||
{
|
{
|
||||||
TypeTreeBlobRead(typeTree);
|
TypeTreeBlobRead(type.m_Type);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ReadTypeTree(typeTree);
|
ReadTypeTree(type.m_Type);
|
||||||
}
|
}
|
||||||
|
if (header.m_Version >= SerializedFileFormatVersion.kStoresTypeDependencies)
|
||||||
if (header.m_Version >= 21)
|
|
||||||
{
|
{
|
||||||
type.m_TypeDependencies = reader.ReadInt32Array();
|
if (isRefType)
|
||||||
|
{
|
||||||
|
type.m_KlassName = reader.ReadStringToNull();
|
||||||
|
type.m_NameSpace = reader.ReadStringToNull();
|
||||||
|
type.m_AsmName = reader.ReadStringToNull();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
type.m_TypeDependencies = reader.ReadInt32Array();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type.m_Nodes = typeTree;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ReadTypeTree(List<TypeTreeNode> typeTree, int level = 0)
|
private void ReadTypeTree(TypeTree m_Type, int level = 0)
|
||||||
{
|
{
|
||||||
var typeTreeNode = new TypeTreeNode();
|
var typeTreeNode = new TypeTreeNode();
|
||||||
typeTree.Add(typeTreeNode);
|
m_Type.m_Nodes.Add(typeTreeNode);
|
||||||
typeTreeNode.m_Level = level;
|
typeTreeNode.m_Level = level;
|
||||||
typeTreeNode.m_Type = reader.ReadStringToNull();
|
typeTreeNode.m_Type = reader.ReadStringToNull();
|
||||||
typeTreeNode.m_Name = reader.ReadStringToNull();
|
typeTreeNode.m_Name = reader.ReadStringToNull();
|
||||||
typeTreeNode.m_ByteSize = reader.ReadInt32();
|
typeTreeNode.m_ByteSize = reader.ReadInt32();
|
||||||
if (header.m_Version == 2)
|
if (header.m_Version == SerializedFileFormatVersion.kUnknown_2)
|
||||||
{
|
{
|
||||||
var variableCount = reader.ReadInt32();
|
var variableCount = reader.ReadInt32();
|
||||||
}
|
}
|
||||||
if (header.m_Version != 3)
|
if (header.m_Version != SerializedFileFormatVersion.kUnknown_3)
|
||||||
{
|
{
|
||||||
typeTreeNode.m_Index = reader.ReadInt32();
|
typeTreeNode.m_Index = reader.ReadInt32();
|
||||||
}
|
}
|
||||||
typeTreeNode.m_IsArray = reader.ReadInt32();
|
typeTreeNode.m_TypeFlags = reader.ReadInt32();
|
||||||
typeTreeNode.m_Version = reader.ReadInt32();
|
typeTreeNode.m_Version = reader.ReadInt32();
|
||||||
if (header.m_Version != 3)
|
if (header.m_Version != SerializedFileFormatVersion.kUnknown_3)
|
||||||
{
|
{
|
||||||
typeTreeNode.m_MetaFlag = reader.ReadInt32();
|
typeTreeNode.m_MetaFlag = reader.ReadInt32();
|
||||||
}
|
}
|
||||||
@@ -299,40 +314,40 @@ namespace AssetStudio
|
|||||||
int childrenCount = reader.ReadInt32();
|
int childrenCount = reader.ReadInt32();
|
||||||
for (int i = 0; i < childrenCount; i++)
|
for (int i = 0; i < childrenCount; i++)
|
||||||
{
|
{
|
||||||
ReadTypeTree(typeTree, level + 1);
|
ReadTypeTree(m_Type, level + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void TypeTreeBlobRead(List<TypeTreeNode> typeTree)
|
private void TypeTreeBlobRead(TypeTree m_Type)
|
||||||
{
|
{
|
||||||
int numberOfNodes = reader.ReadInt32();
|
int numberOfNodes = reader.ReadInt32();
|
||||||
int stringBufferSize = reader.ReadInt32();
|
int stringBufferSize = reader.ReadInt32();
|
||||||
for (int i = 0; i < numberOfNodes; i++)
|
for (int i = 0; i < numberOfNodes; i++)
|
||||||
{
|
{
|
||||||
var typeTreeNode = new TypeTreeNode();
|
var typeTreeNode = new TypeTreeNode();
|
||||||
typeTree.Add(typeTreeNode);
|
m_Type.m_Nodes.Add(typeTreeNode);
|
||||||
typeTreeNode.m_Version = reader.ReadUInt16();
|
typeTreeNode.m_Version = reader.ReadUInt16();
|
||||||
typeTreeNode.m_Level = reader.ReadByte();
|
typeTreeNode.m_Level = reader.ReadByte();
|
||||||
typeTreeNode.m_IsArray = reader.ReadBoolean() ? 1 : 0;
|
typeTreeNode.m_TypeFlags = reader.ReadByte();
|
||||||
typeTreeNode.m_TypeStrOffset = reader.ReadUInt32();
|
typeTreeNode.m_TypeStrOffset = reader.ReadUInt32();
|
||||||
typeTreeNode.m_NameStrOffset = reader.ReadUInt32();
|
typeTreeNode.m_NameStrOffset = reader.ReadUInt32();
|
||||||
typeTreeNode.m_ByteSize = reader.ReadInt32();
|
typeTreeNode.m_ByteSize = reader.ReadInt32();
|
||||||
typeTreeNode.m_Index = reader.ReadInt32();
|
typeTreeNode.m_Index = reader.ReadInt32();
|
||||||
typeTreeNode.m_MetaFlag = reader.ReadInt32();
|
typeTreeNode.m_MetaFlag = reader.ReadInt32();
|
||||||
if (header.m_Version >= 19)
|
if (header.m_Version >= SerializedFileFormatVersion.kTypeTreeNodeWithTypeFlags)
|
||||||
{
|
{
|
||||||
typeTreeNode.m_RefTypeHash = reader.ReadUInt64();
|
typeTreeNode.m_RefTypeHash = reader.ReadUInt64();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var m_StringBuffer = reader.ReadBytes(stringBufferSize);
|
m_Type.m_StringBuffer = reader.ReadBytes(stringBufferSize);
|
||||||
|
|
||||||
using (var stringBufferReader = new BinaryReader(new MemoryStream(m_StringBuffer)))
|
using (var stringBufferReader = new BinaryReader(new MemoryStream(m_Type.m_StringBuffer)))
|
||||||
{
|
{
|
||||||
for (int i = 0; i < numberOfNodes; i++)
|
for (int i = 0; i < numberOfNodes; i++)
|
||||||
{
|
{
|
||||||
var typeTreeNode = typeTree[i];
|
var m_Node = m_Type.m_Nodes[i];
|
||||||
typeTreeNode.m_Type = ReadString(stringBufferReader, typeTreeNode.m_TypeStrOffset);
|
m_Node.m_Type = ReadString(stringBufferReader, m_Node.m_TypeStrOffset);
|
||||||
typeTreeNode.m_Name = ReadString(stringBufferReader, typeTreeNode.m_NameStrOffset);
|
m_Node.m_Name = ReadString(stringBufferReader, m_Node.m_NameStrOffset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -359,41 +374,8 @@ namespace AssetStudio
|
|||||||
ObjectsDic.Add(obj.m_PathID, obj);
|
ObjectsDic.Add(obj.m_PathID, obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsSerializedFile(EndianBinaryReader reader)
|
public bool IsVersionStripped => unityVersion == strippedVersion;
|
||||||
{
|
|
||||||
var fileSize = reader.BaseStream.Length;
|
private const string strippedVersion = "0.0.0";
|
||||||
if (fileSize < 20)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
var m_MetadataSize = reader.ReadUInt32();
|
|
||||||
long m_FileSize = reader.ReadUInt32();
|
|
||||||
var m_Version = reader.ReadUInt32();
|
|
||||||
long m_DataOffset = reader.ReadUInt32();
|
|
||||||
var m_Endianess = reader.ReadByte();
|
|
||||||
var m_Reserved = reader.ReadBytes(3);
|
|
||||||
if (m_Version >= 22)
|
|
||||||
{
|
|
||||||
if (fileSize < 48)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
m_MetadataSize = reader.ReadUInt32();
|
|
||||||
m_FileSize = reader.ReadInt64();
|
|
||||||
m_DataOffset = reader.ReadInt64();
|
|
||||||
}
|
|
||||||
if (m_FileSize != fileSize)
|
|
||||||
{
|
|
||||||
reader.Position = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (m_DataOffset > fileSize)
|
|
||||||
{
|
|
||||||
reader.Position = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
reader.Position = 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,87 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AssetStudio
|
||||||
|
{
|
||||||
|
public enum SerializedFileFormatVersion
|
||||||
|
{
|
||||||
|
kUnsupported = 1,
|
||||||
|
kUnknown_2 = 2,
|
||||||
|
kUnknown_3 = 3,
|
||||||
|
/// <summary>
|
||||||
|
/// 1.2.0 to 2.0.0
|
||||||
|
/// </summary>
|
||||||
|
kUnknown_5 = 5,
|
||||||
|
/// <summary>
|
||||||
|
/// 2.1.0 to 2.6.1
|
||||||
|
/// </summary>
|
||||||
|
kUnknown_6 = 6,
|
||||||
|
/// <summary>
|
||||||
|
/// 3.0.0b
|
||||||
|
/// </summary>
|
||||||
|
kUnknown_7 = 7,
|
||||||
|
/// <summary>
|
||||||
|
/// 3.0.0 to 3.4.2
|
||||||
|
/// </summary>
|
||||||
|
kUnknown_8 = 8,
|
||||||
|
/// <summary>
|
||||||
|
/// 3.5.0 to 4.7.2
|
||||||
|
/// </summary>
|
||||||
|
kUnknown_9 = 9,
|
||||||
|
/// <summary>
|
||||||
|
/// 5.0.0aunk1
|
||||||
|
/// </summary>
|
||||||
|
kUnknown_10 = 10,
|
||||||
|
/// <summary>
|
||||||
|
/// 5.0.0aunk2
|
||||||
|
/// </summary>
|
||||||
|
kHasScriptTypeIndex = 11,
|
||||||
|
/// <summary>
|
||||||
|
/// 5.0.0aunk3
|
||||||
|
/// </summary>
|
||||||
|
kUnknown_12 = 12,
|
||||||
|
/// <summary>
|
||||||
|
/// 5.0.0aunk4
|
||||||
|
/// </summary>
|
||||||
|
kHasTypeTreeHashes = 13,
|
||||||
|
/// <summary>
|
||||||
|
/// 5.0.0unk
|
||||||
|
/// </summary>
|
||||||
|
kUnknown_14 = 14,
|
||||||
|
/// <summary>
|
||||||
|
/// 5.0.1 to 5.4.0
|
||||||
|
/// </summary>
|
||||||
|
kSupportsStrippedObject = 15,
|
||||||
|
/// <summary>
|
||||||
|
/// 5.5.0a
|
||||||
|
/// </summary>
|
||||||
|
kRefactoredClassId = 16,
|
||||||
|
/// <summary>
|
||||||
|
/// 5.5.0unk to 2018.4
|
||||||
|
/// </summary>
|
||||||
|
kRefactorTypeData = 17,
|
||||||
|
/// <summary>
|
||||||
|
/// 2019.1a
|
||||||
|
/// </summary>
|
||||||
|
kRefactorShareableTypeTreeData = 18,
|
||||||
|
/// <summary>
|
||||||
|
/// 2019.1unk
|
||||||
|
/// </summary>
|
||||||
|
kTypeTreeNodeWithTypeFlags = 19,
|
||||||
|
/// <summary>
|
||||||
|
/// 2019.2
|
||||||
|
/// </summary>
|
||||||
|
kSupportsRefObject = 20,
|
||||||
|
/// <summary>
|
||||||
|
/// 2019.3 to 2019.4
|
||||||
|
/// </summary>
|
||||||
|
kStoresTypeDependencies = 21,
|
||||||
|
/// <summary>
|
||||||
|
/// 2020.1 to x
|
||||||
|
/// </summary>
|
||||||
|
kLargeFilesSupport = 22
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
public uint m_MetadataSize;
|
public uint m_MetadataSize;
|
||||||
public long m_FileSize;
|
public long m_FileSize;
|
||||||
public uint m_Version;
|
public SerializedFileFormatVersion m_Version;
|
||||||
public long m_DataOffset;
|
public long m_DataOffset;
|
||||||
public byte m_Endianess;
|
public byte m_Endianess;
|
||||||
public byte[] m_Reserved;
|
public byte[] m_Reserved;
|
||||||
|
|||||||
@@ -10,9 +10,12 @@ namespace AssetStudio
|
|||||||
public int classID;
|
public int classID;
|
||||||
public bool m_IsStrippedType;
|
public bool m_IsStrippedType;
|
||||||
public short m_ScriptTypeIndex = -1;
|
public short m_ScriptTypeIndex = -1;
|
||||||
public List<TypeTreeNode> m_Nodes;
|
public TypeTree m_Type;
|
||||||
public byte[] m_ScriptID; //Hash128
|
public byte[] m_ScriptID; //Hash128
|
||||||
public byte[] m_OldTypeHash; //Hash128
|
public byte[] m_OldTypeHash; //Hash128
|
||||||
public int[] m_TypeDependencies;
|
public int[] m_TypeDependencies;
|
||||||
|
public string m_KlassName;
|
||||||
|
public string m_NameSpace;
|
||||||
|
public string m_AsmName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,15 +34,16 @@ namespace AssetStudio
|
|||||||
return newOutStream;
|
return newOutStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void StreamDecompress(Stream inStream, Stream outStream, long inSize, long outSize)
|
public static void StreamDecompress(Stream compressedStream, Stream decompressedStream, long compressedSize, long decompressedSize)
|
||||||
{
|
{
|
||||||
|
var basePosition = compressedStream.Position;
|
||||||
var decoder = new Decoder();
|
var decoder = new Decoder();
|
||||||
var properties = new byte[5];
|
var properties = new byte[5];
|
||||||
if (inStream.Read(properties, 0, 5) != 5)
|
if (compressedStream.Read(properties, 0, 5) != 5)
|
||||||
throw new Exception("input .lzma is too short");
|
throw new Exception("input .lzma is too short");
|
||||||
decoder.SetDecoderProperties(properties);
|
decoder.SetDecoderProperties(properties);
|
||||||
inSize -= 5L;
|
decoder.Code(compressedStream, decompressedStream, compressedSize - 5, decompressedSize, null);
|
||||||
decoder.Code(inStream, outStream, inSize, outSize, null);
|
compressedStream.Position = basePosition + compressedSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
public class StreamFile
|
public class StreamFile
|
||||||
{
|
{
|
||||||
|
public string path;
|
||||||
public string fileName;
|
public string fileName;
|
||||||
public Stream stream;
|
public Stream stream;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace AssetStudio
|
||||||
|
{
|
||||||
|
public class TypeTree
|
||||||
|
{
|
||||||
|
public List<TypeTreeNode> m_Nodes;
|
||||||
|
public byte[] m_StringBuffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,30 +1,38 @@
|
|||||||
using System;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Specialized;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
public static class TypeTreeHelper
|
public static class TypeTreeHelper
|
||||||
{
|
{
|
||||||
public static void ReadTypeString(StringBuilder sb, List<TypeTreeNode> members, BinaryReader reader)
|
public static string ReadTypeString(TypeTree m_Type, ObjectReader reader)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < members.Count; i++)
|
reader.Reset();
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
var m_Nodes = m_Type.m_Nodes;
|
||||||
|
for (int i = 0; i < m_Nodes.Count; i++)
|
||||||
{
|
{
|
||||||
ReadStringValue(sb, members, reader, ref i);
|
ReadStringValue(sb, m_Nodes, reader, ref i);
|
||||||
}
|
}
|
||||||
|
var readed = reader.Position - reader.byteStart;
|
||||||
|
if (readed != reader.byteSize)
|
||||||
|
{
|
||||||
|
Logger.Info($"Error while read type, read {readed} bytes but expected {reader.byteSize} bytes");
|
||||||
|
}
|
||||||
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ReadStringValue(StringBuilder sb, List<TypeTreeNode> members, BinaryReader reader, ref int i)
|
private static void ReadStringValue(StringBuilder sb, List<TypeTreeNode> m_Nodes, BinaryReader reader, ref int i)
|
||||||
{
|
{
|
||||||
var member = members[i];
|
var m_Node = m_Nodes[i];
|
||||||
var level = member.m_Level;
|
var level = m_Node.m_Level;
|
||||||
var varTypeStr = member.m_Type;
|
var varTypeStr = m_Node.m_Type;
|
||||||
var varNameStr = member.m_Name;
|
var varNameStr = m_Node.m_Name;
|
||||||
object value = null;
|
object value = null;
|
||||||
var append = true;
|
var append = true;
|
||||||
var align = (member.m_MetaFlag & 0x4000) != 0;
|
var align = (m_Node.m_MetaFlag & 0x4000) != 0;
|
||||||
switch (varTypeStr)
|
switch (varTypeStr)
|
||||||
{
|
{
|
||||||
case "SInt8":
|
case "SInt8":
|
||||||
@@ -77,18 +85,18 @@ namespace AssetStudio
|
|||||||
break;
|
break;
|
||||||
case "map":
|
case "map":
|
||||||
{
|
{
|
||||||
if ((members[i + 1].m_MetaFlag & 0x4000) != 0)
|
if ((m_Nodes[i + 1].m_MetaFlag & 0x4000) != 0)
|
||||||
align = true;
|
align = true;
|
||||||
append = false;
|
append = false;
|
||||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
||||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level + 1)), "Array", "Array");
|
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level + 1)), "Array", "Array");
|
||||||
var size = reader.ReadInt32();
|
var size = reader.ReadInt32();
|
||||||
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level + 1)), "int", "size", size);
|
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level + 1)), "int", "size", size);
|
||||||
var map = GetMembers(members, i);
|
var map = GetNodes(m_Nodes, i);
|
||||||
i += map.Count - 1;
|
i += map.Count - 1;
|
||||||
var first = GetMembers(map, 4);
|
var first = GetNodes(map, 4);
|
||||||
var next = 4 + first.Count;
|
var next = 4 + first.Count;
|
||||||
var second = GetMembers(map, next);
|
var second = GetNodes(map, next);
|
||||||
for (int j = 0; j < size; j++)
|
for (int j = 0; j < size; j++)
|
||||||
{
|
{
|
||||||
sb.AppendFormat("{0}[{1}]\r\n", (new string('\t', level + 2)), j);
|
sb.AppendFormat("{0}[{1}]\r\n", (new string('\t', level + 2)), j);
|
||||||
@@ -112,16 +120,16 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (i < members.Count - 1 && members[i + 1].m_Type == "Array") //Array
|
if (i < m_Nodes.Count - 1 && m_Nodes[i + 1].m_Type == "Array") //Array
|
||||||
{
|
{
|
||||||
if ((members[i + 1].m_MetaFlag & 0x4000) != 0)
|
if ((m_Nodes[i + 1].m_MetaFlag & 0x4000) != 0)
|
||||||
align = true;
|
align = true;
|
||||||
append = false;
|
append = false;
|
||||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
||||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level + 1)), "Array", "Array");
|
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level + 1)), "Array", "Array");
|
||||||
var size = reader.ReadInt32();
|
var size = reader.ReadInt32();
|
||||||
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level + 1)), "int", "size", size);
|
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level + 1)), "int", "size", size);
|
||||||
var vector = GetMembers(members, i);
|
var vector = GetNodes(m_Nodes, i);
|
||||||
i += vector.Count - 1;
|
i += vector.Count - 1;
|
||||||
for (int j = 0; j < size; j++)
|
for (int j = 0; j < size; j++)
|
||||||
{
|
{
|
||||||
@@ -135,7 +143,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
append = false;
|
append = false;
|
||||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
||||||
var @class = GetMembers(members, i);
|
var @class = GetNodes(m_Nodes, i);
|
||||||
i += @class.Count - 1;
|
i += @class.Count - 1;
|
||||||
for (int j = 1; j < @class.Count; j++)
|
for (int j = 1; j < @class.Count; j++)
|
||||||
{
|
{
|
||||||
@@ -151,24 +159,31 @@ namespace AssetStudio
|
|||||||
reader.AlignStream();
|
reader.AlignStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UType ReadUType(List<TypeTreeNode> members, BinaryReader reader)
|
public static OrderedDictionary ReadType(TypeTree m_Types, ObjectReader reader)
|
||||||
{
|
{
|
||||||
var obj = new UType();
|
reader.Reset();
|
||||||
for (int i = 1; i < members.Count; i++)
|
var obj = new OrderedDictionary();
|
||||||
|
var m_Nodes = m_Types.m_Nodes;
|
||||||
|
for (int i = 1; i < m_Nodes.Count; i++)
|
||||||
{
|
{
|
||||||
var member = members[i];
|
var m_Node = m_Nodes[i];
|
||||||
var varNameStr = member.m_Name;
|
var varNameStr = m_Node.m_Name;
|
||||||
obj[varNameStr] = ReadValue(members, reader, ref i);
|
obj[varNameStr] = ReadValue(m_Nodes, reader, ref i);
|
||||||
|
}
|
||||||
|
var readed = reader.Position - reader.byteStart;
|
||||||
|
if (readed != reader.byteSize)
|
||||||
|
{
|
||||||
|
Logger.Info($"Error while read type, read {readed} bytes but expected {reader.byteSize} bytes");
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static object ReadValue(List<TypeTreeNode> members, BinaryReader reader, ref int i)
|
private static object ReadValue(List<TypeTreeNode> m_Nodes, BinaryReader reader, ref int i)
|
||||||
{
|
{
|
||||||
var member = members[i];
|
var m_Node = m_Nodes[i];
|
||||||
var varTypeStr = member.m_Type;
|
var varTypeStr = m_Node.m_Type;
|
||||||
object value;
|
object value;
|
||||||
var align = (member.m_MetaFlag & 0x4000) != 0;
|
var align = (m_Node.m_MetaFlag & 0x4000) != 0;
|
||||||
switch (varTypeStr)
|
switch (varTypeStr)
|
||||||
{
|
{
|
||||||
case "SInt8":
|
case "SInt8":
|
||||||
@@ -219,13 +234,13 @@ namespace AssetStudio
|
|||||||
break;
|
break;
|
||||||
case "map":
|
case "map":
|
||||||
{
|
{
|
||||||
if ((members[i + 1].m_MetaFlag & 0x4000) != 0)
|
if ((m_Nodes[i + 1].m_MetaFlag & 0x4000) != 0)
|
||||||
align = true;
|
align = true;
|
||||||
var map = GetMembers(members, i);
|
var map = GetNodes(m_Nodes, i);
|
||||||
i += map.Count - 1;
|
i += map.Count - 1;
|
||||||
var first = GetMembers(map, 4);
|
var first = GetNodes(map, 4);
|
||||||
var next = 4 + first.Count;
|
var next = 4 + first.Count;
|
||||||
var second = GetMembers(map, next);
|
var second = GetNodes(map, next);
|
||||||
var size = reader.ReadInt32();
|
var size = reader.ReadInt32();
|
||||||
var dic = new List<KeyValuePair<object, object>>(size);
|
var dic = new List<KeyValuePair<object, object>>(size);
|
||||||
for (int j = 0; j < size; j++)
|
for (int j = 0; j < size; j++)
|
||||||
@@ -246,11 +261,11 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
if (i < members.Count - 1 && members[i + 1].m_Type == "Array") //Array
|
if (i < m_Nodes.Count - 1 && m_Nodes[i + 1].m_Type == "Array") //Array
|
||||||
{
|
{
|
||||||
if ((members[i + 1].m_MetaFlag & 0x4000) != 0)
|
if ((m_Nodes[i + 1].m_MetaFlag & 0x4000) != 0)
|
||||||
align = true;
|
align = true;
|
||||||
var vector = GetMembers(members, i);
|
var vector = GetNodes(m_Nodes, i);
|
||||||
i += vector.Count - 1;
|
i += vector.Count - 1;
|
||||||
var size = reader.ReadInt32();
|
var size = reader.ReadInt32();
|
||||||
var list = new List<object>(size);
|
var list = new List<object>(size);
|
||||||
@@ -264,9 +279,9 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
else //Class
|
else //Class
|
||||||
{
|
{
|
||||||
var @class = GetMembers(members, i);
|
var @class = GetNodes(m_Nodes, i);
|
||||||
i += @class.Count - 1;
|
i += @class.Count - 1;
|
||||||
var obj = new UType();
|
var obj = new OrderedDictionary();
|
||||||
for (int j = 1; j < @class.Count; j++)
|
for (int j = 1; j < @class.Count; j++)
|
||||||
{
|
{
|
||||||
var classmember = @class[j];
|
var classmember = @class[j];
|
||||||
@@ -283,22 +298,22 @@ namespace AssetStudio
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<TypeTreeNode> GetMembers(List<TypeTreeNode> members, int index)
|
private static List<TypeTreeNode> GetNodes(List<TypeTreeNode> m_Nodes, int index)
|
||||||
{
|
{
|
||||||
var member2 = new List<TypeTreeNode>();
|
var nodes = new List<TypeTreeNode>();
|
||||||
member2.Add(members[index]);
|
nodes.Add(m_Nodes[index]);
|
||||||
var level = members[index].m_Level;
|
var level = m_Nodes[index].m_Level;
|
||||||
for (int i = index + 1; i < members.Count; i++)
|
for (int i = index + 1; i < m_Nodes.Count; i++)
|
||||||
{
|
{
|
||||||
var member = members[i];
|
var member = m_Nodes[i];
|
||||||
var level2 = member.m_Level;
|
var level2 = member.m_Level;
|
||||||
if (level2 <= level)
|
if (level2 <= level)
|
||||||
{
|
{
|
||||||
return member2;
|
return nodes;
|
||||||
}
|
}
|
||||||
member2.Add(member);
|
nodes.Add(member);
|
||||||
}
|
}
|
||||||
return member2;
|
return nodes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,12 +11,22 @@ namespace AssetStudio
|
|||||||
public string m_Name;
|
public string m_Name;
|
||||||
public int m_ByteSize;
|
public int m_ByteSize;
|
||||||
public int m_Index;
|
public int m_Index;
|
||||||
public int m_IsArray; //m_TypeFlags
|
public int m_TypeFlags; //m_IsArray
|
||||||
public int m_Version;
|
public int m_Version;
|
||||||
public int m_MetaFlag;
|
public int m_MetaFlag;
|
||||||
public int m_Level;
|
public int m_Level;
|
||||||
public uint m_TypeStrOffset;
|
public uint m_TypeStrOffset;
|
||||||
public uint m_NameStrOffset;
|
public uint m_NameStrOffset;
|
||||||
public ulong m_RefTypeHash;
|
public ulong m_RefTypeHash;
|
||||||
|
|
||||||
|
public TypeTreeNode() { }
|
||||||
|
|
||||||
|
public TypeTreeNode(string type, string name, int level, bool align)
|
||||||
|
{
|
||||||
|
m_Type = type;
|
||||||
|
m_Name = name;
|
||||||
|
m_Level = level;
|
||||||
|
m_MetaFlag = align ? 0x4000 : 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,108 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace AssetStudio
|
|
||||||
{
|
|
||||||
public class UType : IDictionary<string, object>
|
|
||||||
{
|
|
||||||
private List<string> keys;
|
|
||||||
private IDictionary<string, object> values;
|
|
||||||
|
|
||||||
public UType()
|
|
||||||
{
|
|
||||||
keys = new List<string>();
|
|
||||||
values = new Dictionary<string, object>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public object this[string key]
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (!values.ContainsKey(key))
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return values[key];
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
if (!values.ContainsKey(key))
|
|
||||||
{
|
|
||||||
keys.Add(key);
|
|
||||||
}
|
|
||||||
values[key] = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ICollection<string> Keys => keys;
|
|
||||||
|
|
||||||
public ICollection<object> Values => values.Values;
|
|
||||||
|
|
||||||
public int Count => keys.Count;
|
|
||||||
|
|
||||||
public bool IsReadOnly => false;
|
|
||||||
|
|
||||||
public void Add(string key, object value)
|
|
||||||
{
|
|
||||||
keys.Add(key);
|
|
||||||
values.Add(key, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Add(KeyValuePair<string, object> item)
|
|
||||||
{
|
|
||||||
keys.Add(item.Key);
|
|
||||||
values.Add(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Clear()
|
|
||||||
{
|
|
||||||
keys.Clear();
|
|
||||||
values.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Contains(KeyValuePair<string, object> item)
|
|
||||||
{
|
|
||||||
return values.Contains(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool ContainsKey(string key)
|
|
||||||
{
|
|
||||||
return values.ContainsKey(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
|
|
||||||
{
|
|
||||||
values.CopyTo(array, arrayIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
|
|
||||||
{
|
|
||||||
return values.GetEnumerator();
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Remove(string key)
|
|
||||||
{
|
|
||||||
keys.Remove(key);
|
|
||||||
return values.Remove(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Remove(KeyValuePair<string, object> item)
|
|
||||||
{
|
|
||||||
keys.Remove(item.Key);
|
|
||||||
return values.Remove(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool TryGetValue(string key, out object value)
|
|
||||||
{
|
|
||||||
return values.TryGetValue(key, out value);
|
|
||||||
}
|
|
||||||
|
|
||||||
IEnumerator IEnumerable.GetEnumerator()
|
|
||||||
{
|
|
||||||
return values.GetEnumerator();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -83,6 +83,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
var data = dataList[i];
|
var data = dataList[i];
|
||||||
var file = new StreamFile();
|
var file = new StreamFile();
|
||||||
|
file.path = data.path;
|
||||||
file.fileName = Path.GetFileName(data.path);
|
file.fileName = Path.GetFileName(data.path);
|
||||||
reader.BaseStream.Position = data.dataOffset;
|
reader.BaseStream.Position = data.dataOffset;
|
||||||
file.stream = new MemoryStream(reader.ReadBytes(data.dataLength));
|
file.stream = new MemoryStream(reader.ReadBytes(data.dataLength));
|
||||||
|
|||||||
@@ -98,15 +98,17 @@
|
|||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<PreprocessorDefinitions>_AS_DLL;FBXSDK_SHARED;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_AS_DLL;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>libfbxsdk.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>libfbxsdk-mt.lib;libxml2-mt.lib;zlib-mt.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\lib\vs2017\x86\release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\lib\vs2017\x86\debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
<IgnoreSpecificDefaultLibraries>LIBCMT;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
@@ -115,16 +117,17 @@
|
|||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<PreprocessorDefinitions>_AS_DLL;FBXSDK_SHARED;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_AS_DLL;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>libfbxsdk.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>libfbxsdk-mt.lib;libxml2-mt.lib;zlib-mt.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\lib\vs2017\x86\release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\lib\vs2017\x86\release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
@@ -132,15 +135,17 @@
|
|||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<PreprocessorDefinitions>_AS_DLL;FBXSDK_SHARED;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_AS_DLL;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>libfbxsdk.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>libfbxsdk-mt.lib;libxml2-mt.lib;zlib-mt.lib;wininet.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\lib\vs2017\x64\release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\lib\vs2017\x64\debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
<IgnoreSpecificDefaultLibraries>LIBCMT;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
@@ -149,16 +154,17 @@
|
|||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<PreprocessorDefinitions>_AS_DLL;FBXSDK_SHARED;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_AS_DLL;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalDependencies>libfbxsdk.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
<AdditionalDependencies>libfbxsdk-mt.lib;libxml2-mt.lib;zlib-mt.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
<AdditionalLibraryDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\lib\vs2017\x64\release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<AdditionalLibraryDirectories>C:\Program Files\Autodesk\FBX\FBX SDK\2020.0.1\lib\vs2017\x64\release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
|
|||||||
@@ -941,22 +941,22 @@ AS_API(int32_t) AsFbxAnimGetCurrentBlendShapeChannelCount(AsFbxAnimContext* pAni
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto lGeometry = dynamic_cast<FbxGeometry*>(pNode->GetNodeAttribute());
|
auto pMesh = pNode->GetMesh();
|
||||||
pAnimContext->lGeometry = lGeometry;
|
pAnimContext->pMesh = pMesh;
|
||||||
|
|
||||||
if (lGeometry == nullptr)
|
if (pMesh == nullptr)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto blendShapeDeformerCount = lGeometry->GetDeformerCount(FbxDeformer::eBlendShape);
|
auto blendShapeDeformerCount = pMesh->GetDeformerCount(FbxDeformer::eBlendShape);
|
||||||
|
|
||||||
if (blendShapeDeformerCount <= 0)
|
if (blendShapeDeformerCount <= 0)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto lBlendShape = dynamic_cast<FbxBlendShape*>(lGeometry->GetDeformer(0, FbxDeformer::eBlendShape));
|
auto lBlendShape = (FbxBlendShape*)pMesh->GetDeformer(0, FbxDeformer::eBlendShape);
|
||||||
pAnimContext->lBlendShape = lBlendShape;
|
pAnimContext->lBlendShape = lBlendShape;
|
||||||
|
|
||||||
if (lBlendShape == nullptr)
|
if (lBlendShape == nullptr)
|
||||||
@@ -991,12 +991,12 @@ AS_API(bool32_t) AsFbxAnimIsBlendShapeChannelMatch(AsFbxAnimContext* pAnimContex
|
|||||||
|
|
||||||
AS_API(void) AsFbxAnimBeginBlendShapeAnimCurve(AsFbxAnimContext* pAnimContext, int32_t channelIndex)
|
AS_API(void) AsFbxAnimBeginBlendShapeAnimCurve(AsFbxAnimContext* pAnimContext, int32_t channelIndex)
|
||||||
{
|
{
|
||||||
if (pAnimContext == nullptr || pAnimContext->lGeometry == nullptr || pAnimContext->lAnimLayer == nullptr)
|
if (pAnimContext == nullptr || pAnimContext->pMesh == nullptr || pAnimContext->lAnimLayer == nullptr)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pAnimContext->lAnimCurve = pAnimContext->lGeometry->GetShapeChannel(0, channelIndex, pAnimContext->lAnimLayer, true);
|
pAnimContext->lAnimCurve = pAnimContext->pMesh->GetShapeChannel(0, channelIndex, pAnimContext->lAnimLayer, true);
|
||||||
pAnimContext->lAnimCurve->KeyModifyBegin();
|
pAnimContext->lAnimCurve->KeyModifyBegin();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1093,7 +1093,7 @@ AS_API(void) AsFbxMorphAddBlendShapeChannel(AsFbxContext* pContext, AsFbxMorphCo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AS_API(void) AsFbxMorphAddBlendShapeChannelShape(AsFbxContext* pContext, AsFbxMorphContext* pMorphContext, float weight)
|
AS_API(void) AsFbxMorphAddBlendShapeChannelShape(AsFbxContext* pContext, AsFbxMorphContext* pMorphContext, float weight, const char* shapeName)
|
||||||
{
|
{
|
||||||
if (pContext == nullptr || pContext->pScene == nullptr)
|
if (pContext == nullptr || pContext->pScene == nullptr)
|
||||||
{
|
{
|
||||||
@@ -1105,7 +1105,7 @@ AS_API(void) AsFbxMorphAddBlendShapeChannelShape(AsFbxContext* pContext, AsFbxMo
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto lShape = FbxShape::Create(pContext->pScene, FbxString(weight));
|
auto lShape = FbxShape::Create(pContext->pScene, shapeName);
|
||||||
pMorphContext->lShape = lShape;
|
pMorphContext->lShape = lShape;
|
||||||
|
|
||||||
if (pMorphContext->lBlendShapeChannel != nullptr) {
|
if (pMorphContext->lBlendShapeChannel != nullptr) {
|
||||||
@@ -1126,12 +1126,9 @@ AS_API(void) AsFbxMorphCopyBlendShapeControlPoints(AsFbxMorphContext* pMorphCont
|
|||||||
|
|
||||||
pMorphContext->lShape->InitControlPoints(vectorCount);
|
pMorphContext->lShape->InitControlPoints(vectorCount);
|
||||||
|
|
||||||
auto dstControlPoints = pMorphContext->lShape->GetControlPoints();
|
|
||||||
|
|
||||||
for (int j = 0; j < vectorCount; j++)
|
for (int j = 0; j < vectorCount; j++)
|
||||||
{
|
{
|
||||||
auto vertex = srcControlPoints[j];
|
pMorphContext->lShape->SetControlPointAt(FbxVector4(srcControlPoints[j]), j);;
|
||||||
dstControlPoints[j] = FbxVector4(vertex);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1142,7 +1139,25 @@ AS_API(void) AsFbxMorphSetBlendShapeVertex(AsFbxMorphContext* pMorphContext, uin
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pControlPoints = pMorphContext->lShape->GetControlPoints();
|
pMorphContext->lShape->SetControlPointAt(FbxVector4(x, y, z, 0), index);
|
||||||
|
}
|
||||||
pControlPoints[index] = FbxVector4(x, y, z, 0);
|
|
||||||
|
AS_API(void) AsFbxMorphCopyBlendShapeControlPointsNormal(AsFbxMorphContext* pMorphContext)
|
||||||
|
{
|
||||||
|
if (pMorphContext == nullptr || pMorphContext->pMesh == nullptr || pMorphContext->lShape == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pMorphContext->lShape->InitNormals(pMorphContext->pMesh);
|
||||||
|
}
|
||||||
|
|
||||||
|
AS_API(void) AsFbxMorphSetBlendShapeVertexNormal(AsFbxMorphContext* pMorphContext, uint32_t index, float x, float y, float z)
|
||||||
|
{
|
||||||
|
if (pMorphContext == nullptr || pMorphContext->lShape == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pMorphContext->lShape->SetControlPointNormalAt(FbxVector4(x, y, z, 0), index);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -150,8 +150,12 @@ AS_API(void) AsFbxMorphDisposeContext(AsFbxMorphContext** ppMorphContext);
|
|||||||
|
|
||||||
AS_API(void) AsFbxMorphAddBlendShapeChannel(AsFbxContext* pContext, AsFbxMorphContext* pMorphContext, const char* channelName);
|
AS_API(void) AsFbxMorphAddBlendShapeChannel(AsFbxContext* pContext, AsFbxMorphContext* pMorphContext, const char* channelName);
|
||||||
|
|
||||||
AS_API(void) AsFbxMorphAddBlendShapeChannelShape(AsFbxContext* pContext, AsFbxMorphContext* pMorphContext, float weight);
|
AS_API(void) AsFbxMorphAddBlendShapeChannelShape(AsFbxContext* pContext, AsFbxMorphContext* pMorphContext, float weight, const char* shapeName);
|
||||||
|
|
||||||
AS_API(void) AsFbxMorphCopyBlendShapeControlPoints(AsFbxMorphContext* pMorphContext);
|
AS_API(void) AsFbxMorphCopyBlendShapeControlPoints(AsFbxMorphContext* pMorphContext);
|
||||||
|
|
||||||
AS_API(void) AsFbxMorphSetBlendShapeVertex(AsFbxMorphContext* pMorphContext, uint32_t index, float x, float y, float z);
|
AS_API(void) AsFbxMorphSetBlendShapeVertex(AsFbxMorphContext* pMorphContext, uint32_t index, float x, float y, float z);
|
||||||
|
|
||||||
|
AS_API(void) AsFbxMorphCopyBlendShapeControlPointsNormal(AsFbxMorphContext* pMorphContext);
|
||||||
|
|
||||||
|
AS_API(void) AsFbxMorphSetBlendShapeVertexNormal(AsFbxMorphContext* pMorphContext, uint32_t index, float x, float y, float z);
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ AsFbxAnimContext::AsFbxAnimContext(bool32_t eulerFilter)
|
|||||||
lCurveTY = nullptr;
|
lCurveTY = nullptr;
|
||||||
lCurveTZ = nullptr;
|
lCurveTZ = nullptr;
|
||||||
|
|
||||||
lGeometry = nullptr;
|
pMesh = nullptr;
|
||||||
lBlendShape = nullptr;
|
lBlendShape = nullptr;
|
||||||
lAnimCurve = nullptr;
|
lAnimCurve = nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ struct AsFbxAnimContext
|
|||||||
FbxAnimCurve* lCurveTY;
|
FbxAnimCurve* lCurveTY;
|
||||||
FbxAnimCurve* lCurveTZ;
|
FbxAnimCurve* lCurveTZ;
|
||||||
|
|
||||||
FbxGeometry* lGeometry;
|
FbxMesh* pMesh;
|
||||||
FbxBlendShape* lBlendShape;
|
FbxBlendShape* lBlendShape;
|
||||||
FbxAnimCurve* lAnimCurve;
|
FbxAnimCurve* lAnimCurve;
|
||||||
|
|
||||||
|
|||||||
@@ -4,18 +4,6 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
|
||||||
namespace fbxsdk
|
|
||||||
{
|
|
||||||
class FbxManager;
|
|
||||||
class FbxScene;
|
|
||||||
class FbxExporter;
|
|
||||||
template<typename T, const int Alignment = 16>
|
|
||||||
class FbxArray;
|
|
||||||
class FbxFileTexture;
|
|
||||||
class FbxSurfacePhong;
|
|
||||||
class FbxPose;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct AsFbxContext
|
struct AsFbxContext
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -1,60 +1,17 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<TargetFrameworks>net472;netstandard2.0</TargetFrameworks>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<ProjectGuid>{BD76E63F-1517-47FA-8233-33E853A3ACEE}</ProjectGuid>
|
|
||||||
<OutputType>Library</OutputType>
|
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<RootNamespace>AssetStudio.FbxInterop</RootNamespace>
|
|
||||||
<AssemblyName>AssetStudioFBXWrapper</AssemblyName>
|
|
||||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<Deterministic>true</Deterministic>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
|
<Version>0.16.0.0</Version>
|
||||||
|
<AssemblyVersion>0.16.0.0</AssemblyVersion>
|
||||||
|
<FileVersion>0.16.0.0</FileVersion>
|
||||||
|
<Copyright>Copyright © Perfare 2018-2021; Copyright © hozuki 2020</Copyright>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="System" />
|
<ProjectReference Include="..\AssetStudio.PInvoke\AssetStudio.PInvoke.csproj" />
|
||||||
<Reference Include="System.Core" />
|
<ProjectReference Include="..\AssetStudio\AssetStudio.csproj" />
|
||||||
<Reference Include="Microsoft.CSharp" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="Fbx.PInvoke.cs" />
|
</Project>
|
||||||
<Compile Include="FbxDll.cs" />
|
|
||||||
<Compile Include="FbxExporterContext.cs" />
|
|
||||||
<Compile Include="FbxExporterContext.PInvoke.cs" />
|
|
||||||
<Compile Include="Fbx.cs" />
|
|
||||||
<Compile Include="FbxExporter.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\AssetStudio.PInvoke\AssetStudio.PInvoke.csproj">
|
|
||||||
<Project>{40c796b5-88ce-4adc-acd6-2f4862b7f136}</Project>
|
|
||||||
<Name>AssetStudio.PInvoke</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="..\AssetStudio\AssetStudio.csproj">
|
|
||||||
<Project>{7662f8c2-7bfd-442e-a948-a43b4f7eb06e}</Project>
|
|
||||||
<Name>AssetStudio</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
</Project>
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
|
|
||||||
public static void Export(string path, IImported imported, bool eulerFilter, float filterPrecision,
|
public static void Export(string path, IImported imported, bool eulerFilter, float filterPrecision,
|
||||||
bool allNodes, bool skins, bool animation, bool blendShape, bool castToBone, float boneSize, float scaleFactor, int versionIndex, bool isAscii)
|
bool allNodes, bool skins, bool animation, bool blendShape, bool castToBone, float boneSize, bool exportAllUvsAsDiffuseMaps, float scaleFactor, int versionIndex, bool isAscii)
|
||||||
{
|
{
|
||||||
var file = new FileInfo(path);
|
var file = new FileInfo(path);
|
||||||
var dir = file.Directory;
|
var dir = file.Directory;
|
||||||
@@ -43,7 +43,7 @@ namespace AssetStudio
|
|||||||
|
|
||||||
var name = Path.GetFileName(path);
|
var name = Path.GetFileName(path);
|
||||||
|
|
||||||
using (var exporter = new FbxExporter(name, imported, allNodes, skins, castToBone, boneSize, scaleFactor, versionIndex, isAscii))
|
using (var exporter = new FbxExporter(name, imported, allNodes, skins, castToBone, boneSize, exportAllUvsAsDiffuseMaps, scaleFactor, versionIndex, isAscii))
|
||||||
{
|
{
|
||||||
exporter.Initialize();
|
exporter.Initialize();
|
||||||
exporter.ExportAll(blendShape, animation, eulerFilter, filterPrecision);
|
exporter.ExportAll(blendShape, animation, eulerFilter, filterPrecision);
|
||||||
|
|||||||
@@ -15,11 +15,12 @@ namespace AssetStudio.FbxInterop
|
|||||||
private readonly bool _exportSkins;
|
private readonly bool _exportSkins;
|
||||||
private readonly bool _castToBone;
|
private readonly bool _castToBone;
|
||||||
private readonly float _boneSize;
|
private readonly float _boneSize;
|
||||||
|
private readonly bool _exportAllUvsAsDiffuseMaps;
|
||||||
private readonly float _scaleFactor;
|
private readonly float _scaleFactor;
|
||||||
private readonly int _versionIndex;
|
private readonly int _versionIndex;
|
||||||
private readonly bool _isAscii;
|
private readonly bool _isAscii;
|
||||||
|
|
||||||
internal FbxExporter(string fileName, IImported imported, bool allNodes, bool exportSkins, bool castToBone, float boneSize, float scaleFactor, int versionIndex, bool isAscii)
|
internal FbxExporter(string fileName, IImported imported, bool allNodes, bool exportSkins, bool castToBone, float boneSize, bool exportAllUvsAsDiffuseMaps, float scaleFactor, int versionIndex, bool isAscii)
|
||||||
{
|
{
|
||||||
_context = new FbxExporterContext();
|
_context = new FbxExporterContext();
|
||||||
|
|
||||||
@@ -29,6 +30,7 @@ namespace AssetStudio.FbxInterop
|
|||||||
_exportSkins = exportSkins;
|
_exportSkins = exportSkins;
|
||||||
_castToBone = castToBone;
|
_castToBone = castToBone;
|
||||||
_boneSize = boneSize;
|
_boneSize = boneSize;
|
||||||
|
_exportAllUvsAsDiffuseMaps = exportAllUvsAsDiffuseMaps;
|
||||||
_scaleFactor = scaleFactor;
|
_scaleFactor = scaleFactor;
|
||||||
_versionIndex = versionIndex;
|
_versionIndex = versionIndex;
|
||||||
_isAscii = isAscii;
|
_isAscii = isAscii;
|
||||||
@@ -171,7 +173,7 @@ namespace AssetStudio.FbxInterop
|
|||||||
{
|
{
|
||||||
foreach (var meshFrame in meshFrames)
|
foreach (var meshFrame in meshFrames)
|
||||||
{
|
{
|
||||||
_context.ExportMeshFromFrame(rootFrame, meshFrame, _imported.MeshList, _imported.MaterialList, _imported.TextureList, _exportSkins);
|
_context.ExportMeshFromFrame(rootFrame, meshFrame, _imported.MeshList, _imported.MaterialList, _imported.TextureList, _exportSkins, _exportAllUvsAsDiffuseMaps);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -298,8 +298,16 @@ namespace AssetStudio.FbxInterop
|
|||||||
[DllImport(FbxDll.DllName, CallingConvention = CallingConvention.Winapi)]
|
[DllImport(FbxDll.DllName, CallingConvention = CallingConvention.Winapi)]
|
||||||
private static extern void AsFbxMorphAddBlendShapeChannel(IntPtr pContext, IntPtr pMorphContext, IntPtr strChannelName);
|
private static extern void AsFbxMorphAddBlendShapeChannel(IntPtr pContext, IntPtr pMorphContext, IntPtr strChannelName);
|
||||||
|
|
||||||
|
private static void AsFbxMorphAddBlendShapeChannelShape(IntPtr pContext, IntPtr pMorphContext, float weight, string shapeName)
|
||||||
|
{
|
||||||
|
using (var shapeNameUtf8 = new Utf8StringHandle(shapeName))
|
||||||
|
{
|
||||||
|
AsFbxMorphAddBlendShapeChannelShape(pContext, pMorphContext, weight, shapeNameUtf8.DangerousGetHandle());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[DllImport(FbxDll.DllName, CallingConvention = CallingConvention.Winapi)]
|
[DllImport(FbxDll.DllName, CallingConvention = CallingConvention.Winapi)]
|
||||||
private static extern void AsFbxMorphAddBlendShapeChannelShape(IntPtr pContext, IntPtr pMorphContext, float weight);
|
private static extern void AsFbxMorphAddBlendShapeChannelShape(IntPtr pContext, IntPtr pMorphContext, float weight, IntPtr strShapeName);
|
||||||
|
|
||||||
[DllImport(FbxDll.DllName, CallingConvention = CallingConvention.Winapi)]
|
[DllImport(FbxDll.DllName, CallingConvention = CallingConvention.Winapi)]
|
||||||
private static extern void AsFbxMorphCopyBlendShapeControlPoints(IntPtr pMorphContext);
|
private static extern void AsFbxMorphCopyBlendShapeControlPoints(IntPtr pMorphContext);
|
||||||
@@ -307,5 +315,11 @@ namespace AssetStudio.FbxInterop
|
|||||||
[DllImport(FbxDll.DllName, CallingConvention = CallingConvention.Winapi)]
|
[DllImport(FbxDll.DllName, CallingConvention = CallingConvention.Winapi)]
|
||||||
private static extern void AsFbxMorphSetBlendShapeVertex(IntPtr pMorphContext, uint index, float x, float y, float z);
|
private static extern void AsFbxMorphSetBlendShapeVertex(IntPtr pMorphContext, uint index, float x, float y, float z);
|
||||||
|
|
||||||
|
[DllImport(FbxDll.DllName, CallingConvention = CallingConvention.Winapi)]
|
||||||
|
private static extern void AsFbxMorphCopyBlendShapeControlPointsNormal(IntPtr pMorphContext);
|
||||||
|
|
||||||
|
[DllImport(FbxDll.DllName, CallingConvention = CallingConvention.Winapi)]
|
||||||
|
private static extern void AsFbxMorphSetBlendShapeVertexNormal(IntPtr pMorphContext, uint index, float x, float y, float z);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -173,12 +173,12 @@ namespace AssetStudio.FbxInterop
|
|||||||
AsFbxPrepareMaterials(_pContext, materialCount, textureCount);
|
AsFbxPrepareMaterials(_pContext, materialCount, textureCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void ExportMeshFromFrame(ImportedFrame rootFrame, ImportedFrame meshFrame, List<ImportedMesh> meshList, List<ImportedMaterial> materialList, List<ImportedTexture> textureList, bool exportSkins)
|
internal void ExportMeshFromFrame(ImportedFrame rootFrame, ImportedFrame meshFrame, List<ImportedMesh> meshList, List<ImportedMaterial> materialList, List<ImportedTexture> textureList, bool exportSkins, bool exportAllUvsAsDiffuseMaps)
|
||||||
{
|
{
|
||||||
var meshNode = _frameToNode[meshFrame];
|
var meshNode = _frameToNode[meshFrame];
|
||||||
var mesh = ImportedHelpers.FindMesh(meshFrame.Path, meshList);
|
var mesh = ImportedHelpers.FindMesh(meshFrame.Path, meshList);
|
||||||
|
|
||||||
ExportMesh(rootFrame, materialList, textureList, meshNode, mesh, exportSkins);
|
ExportMesh(rootFrame, materialList, textureList, meshNode, mesh, exportSkins, exportAllUvsAsDiffuseMaps);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IntPtr ExportTexture(ImportedTexture texture)
|
private IntPtr ExportTexture(ImportedTexture texture)
|
||||||
@@ -207,7 +207,7 @@ namespace AssetStudio.FbxInterop
|
|||||||
return pTex;
|
return pTex;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ExportMesh(ImportedFrame rootFrame, List<ImportedMaterial> materialList, List<ImportedTexture> textureList, IntPtr frameNode, ImportedMesh importedMesh, bool exportSkins)
|
private void ExportMesh(ImportedFrame rootFrame, List<ImportedMaterial> materialList, List<ImportedTexture> textureList, IntPtr frameNode, ImportedMesh importedMesh, bool exportSkins, bool exportAllUvsAsDiffuseMaps)
|
||||||
{
|
{
|
||||||
var boneList = importedMesh.BoneList;
|
var boneList = importedMesh.BoneList;
|
||||||
var totalBoneCount = 0;
|
var totalBoneCount = 0;
|
||||||
@@ -246,28 +246,25 @@ namespace AssetStudio.FbxInterop
|
|||||||
|
|
||||||
var mesh = AsFbxMeshCreateMesh(_pContext, frameNode);
|
var mesh = AsFbxMeshCreateMesh(_pContext, frameNode);
|
||||||
|
|
||||||
var totalVertexCount = 0;
|
AsFbxMeshInitControlPoints(mesh, importedMesh.VertexList.Count);
|
||||||
|
|
||||||
foreach (var m in importedMesh.SubmeshList)
|
|
||||||
{
|
|
||||||
totalVertexCount += m.VertexList.Count;
|
|
||||||
}
|
|
||||||
|
|
||||||
AsFbxMeshInitControlPoints(mesh, totalVertexCount);
|
|
||||||
|
|
||||||
if (importedMesh.hasNormal)
|
if (importedMesh.hasNormal)
|
||||||
{
|
{
|
||||||
AsFbxMeshCreateElementNormal(mesh);
|
AsFbxMeshCreateElementNormal(mesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (importedMesh.hasUV[0])
|
for (int i = 0; i < importedMesh.hasUV.Length; i++)
|
||||||
{
|
{
|
||||||
AsFbxMeshCreateDiffuseUV(mesh, 0);
|
if (!importedMesh.hasUV[i]) { continue; }
|
||||||
}
|
|
||||||
|
|
||||||
if (importedMesh.hasUV[1])
|
if (i == 1 && !exportAllUvsAsDiffuseMaps)
|
||||||
{
|
{
|
||||||
AsFbxMeshCreateNormalMapUV(mesh, 1);
|
AsFbxMeshCreateNormalMapUV(mesh, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
AsFbxMeshCreateDiffuseUV(mesh, i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (importedMesh.hasTangent)
|
if (importedMesh.hasTangent)
|
||||||
@@ -282,8 +279,6 @@ namespace AssetStudio.FbxInterop
|
|||||||
|
|
||||||
AsFbxMeshCreateElementMaterial(mesh);
|
AsFbxMeshCreateElementMaterial(mesh);
|
||||||
|
|
||||||
var firstVertex = 0;
|
|
||||||
|
|
||||||
foreach (var meshObj in importedMesh.SubmeshList)
|
foreach (var meshObj in importedMesh.SubmeshList)
|
||||||
{
|
{
|
||||||
var materialIndex = 0;
|
var materialIndex = 0;
|
||||||
@@ -345,71 +340,70 @@ namespace AssetStudio.FbxInterop
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var vertexList = meshObj.VertexList;
|
|
||||||
|
|
||||||
var vertexCount = vertexList.Count;
|
|
||||||
|
|
||||||
for (var j = 0; j < vertexCount; j += 1)
|
|
||||||
{
|
|
||||||
var importedVertex = vertexList[j];
|
|
||||||
|
|
||||||
var vertex = importedVertex.Vertex;
|
|
||||||
AsFbxMeshSetControlPoint(mesh, j + firstVertex, vertex.X, vertex.Y, vertex.Z);
|
|
||||||
|
|
||||||
if (importedMesh.hasNormal)
|
|
||||||
{
|
|
||||||
var normal = importedVertex.Normal;
|
|
||||||
AsFbxMeshElementNormalAdd(mesh, 0, normal.X, normal.Y, normal.Z);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var uvIndex = 0; uvIndex < 2; uvIndex += 1)
|
|
||||||
{
|
|
||||||
if (importedMesh.hasUV[uvIndex])
|
|
||||||
{
|
|
||||||
var uv = importedVertex.UV[uvIndex];
|
|
||||||
AsFbxMeshElementUVAdd(mesh, uvIndex, uv[0], uv[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (importedMesh.hasTangent)
|
|
||||||
{
|
|
||||||
var tangent = importedVertex.Tangent;
|
|
||||||
AsFbxMeshElementTangentAdd(mesh, 0, tangent.X, tangent.Y, tangent.Z, tangent.W);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (importedMesh.hasColor)
|
|
||||||
{
|
|
||||||
var color = importedVertex.Color;
|
|
||||||
AsFbxMeshElementVertexColorAdd(mesh, 0, color.R, color.G, color.B, color.A);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasBones && importedVertex.BoneIndices != null)
|
|
||||||
{
|
|
||||||
var boneIndices = importedVertex.BoneIndices;
|
|
||||||
var boneWeights = importedVertex.Weights;
|
|
||||||
|
|
||||||
for (var k = 0; k < 4; k += 1)
|
|
||||||
{
|
|
||||||
if (boneIndices[k] < totalBoneCount && boneWeights[k] > 0)
|
|
||||||
{
|
|
||||||
AsFbxMeshSetBoneWeight(pClusterArray, boneIndices[k], j + firstVertex, boneWeights[k]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var face in meshObj.FaceList)
|
foreach (var face in meshObj.FaceList)
|
||||||
{
|
{
|
||||||
var index0 = face.VertexIndices[0] + firstVertex;
|
var index0 = face.VertexIndices[0] + meshObj.BaseVertex;
|
||||||
var index1 = face.VertexIndices[1] + firstVertex;
|
var index1 = face.VertexIndices[1] + meshObj.BaseVertex;
|
||||||
var index2 = face.VertexIndices[2] + firstVertex;
|
var index2 = face.VertexIndices[2] + meshObj.BaseVertex;
|
||||||
|
|
||||||
AsFbxMeshAddPolygon(mesh, materialIndex, index0, index1, index2);
|
AsFbxMeshAddPolygon(mesh, materialIndex, index0, index1, index2);
|
||||||
}
|
}
|
||||||
|
|
||||||
firstVertex += vertexCount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var vertexList = importedMesh.VertexList;
|
||||||
|
|
||||||
|
var vertexCount = vertexList.Count;
|
||||||
|
|
||||||
|
for (var j = 0; j < vertexCount; j += 1)
|
||||||
|
{
|
||||||
|
var importedVertex = vertexList[j];
|
||||||
|
|
||||||
|
var vertex = importedVertex.Vertex;
|
||||||
|
AsFbxMeshSetControlPoint(mesh, j, vertex.X, vertex.Y, vertex.Z);
|
||||||
|
|
||||||
|
if (importedMesh.hasNormal)
|
||||||
|
{
|
||||||
|
var normal = importedVertex.Normal;
|
||||||
|
AsFbxMeshElementNormalAdd(mesh, 0, normal.X, normal.Y, normal.Z);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var uvIndex = 0; uvIndex < importedMesh.hasUV.Length; uvIndex += 1)
|
||||||
|
{
|
||||||
|
if (importedMesh.hasUV[uvIndex])
|
||||||
|
{
|
||||||
|
var uv = importedVertex.UV[uvIndex];
|
||||||
|
AsFbxMeshElementUVAdd(mesh, uvIndex, uv[0], uv[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (importedMesh.hasTangent)
|
||||||
|
{
|
||||||
|
var tangent = importedVertex.Tangent;
|
||||||
|
AsFbxMeshElementTangentAdd(mesh, 0, tangent.X, tangent.Y, tangent.Z, tangent.W);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (importedMesh.hasColor)
|
||||||
|
{
|
||||||
|
var color = importedVertex.Color;
|
||||||
|
AsFbxMeshElementVertexColorAdd(mesh, 0, color.R, color.G, color.B, color.A);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasBones && importedVertex.BoneIndices != null)
|
||||||
|
{
|
||||||
|
var boneIndices = importedVertex.BoneIndices;
|
||||||
|
var boneWeights = importedVertex.Weights;
|
||||||
|
|
||||||
|
for (var k = 0; k < 4; k += 1)
|
||||||
|
{
|
||||||
|
if (boneIndices[k] < totalBoneCount && boneWeights[k] > 0)
|
||||||
|
{
|
||||||
|
AsFbxMeshSetBoneWeight(pClusterArray, boneIndices[k], j, boneWeights[k]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (hasBones)
|
if (hasBones)
|
||||||
{
|
{
|
||||||
IntPtr pSkinContext = IntPtr.Zero;
|
IntPtr pSkinContext = IntPtr.Zero;
|
||||||
@@ -611,9 +605,11 @@ namespace AssetStudio.FbxInterop
|
|||||||
{
|
{
|
||||||
AsFbxMorphAddBlendShapeChannel(_pContext, pMorphContext, channel.Name);
|
AsFbxMorphAddBlendShapeChannel(_pContext, pMorphContext, channel.Name);
|
||||||
|
|
||||||
foreach (var keyframe in channel.KeyframeList)
|
for (var i = 0; i < channel.KeyframeList.Count; i++)
|
||||||
{
|
{
|
||||||
AsFbxMorphAddBlendShapeChannelShape(_pContext, pMorphContext, keyframe.Weight);
|
var keyframe = channel.KeyframeList[i];
|
||||||
|
|
||||||
|
AsFbxMorphAddBlendShapeChannelShape(_pContext, pMorphContext, keyframe.Weight, i == 0 ? channel.Name : $"{channel.Name}_{i + 1}");
|
||||||
|
|
||||||
AsFbxMorphCopyBlendShapeControlPoints(pMorphContext);
|
AsFbxMorphCopyBlendShapeControlPoints(pMorphContext);
|
||||||
|
|
||||||
@@ -622,6 +618,17 @@ namespace AssetStudio.FbxInterop
|
|||||||
var v = vertex.Vertex.Vertex;
|
var v = vertex.Vertex.Vertex;
|
||||||
AsFbxMorphSetBlendShapeVertex(pMorphContext, vertex.Index, v.X, v.Y, v.Z);
|
AsFbxMorphSetBlendShapeVertex(pMorphContext, vertex.Index, v.X, v.Y, v.Z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (keyframe.hasNormals)
|
||||||
|
{
|
||||||
|
AsFbxMorphCopyBlendShapeControlPointsNormal(pMorphContext);
|
||||||
|
|
||||||
|
foreach (var vertex in keyframe.VertexList)
|
||||||
|
{
|
||||||
|
var v = vertex.Vertex.Normal;
|
||||||
|
AsFbxMorphSetBlendShapeVertexNormal(pMorphContext, vertex.Index, v.X, v.Y, v.Z);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -633,4 +640,4 @@ namespace AssetStudio.FbxInterop
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +0,0 @@
|
|||||||
using System.Reflection;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
[assembly: AssemblyTitle("AssetStudioFBXWrapper")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
|
||||||
[assembly: AssemblyProduct("AssetStudioFBXWrapper")]
|
|
||||||
[assembly: AssemblyCopyright("Copyright © Perfare 2018-2020; Copyright © hozuki 2020")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
|
|
||||||
[assembly: ComVisible(false)]
|
|
||||||
|
|
||||||
[assembly: Guid("bd76e63f-1517-47fa-8233-33e853a3acee")]
|
|
||||||
|
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
||||||
@@ -1,160 +1,66 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
<PropertyGroup>
|
||||||
<PropertyGroup>
|
<OutputType>WinExe</OutputType>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<TargetFramework>net472</TargetFramework>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
<UseWindowsForms>true</UseWindowsForms>
|
||||||
<ProjectGuid>{52B196FB-4C8A-499B-B877-1A0EB4F33EC0}</ProjectGuid>
|
<ApplicationIcon>Resources\as.ico</ApplicationIcon>
|
||||||
<OutputType>WinExe</OutputType>
|
<Version>0.16.0.0</Version>
|
||||||
<RootNamespace>AssetStudioGUI</RootNamespace>
|
<AssemblyVersion>0.16.0.0</AssemblyVersion>
|
||||||
<AssemblyName>AssetStudioGUI</AssemblyName>
|
<FileVersion>0.16.0.0</FileVersion>
|
||||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
<Copyright>Copyright © Perfare 2018-2021</Copyright>
|
||||||
<FileAlignment>512</FileAlignment>
|
</PropertyGroup>
|
||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
|
||||||
<Deterministic>true</Deterministic>
|
<ItemGroup>
|
||||||
</PropertyGroup>
|
<ProjectReference Include="..\AssetStudioUtility\AssetStudioUtility.csproj" />
|
||||||
<PropertyGroup>
|
<ProjectReference Include="..\AssetStudio\AssetStudio.csproj" />
|
||||||
<ApplicationIcon>Resources\as.ico</ApplicationIcon>
|
</ItemGroup>
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
|
<ItemGroup>
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<None Include="Properties\Settings.settings">
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
<Generator>SettingsSingleFileGenerator</Generator>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||||
<DebugType>full</DebugType>
|
</None>
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<Compile Update="Properties\Settings.Designer.cs">
|
||||||
<LangVersion>7.3</LangVersion>
|
<AutoGen>True</AutoGen>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<DependentUpon>Settings.settings</DependentUpon>
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
</Compile>
|
||||||
</PropertyGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
<ItemGroup>
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
<EmbeddedResource Update="Properties\Resources.resx">
|
||||||
<Optimize>true</Optimize>
|
<Generator>ResXFileCodeGenerator</Generator>
|
||||||
<DebugType>pdbonly</DebugType>
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
</EmbeddedResource>
|
||||||
<LangVersion>7.3</LangVersion>
|
<Compile Update="Properties\Resources.Designer.cs">
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<AutoGen>True</AutoGen>
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
<DesignTime>True</DesignTime>
|
||||||
</PropertyGroup>
|
</Compile>
|
||||||
<ItemGroup>
|
</ItemGroup>
|
||||||
<Reference Include="OpenTK, Version=3.1.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\packages\OpenTK.3.1.0\lib\net20\OpenTK.dll</HintPath>
|
<ItemGroup>
|
||||||
</Reference>
|
<ContentWithTargetPath Include="Libraries\x86\fmod.dll">
|
||||||
<Reference Include="OpenTK.GLControl, Version=3.1.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<HintPath>..\packages\OpenTK.GLControl.3.1.0\lib\net20\OpenTK.GLControl.dll</HintPath>
|
<TargetPath>x86\fmod.dll</TargetPath>
|
||||||
</Reference>
|
</ContentWithTargetPath>
|
||||||
<Reference Include="System" />
|
<ContentWithTargetPath Include="Libraries\x64\fmod.dll">
|
||||||
<Reference Include="System.Core" />
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
<Reference Include="System.Xml.Linq" />
|
<TargetPath>x64\fmod.dll</TargetPath>
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
</ContentWithTargetPath>
|
||||||
<Reference Include="Microsoft.CSharp" />
|
</ItemGroup>
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Deployment" />
|
<ItemGroup>
|
||||||
<Reference Include="System.Drawing" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||||
<Reference Include="System.Net.Http" />
|
<PackageReference Include="OpenTK" Version="3.1.0" />
|
||||||
<Reference Include="System.Windows.Forms" />
|
<PackageReference Include="OpenTK.GLControl" Version="3.1.0" />
|
||||||
<Reference Include="System.Xml" />
|
</ItemGroup>
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<Target Name="CustomAfterBuild" AfterTargets="AfterBuild">
|
||||||
<Compile Include="AssetStudioGUIForm.cs">
|
<Copy SourceFiles="$(SolutionDir)AssetStudioFBXNative\bin\Win32\$(Configuration)\AssetStudioFBXNative.dll" DestinationFolder="$(TargetDir)x86" ContinueOnError="true" />
|
||||||
<SubType>Form</SubType>
|
<Copy SourceFiles="$(SolutionDir)AssetStudioFBXNative\bin\x64\$(Configuration)\AssetStudioFBXNative.dll" DestinationFolder="$(TargetDir)x64" ContinueOnError="true" />
|
||||||
</Compile>
|
<Copy SourceFiles="$(SolutionDir)Texture2DDecoderNative\bin\Win32\$(Configuration)\Texture2DDecoderNative.dll" DestinationFolder="$(TargetDir)x86" ContinueOnError="true" />
|
||||||
<Compile Include="AssetStudioGUIForm.designer.cs">
|
<Copy SourceFiles="$(SolutionDir)Texture2DDecoderNative\bin\x64\$(Configuration)\Texture2DDecoderNative.dll" DestinationFolder="$(TargetDir)x64" ContinueOnError="true" />
|
||||||
<DependentUpon>AssetStudioGUIForm.cs</DependentUpon>
|
</Target>
|
||||||
</Compile>
|
|
||||||
<Compile Include="Components\AssetItem.cs" />
|
|
||||||
<Compile Include="Components\GameObjectTreeNode.cs" />
|
|
||||||
<Compile Include="Components\GOHierarchy.cs">
|
|
||||||
<SubType>Component</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Components\OpenFolderDialog.cs" />
|
|
||||||
<Compile Include="Components\TreeViewExtensions.cs" />
|
|
||||||
<Compile Include="Components\TypeTreeItem.cs" />
|
|
||||||
<Compile Include="Exporter.cs" />
|
|
||||||
<Compile Include="ExportOptions.cs">
|
|
||||||
<SubType>Form</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="ExportOptions.designer.cs">
|
|
||||||
<DependentUpon>ExportOptions.cs</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="GUILogger.cs" />
|
|
||||||
<Compile Include="GUIProgress.cs" />
|
|
||||||
<Compile Include="Program.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
<Compile Include="Studio.cs" />
|
|
||||||
<Compile Include="TGASharpLib.cs" />
|
|
||||||
<EmbeddedResource Include="AssetStudioGUIForm.resx">
|
|
||||||
<DependentUpon>AssetStudioGUIForm.cs</DependentUpon>
|
|
||||||
</EmbeddedResource>
|
|
||||||
<EmbeddedResource Include="ExportOptions.resx">
|
|
||||||
<DependentUpon>ExportOptions.cs</DependentUpon>
|
|
||||||
</EmbeddedResource>
|
|
||||||
<EmbeddedResource Include="Properties\Resources.resx">
|
|
||||||
<Generator>ResXFileCodeGenerator</Generator>
|
|
||||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</EmbeddedResource>
|
|
||||||
<Compile Include="Properties\Resources.Designer.cs">
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DependentUpon>Resources.resx</DependentUpon>
|
|
||||||
<DesignTime>True</DesignTime>
|
|
||||||
</Compile>
|
|
||||||
<None Include="OpenTK.dll.config" />
|
|
||||||
<None Include="packages.config" />
|
|
||||||
<None Include="Properties\Settings.settings">
|
|
||||||
<Generator>SettingsSingleFileGenerator</Generator>
|
|
||||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
|
||||||
</None>
|
|
||||||
<Compile Include="Properties\Settings.Designer.cs">
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DependentUpon>Settings.settings</DependentUpon>
|
|
||||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="App.config" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="Resources\preview.png" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="Resources\as.ico" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ContentWithTargetPath Include="Libraries\x86\fmod.dll">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
<TargetPath>x86\fmod.dll</TargetPath>
|
|
||||||
</ContentWithTargetPath>
|
|
||||||
<ContentWithTargetPath Include="Libraries\x86\libfbxsdk.dll">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
<TargetPath>x86\libfbxsdk.dll</TargetPath>
|
|
||||||
</ContentWithTargetPath>
|
|
||||||
<ContentWithTargetPath Include="Libraries\x64\fmod.dll">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
<TargetPath>x64\fmod.dll</TargetPath>
|
|
||||||
</ContentWithTargetPath>
|
|
||||||
<ContentWithTargetPath Include="Libraries\x64\libfbxsdk.dll">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
<TargetPath>x64\libfbxsdk.dll</TargetPath>
|
|
||||||
</ContentWithTargetPath>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\AssetStudioUtility\AssetStudioUtility.csproj">
|
|
||||||
<Project>{80aec261-21ee-4e4f-a93b-7a744dc84888}</Project>
|
|
||||||
<Name>AssetStudioUtility</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="..\AssetStudio\AssetStudio.csproj">
|
|
||||||
<Project>{7662f8c2-7bfd-442e-a948-a43b4f7eb06e}</Project>
|
|
||||||
<Name>AssetStudio</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
<Target Name="AfterBuild">
|
|
||||||
<Copy SourceFiles="$(SolutionDir)AssetStudioFBXNative\bin\Win32\$(Configuration)\AssetStudioFBXNative.dll" DestinationFolder="$(TargetDir)x86" ContinueOnError="true" />
|
|
||||||
<Copy SourceFiles="$(SolutionDir)AssetStudioFBXNative\bin\x64\$(Configuration)\AssetStudioFBXNative.dll" DestinationFolder="$(TargetDir)x64" ContinueOnError="true" />
|
|
||||||
<Copy SourceFiles="$(SolutionDir)Texture2DDecoderNative\bin\Win32\$(Configuration)\Texture2DDecoderNative.dll" DestinationFolder="$(TargetDir)x86" ContinueOnError="true" />
|
|
||||||
<Copy SourceFiles="$(SolutionDir)Texture2DDecoderNative\bin\x64\$(Configuration)\Texture2DDecoderNative.dll" DestinationFolder="$(TargetDir)x64" ContinueOnError="true" />
|
|
||||||
</Target>
|
|
||||||
</Project>
|
</Project>
|
||||||
+173
-55
@@ -41,6 +41,8 @@
|
|||||||
this.displayAll = new System.Windows.Forms.ToolStripMenuItem();
|
this.displayAll = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.enablePreview = new System.Windows.Forms.ToolStripMenuItem();
|
this.enablePreview = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.displayInfo = new System.Windows.Forms.ToolStripMenuItem();
|
this.displayInfo = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.toolStripMenuItem14 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.specifyUnityVersion = new System.Windows.Forms.ToolStripTextBox();
|
||||||
this.showExpOpt = new System.Windows.Forms.ToolStripMenuItem();
|
this.showExpOpt = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.modelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.modelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.exportAllObjectssplitToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
this.exportAllObjectssplitToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
@@ -64,9 +66,15 @@
|
|||||||
this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem();
|
this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem();
|
this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripMenuItem();
|
this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
|
||||||
|
this.toolStripMenuItem10 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.toolStripMenuItem11 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.toolStripMenuItem12 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.filterTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.filterTypeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.allToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.allToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.debugMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.debugMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
|
this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.exportClassStructuresMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.exportClassStructuresMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
|
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
|
||||||
this.tabControl1 = new System.Windows.Forms.TabControl();
|
this.tabControl1 = new System.Windows.Forms.TabControl();
|
||||||
@@ -87,6 +95,8 @@
|
|||||||
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||||
this.progressbarPanel = new System.Windows.Forms.Panel();
|
this.progressbarPanel = new System.Windows.Forms.Panel();
|
||||||
this.progressBar1 = new System.Windows.Forms.ProgressBar();
|
this.progressBar1 = new System.Windows.Forms.ProgressBar();
|
||||||
|
this.tabControl2 = new System.Windows.Forms.TabControl();
|
||||||
|
this.tabPage4 = new System.Windows.Forms.TabPage();
|
||||||
this.previewPanel = new System.Windows.Forms.Panel();
|
this.previewPanel = new System.Windows.Forms.Panel();
|
||||||
this.assetInfoLabel = new System.Windows.Forms.Label();
|
this.assetInfoLabel = new System.Windows.Forms.Label();
|
||||||
this.FMODpanel = new System.Windows.Forms.Panel();
|
this.FMODpanel = new System.Windows.Forms.Panel();
|
||||||
@@ -101,15 +111,15 @@
|
|||||||
this.FMODpauseButton = new System.Windows.Forms.Button();
|
this.FMODpauseButton = new System.Windows.Forms.Button();
|
||||||
this.FMODplayButton = new System.Windows.Forms.Button();
|
this.FMODplayButton = new System.Windows.Forms.Button();
|
||||||
this.fontPreviewBox = new System.Windows.Forms.RichTextBox();
|
this.fontPreviewBox = new System.Windows.Forms.RichTextBox();
|
||||||
this.textPreviewBox = new System.Windows.Forms.TextBox();
|
|
||||||
this.glControl1 = new OpenTK.GLControl();
|
this.glControl1 = new OpenTK.GLControl();
|
||||||
this.classPreviewPanel = new System.Windows.Forms.Panel();
|
this.textPreviewBox = new System.Windows.Forms.TextBox();
|
||||||
this.classTextBox = new System.Windows.Forms.TextBox();
|
this.classTextBox = new System.Windows.Forms.TextBox();
|
||||||
|
this.tabPage5 = new System.Windows.Forms.TabPage();
|
||||||
|
this.dumpTextBox = new System.Windows.Forms.TextBox();
|
||||||
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
|
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
|
||||||
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
|
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
|
||||||
this.timer = new System.Windows.Forms.Timer(this.components);
|
this.timer = new System.Windows.Forms.Timer(this.components);
|
||||||
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
|
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
|
||||||
this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
|
|
||||||
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
|
this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||||
this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.exportSelectedAssetsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
this.exportSelectedAssetsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
@@ -126,11 +136,13 @@
|
|||||||
this.tabPage2.SuspendLayout();
|
this.tabPage2.SuspendLayout();
|
||||||
this.tabPage3.SuspendLayout();
|
this.tabPage3.SuspendLayout();
|
||||||
this.progressbarPanel.SuspendLayout();
|
this.progressbarPanel.SuspendLayout();
|
||||||
|
this.tabControl2.SuspendLayout();
|
||||||
|
this.tabPage4.SuspendLayout();
|
||||||
this.previewPanel.SuspendLayout();
|
this.previewPanel.SuspendLayout();
|
||||||
this.FMODpanel.SuspendLayout();
|
this.FMODpanel.SuspendLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.FMODprogressBar)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.FMODprogressBar)).BeginInit();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.FMODvolumeBar)).BeginInit();
|
((System.ComponentModel.ISupportInitialize)(this.FMODvolumeBar)).BeginInit();
|
||||||
this.classPreviewPanel.SuspendLayout();
|
this.tabPage5.SuspendLayout();
|
||||||
this.statusStrip1.SuspendLayout();
|
this.statusStrip1.SuspendLayout();
|
||||||
this.contextMenuStrip1.SuspendLayout();
|
this.contextMenuStrip1.SuspendLayout();
|
||||||
this.SuspendLayout();
|
this.SuspendLayout();
|
||||||
@@ -201,6 +213,7 @@
|
|||||||
this.displayAll,
|
this.displayAll,
|
||||||
this.enablePreview,
|
this.enablePreview,
|
||||||
this.displayInfo,
|
this.displayInfo,
|
||||||
|
this.toolStripMenuItem14,
|
||||||
this.showExpOpt});
|
this.showExpOpt});
|
||||||
this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem";
|
this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem";
|
||||||
this.optionsToolStripMenuItem.Size = new System.Drawing.Size(66, 21);
|
this.optionsToolStripMenuItem.Size = new System.Drawing.Size(66, 21);
|
||||||
@@ -240,6 +253,20 @@
|
|||||||
"t, audio bitrate, etc.";
|
"t, audio bitrate, etc.";
|
||||||
this.displayInfo.CheckedChanged += new System.EventHandler(this.displayAssetInfo_Check);
|
this.displayInfo.CheckedChanged += new System.EventHandler(this.displayAssetInfo_Check);
|
||||||
//
|
//
|
||||||
|
// toolStripMenuItem14
|
||||||
|
//
|
||||||
|
this.toolStripMenuItem14.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.specifyUnityVersion});
|
||||||
|
this.toolStripMenuItem14.Name = "toolStripMenuItem14";
|
||||||
|
this.toolStripMenuItem14.Size = new System.Drawing.Size(223, 22);
|
||||||
|
this.toolStripMenuItem14.Text = "Specify Unity version";
|
||||||
|
//
|
||||||
|
// specifyUnityVersion
|
||||||
|
//
|
||||||
|
this.specifyUnityVersion.Font = new System.Drawing.Font("Microsoft YaHei UI", 9F);
|
||||||
|
this.specifyUnityVersion.Name = "specifyUnityVersion";
|
||||||
|
this.specifyUnityVersion.Size = new System.Drawing.Size(100, 23);
|
||||||
|
//
|
||||||
// showExpOpt
|
// showExpOpt
|
||||||
//
|
//
|
||||||
this.showExpOpt.Name = "showExpOpt";
|
this.showExpOpt.Name = "showExpOpt";
|
||||||
@@ -310,7 +337,9 @@
|
|||||||
this.exportAnimatorWithSelectedAnimationClipToolStripMenuItem,
|
this.exportAnimatorWithSelectedAnimationClipToolStripMenuItem,
|
||||||
this.toolStripSeparator4,
|
this.toolStripSeparator4,
|
||||||
this.toolStripMenuItem2,
|
this.toolStripMenuItem2,
|
||||||
this.toolStripMenuItem3});
|
this.toolStripMenuItem3,
|
||||||
|
this.toolStripSeparator2,
|
||||||
|
this.toolStripMenuItem10});
|
||||||
this.exportToolStripMenuItem.Name = "exportToolStripMenuItem";
|
this.exportToolStripMenuItem.Name = "exportToolStripMenuItem";
|
||||||
this.exportToolStripMenuItem.Size = new System.Drawing.Size(58, 21);
|
this.exportToolStripMenuItem.Size = new System.Drawing.Size(58, 21);
|
||||||
this.exportToolStripMenuItem.Text = "Export";
|
this.exportToolStripMenuItem.Text = "Export";
|
||||||
@@ -415,6 +444,42 @@
|
|||||||
this.toolStripMenuItem9.Text = "Filtered assets";
|
this.toolStripMenuItem9.Text = "Filtered assets";
|
||||||
this.toolStripMenuItem9.Click += new System.EventHandler(this.toolStripMenuItem9_Click);
|
this.toolStripMenuItem9.Click += new System.EventHandler(this.toolStripMenuItem9_Click);
|
||||||
//
|
//
|
||||||
|
// toolStripSeparator2
|
||||||
|
//
|
||||||
|
this.toolStripSeparator2.Name = "toolStripSeparator2";
|
||||||
|
this.toolStripSeparator2.Size = new System.Drawing.Size(281, 6);
|
||||||
|
//
|
||||||
|
// toolStripMenuItem10
|
||||||
|
//
|
||||||
|
this.toolStripMenuItem10.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.toolStripMenuItem11,
|
||||||
|
this.toolStripMenuItem12,
|
||||||
|
this.toolStripMenuItem13});
|
||||||
|
this.toolStripMenuItem10.Name = "toolStripMenuItem10";
|
||||||
|
this.toolStripMenuItem10.Size = new System.Drawing.Size(284, 22);
|
||||||
|
this.toolStripMenuItem10.Text = "Asset list to XML";
|
||||||
|
//
|
||||||
|
// toolStripMenuItem11
|
||||||
|
//
|
||||||
|
this.toolStripMenuItem11.Name = "toolStripMenuItem11";
|
||||||
|
this.toolStripMenuItem11.Size = new System.Drawing.Size(165, 22);
|
||||||
|
this.toolStripMenuItem11.Text = "All assets";
|
||||||
|
this.toolStripMenuItem11.Click += new System.EventHandler(this.toolStripMenuItem11_Click);
|
||||||
|
//
|
||||||
|
// toolStripMenuItem12
|
||||||
|
//
|
||||||
|
this.toolStripMenuItem12.Name = "toolStripMenuItem12";
|
||||||
|
this.toolStripMenuItem12.Size = new System.Drawing.Size(165, 22);
|
||||||
|
this.toolStripMenuItem12.Text = "Selected assets";
|
||||||
|
this.toolStripMenuItem12.Click += new System.EventHandler(this.toolStripMenuItem12_Click);
|
||||||
|
//
|
||||||
|
// toolStripMenuItem13
|
||||||
|
//
|
||||||
|
this.toolStripMenuItem13.Name = "toolStripMenuItem13";
|
||||||
|
this.toolStripMenuItem13.Size = new System.Drawing.Size(165, 22);
|
||||||
|
this.toolStripMenuItem13.Text = "Filtered assets";
|
||||||
|
this.toolStripMenuItem13.Click += new System.EventHandler(this.toolStripMenuItem13_Click);
|
||||||
|
//
|
||||||
// filterTypeToolStripMenuItem
|
// filterTypeToolStripMenuItem
|
||||||
//
|
//
|
||||||
this.filterTypeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
this.filterTypeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
@@ -436,11 +501,22 @@
|
|||||||
// debugMenuItem
|
// debugMenuItem
|
||||||
//
|
//
|
||||||
this.debugMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
this.debugMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
|
this.toolStripMenuItem15,
|
||||||
this.exportClassStructuresMenuItem});
|
this.exportClassStructuresMenuItem});
|
||||||
this.debugMenuItem.Name = "debugMenuItem";
|
this.debugMenuItem.Name = "debugMenuItem";
|
||||||
this.debugMenuItem.Size = new System.Drawing.Size(59, 21);
|
this.debugMenuItem.Size = new System.Drawing.Size(59, 21);
|
||||||
this.debugMenuItem.Text = "Debug";
|
this.debugMenuItem.Text = "Debug";
|
||||||
//
|
//
|
||||||
|
// toolStripMenuItem15
|
||||||
|
//
|
||||||
|
this.toolStripMenuItem15.Checked = true;
|
||||||
|
this.toolStripMenuItem15.CheckOnClick = true;
|
||||||
|
this.toolStripMenuItem15.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||||
|
this.toolStripMenuItem15.Name = "toolStripMenuItem15";
|
||||||
|
this.toolStripMenuItem15.Size = new System.Drawing.Size(207, 22);
|
||||||
|
this.toolStripMenuItem15.Text = "Show error message";
|
||||||
|
this.toolStripMenuItem15.Click += new System.EventHandler(this.toolStripMenuItem15_Click);
|
||||||
|
//
|
||||||
// exportClassStructuresMenuItem
|
// exportClassStructuresMenuItem
|
||||||
//
|
//
|
||||||
this.exportClassStructuresMenuItem.Name = "exportClassStructuresMenuItem";
|
this.exportClassStructuresMenuItem.Name = "exportClassStructuresMenuItem";
|
||||||
@@ -463,8 +539,7 @@
|
|||||||
//
|
//
|
||||||
// splitContainer1.Panel2
|
// splitContainer1.Panel2
|
||||||
//
|
//
|
||||||
this.splitContainer1.Panel2.Controls.Add(this.previewPanel);
|
this.splitContainer1.Panel2.Controls.Add(this.tabControl2);
|
||||||
this.splitContainer1.Panel2.Controls.Add(this.classPreviewPanel);
|
|
||||||
this.splitContainer1.Panel2.Controls.Add(this.statusStrip1);
|
this.splitContainer1.Panel2.Controls.Add(this.statusStrip1);
|
||||||
this.splitContainer1.Panel2MinSize = 400;
|
this.splitContainer1.Panel2MinSize = 400;
|
||||||
this.splitContainer1.Size = new System.Drawing.Size(1264, 656);
|
this.splitContainer1.Size = new System.Drawing.Size(1264, 656);
|
||||||
@@ -653,6 +728,28 @@
|
|||||||
this.progressBar1.Step = 1;
|
this.progressBar1.Step = 1;
|
||||||
this.progressBar1.TabIndex = 1;
|
this.progressBar1.TabIndex = 1;
|
||||||
//
|
//
|
||||||
|
// tabControl2
|
||||||
|
//
|
||||||
|
this.tabControl2.Controls.Add(this.tabPage4);
|
||||||
|
this.tabControl2.Controls.Add(this.tabPage5);
|
||||||
|
this.tabControl2.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.tabControl2.Location = new System.Drawing.Point(0, 0);
|
||||||
|
this.tabControl2.Name = "tabControl2";
|
||||||
|
this.tabControl2.SelectedIndex = 0;
|
||||||
|
this.tabControl2.Size = new System.Drawing.Size(776, 632);
|
||||||
|
this.tabControl2.TabIndex = 4;
|
||||||
|
this.tabControl2.SelectedIndexChanged += new System.EventHandler(this.tabControl2_SelectedIndexChanged);
|
||||||
|
//
|
||||||
|
// tabPage4
|
||||||
|
//
|
||||||
|
this.tabPage4.Controls.Add(this.previewPanel);
|
||||||
|
this.tabPage4.Location = new System.Drawing.Point(4, 22);
|
||||||
|
this.tabPage4.Name = "tabPage4";
|
||||||
|
this.tabPage4.Size = new System.Drawing.Size(768, 606);
|
||||||
|
this.tabPage4.TabIndex = 0;
|
||||||
|
this.tabPage4.Text = "Preview";
|
||||||
|
this.tabPage4.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
// previewPanel
|
// previewPanel
|
||||||
//
|
//
|
||||||
this.previewPanel.BackColor = System.Drawing.SystemColors.ControlDark;
|
this.previewPanel.BackColor = System.Drawing.SystemColors.ControlDark;
|
||||||
@@ -661,12 +758,13 @@
|
|||||||
this.previewPanel.Controls.Add(this.assetInfoLabel);
|
this.previewPanel.Controls.Add(this.assetInfoLabel);
|
||||||
this.previewPanel.Controls.Add(this.FMODpanel);
|
this.previewPanel.Controls.Add(this.FMODpanel);
|
||||||
this.previewPanel.Controls.Add(this.fontPreviewBox);
|
this.previewPanel.Controls.Add(this.fontPreviewBox);
|
||||||
this.previewPanel.Controls.Add(this.textPreviewBox);
|
|
||||||
this.previewPanel.Controls.Add(this.glControl1);
|
this.previewPanel.Controls.Add(this.glControl1);
|
||||||
|
this.previewPanel.Controls.Add(this.textPreviewBox);
|
||||||
|
this.previewPanel.Controls.Add(this.classTextBox);
|
||||||
this.previewPanel.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.previewPanel.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.previewPanel.Location = new System.Drawing.Point(0, 0);
|
this.previewPanel.Location = new System.Drawing.Point(0, 0);
|
||||||
this.previewPanel.Name = "previewPanel";
|
this.previewPanel.Name = "previewPanel";
|
||||||
this.previewPanel.Size = new System.Drawing.Size(776, 632);
|
this.previewPanel.Size = new System.Drawing.Size(768, 606);
|
||||||
this.previewPanel.TabIndex = 1;
|
this.previewPanel.TabIndex = 1;
|
||||||
this.previewPanel.Resize += new System.EventHandler(this.preview_Resize);
|
this.previewPanel.Resize += new System.EventHandler(this.preview_Resize);
|
||||||
//
|
//
|
||||||
@@ -696,7 +794,7 @@
|
|||||||
this.FMODpanel.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.FMODpanel.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.FMODpanel.Location = new System.Drawing.Point(0, 0);
|
this.FMODpanel.Location = new System.Drawing.Point(0, 0);
|
||||||
this.FMODpanel.Name = "FMODpanel";
|
this.FMODpanel.Name = "FMODpanel";
|
||||||
this.FMODpanel.Size = new System.Drawing.Size(776, 632);
|
this.FMODpanel.Size = new System.Drawing.Size(768, 606);
|
||||||
this.FMODpanel.TabIndex = 2;
|
this.FMODpanel.TabIndex = 2;
|
||||||
this.FMODpanel.Visible = false;
|
this.FMODpanel.Visible = false;
|
||||||
//
|
//
|
||||||
@@ -704,7 +802,7 @@
|
|||||||
//
|
//
|
||||||
this.FMODcopyright.AutoSize = true;
|
this.FMODcopyright.AutoSize = true;
|
||||||
this.FMODcopyright.ForeColor = System.Drawing.SystemColors.ControlLight;
|
this.FMODcopyright.ForeColor = System.Drawing.SystemColors.ControlLight;
|
||||||
this.FMODcopyright.Location = new System.Drawing.Point(232, 350);
|
this.FMODcopyright.Location = new System.Drawing.Point(214, 337);
|
||||||
this.FMODcopyright.Name = "FMODcopyright";
|
this.FMODcopyright.Name = "FMODcopyright";
|
||||||
this.FMODcopyright.Size = new System.Drawing.Size(341, 12);
|
this.FMODcopyright.Size = new System.Drawing.Size(341, 12);
|
||||||
this.FMODcopyright.TabIndex = 9;
|
this.FMODcopyright.TabIndex = 9;
|
||||||
@@ -714,7 +812,7 @@
|
|||||||
//
|
//
|
||||||
this.FMODinfoLabel.AutoSize = true;
|
this.FMODinfoLabel.AutoSize = true;
|
||||||
this.FMODinfoLabel.ForeColor = System.Drawing.SystemColors.ControlLightLight;
|
this.FMODinfoLabel.ForeColor = System.Drawing.SystemColors.ControlLightLight;
|
||||||
this.FMODinfoLabel.Location = new System.Drawing.Point(287, 248);
|
this.FMODinfoLabel.Location = new System.Drawing.Point(269, 235);
|
||||||
this.FMODinfoLabel.Name = "FMODinfoLabel";
|
this.FMODinfoLabel.Name = "FMODinfoLabel";
|
||||||
this.FMODinfoLabel.Size = new System.Drawing.Size(0, 12);
|
this.FMODinfoLabel.Size = new System.Drawing.Size(0, 12);
|
||||||
this.FMODinfoLabel.TabIndex = 8;
|
this.FMODinfoLabel.TabIndex = 8;
|
||||||
@@ -722,7 +820,7 @@
|
|||||||
// FMODtimerLabel
|
// FMODtimerLabel
|
||||||
//
|
//
|
||||||
this.FMODtimerLabel.ForeColor = System.Drawing.SystemColors.ControlLightLight;
|
this.FMODtimerLabel.ForeColor = System.Drawing.SystemColors.ControlLightLight;
|
||||||
this.FMODtimerLabel.Location = new System.Drawing.Point(422, 248);
|
this.FMODtimerLabel.Location = new System.Drawing.Point(404, 235);
|
||||||
this.FMODtimerLabel.Name = "FMODtimerLabel";
|
this.FMODtimerLabel.Name = "FMODtimerLabel";
|
||||||
this.FMODtimerLabel.Size = new System.Drawing.Size(155, 12);
|
this.FMODtimerLabel.Size = new System.Drawing.Size(155, 12);
|
||||||
this.FMODtimerLabel.TabIndex = 7;
|
this.FMODtimerLabel.TabIndex = 7;
|
||||||
@@ -732,7 +830,7 @@
|
|||||||
// FMODstatusLabel
|
// FMODstatusLabel
|
||||||
//
|
//
|
||||||
this.FMODstatusLabel.ForeColor = System.Drawing.SystemColors.ControlLightLight;
|
this.FMODstatusLabel.ForeColor = System.Drawing.SystemColors.ControlLightLight;
|
||||||
this.FMODstatusLabel.Location = new System.Drawing.Point(231, 248);
|
this.FMODstatusLabel.Location = new System.Drawing.Point(213, 235);
|
||||||
this.FMODstatusLabel.Name = "FMODstatusLabel";
|
this.FMODstatusLabel.Name = "FMODstatusLabel";
|
||||||
this.FMODstatusLabel.Size = new System.Drawing.Size(50, 12);
|
this.FMODstatusLabel.Size = new System.Drawing.Size(50, 12);
|
||||||
this.FMODstatusLabel.TabIndex = 6;
|
this.FMODstatusLabel.TabIndex = 6;
|
||||||
@@ -741,7 +839,7 @@
|
|||||||
// FMODprogressBar
|
// FMODprogressBar
|
||||||
//
|
//
|
||||||
this.FMODprogressBar.AutoSize = false;
|
this.FMODprogressBar.AutoSize = false;
|
||||||
this.FMODprogressBar.Location = new System.Drawing.Point(231, 266);
|
this.FMODprogressBar.Location = new System.Drawing.Point(213, 253);
|
||||||
this.FMODprogressBar.Maximum = 1000;
|
this.FMODprogressBar.Maximum = 1000;
|
||||||
this.FMODprogressBar.Name = "FMODprogressBar";
|
this.FMODprogressBar.Name = "FMODprogressBar";
|
||||||
this.FMODprogressBar.Size = new System.Drawing.Size(350, 22);
|
this.FMODprogressBar.Size = new System.Drawing.Size(350, 22);
|
||||||
@@ -754,7 +852,7 @@
|
|||||||
// FMODvolumeBar
|
// FMODvolumeBar
|
||||||
//
|
//
|
||||||
this.FMODvolumeBar.LargeChange = 2;
|
this.FMODvolumeBar.LargeChange = 2;
|
||||||
this.FMODvolumeBar.Location = new System.Drawing.Point(478, 293);
|
this.FMODvolumeBar.Location = new System.Drawing.Point(460, 280);
|
||||||
this.FMODvolumeBar.Name = "FMODvolumeBar";
|
this.FMODvolumeBar.Name = "FMODvolumeBar";
|
||||||
this.FMODvolumeBar.Size = new System.Drawing.Size(104, 45);
|
this.FMODvolumeBar.Size = new System.Drawing.Size(104, 45);
|
||||||
this.FMODvolumeBar.TabIndex = 4;
|
this.FMODvolumeBar.TabIndex = 4;
|
||||||
@@ -765,7 +863,7 @@
|
|||||||
// FMODloopButton
|
// FMODloopButton
|
||||||
//
|
//
|
||||||
this.FMODloopButton.Appearance = System.Windows.Forms.Appearance.Button;
|
this.FMODloopButton.Appearance = System.Windows.Forms.Appearance.Button;
|
||||||
this.FMODloopButton.Location = new System.Drawing.Point(417, 293);
|
this.FMODloopButton.Location = new System.Drawing.Point(399, 280);
|
||||||
this.FMODloopButton.Name = "FMODloopButton";
|
this.FMODloopButton.Name = "FMODloopButton";
|
||||||
this.FMODloopButton.Size = new System.Drawing.Size(55, 42);
|
this.FMODloopButton.Size = new System.Drawing.Size(55, 42);
|
||||||
this.FMODloopButton.TabIndex = 3;
|
this.FMODloopButton.TabIndex = 3;
|
||||||
@@ -776,7 +874,7 @@
|
|||||||
//
|
//
|
||||||
// FMODstopButton
|
// FMODstopButton
|
||||||
//
|
//
|
||||||
this.FMODstopButton.Location = new System.Drawing.Point(356, 293);
|
this.FMODstopButton.Location = new System.Drawing.Point(338, 280);
|
||||||
this.FMODstopButton.Name = "FMODstopButton";
|
this.FMODstopButton.Name = "FMODstopButton";
|
||||||
this.FMODstopButton.Size = new System.Drawing.Size(55, 42);
|
this.FMODstopButton.Size = new System.Drawing.Size(55, 42);
|
||||||
this.FMODstopButton.TabIndex = 2;
|
this.FMODstopButton.TabIndex = 2;
|
||||||
@@ -786,7 +884,7 @@
|
|||||||
//
|
//
|
||||||
// FMODpauseButton
|
// FMODpauseButton
|
||||||
//
|
//
|
||||||
this.FMODpauseButton.Location = new System.Drawing.Point(295, 293);
|
this.FMODpauseButton.Location = new System.Drawing.Point(277, 280);
|
||||||
this.FMODpauseButton.Name = "FMODpauseButton";
|
this.FMODpauseButton.Name = "FMODpauseButton";
|
||||||
this.FMODpauseButton.Size = new System.Drawing.Size(55, 42);
|
this.FMODpauseButton.Size = new System.Drawing.Size(55, 42);
|
||||||
this.FMODpauseButton.TabIndex = 1;
|
this.FMODpauseButton.TabIndex = 1;
|
||||||
@@ -796,7 +894,7 @@
|
|||||||
//
|
//
|
||||||
// FMODplayButton
|
// FMODplayButton
|
||||||
//
|
//
|
||||||
this.FMODplayButton.Location = new System.Drawing.Point(234, 293);
|
this.FMODplayButton.Location = new System.Drawing.Point(216, 280);
|
||||||
this.FMODplayButton.Name = "FMODplayButton";
|
this.FMODplayButton.Name = "FMODplayButton";
|
||||||
this.FMODplayButton.Size = new System.Drawing.Size(55, 42);
|
this.FMODplayButton.Size = new System.Drawing.Size(55, 42);
|
||||||
this.FMODplayButton.TabIndex = 0;
|
this.FMODplayButton.TabIndex = 0;
|
||||||
@@ -811,33 +909,19 @@
|
|||||||
this.fontPreviewBox.Location = new System.Drawing.Point(0, 0);
|
this.fontPreviewBox.Location = new System.Drawing.Point(0, 0);
|
||||||
this.fontPreviewBox.Name = "fontPreviewBox";
|
this.fontPreviewBox.Name = "fontPreviewBox";
|
||||||
this.fontPreviewBox.ReadOnly = true;
|
this.fontPreviewBox.ReadOnly = true;
|
||||||
this.fontPreviewBox.Size = new System.Drawing.Size(776, 632);
|
this.fontPreviewBox.Size = new System.Drawing.Size(768, 606);
|
||||||
this.fontPreviewBox.TabIndex = 0;
|
this.fontPreviewBox.TabIndex = 0;
|
||||||
this.fontPreviewBox.Text = resources.GetString("fontPreviewBox.Text");
|
this.fontPreviewBox.Text = resources.GetString("fontPreviewBox.Text");
|
||||||
this.fontPreviewBox.Visible = false;
|
this.fontPreviewBox.Visible = false;
|
||||||
this.fontPreviewBox.WordWrap = false;
|
this.fontPreviewBox.WordWrap = false;
|
||||||
//
|
//
|
||||||
// textPreviewBox
|
|
||||||
//
|
|
||||||
this.textPreviewBox.Dock = System.Windows.Forms.DockStyle.Fill;
|
|
||||||
this.textPreviewBox.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
|
||||||
this.textPreviewBox.Location = new System.Drawing.Point(0, 0);
|
|
||||||
this.textPreviewBox.Multiline = true;
|
|
||||||
this.textPreviewBox.Name = "textPreviewBox";
|
|
||||||
this.textPreviewBox.ReadOnly = true;
|
|
||||||
this.textPreviewBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
|
||||||
this.textPreviewBox.Size = new System.Drawing.Size(776, 632);
|
|
||||||
this.textPreviewBox.TabIndex = 2;
|
|
||||||
this.textPreviewBox.Visible = false;
|
|
||||||
this.textPreviewBox.WordWrap = false;
|
|
||||||
//
|
|
||||||
// glControl1
|
// glControl1
|
||||||
//
|
//
|
||||||
this.glControl1.BackColor = System.Drawing.SystemColors.ControlDarkDark;
|
this.glControl1.BackColor = System.Drawing.SystemColors.ControlDarkDark;
|
||||||
this.glControl1.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.glControl1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.glControl1.Location = new System.Drawing.Point(0, 0);
|
this.glControl1.Location = new System.Drawing.Point(0, 0);
|
||||||
this.glControl1.Name = "glControl1";
|
this.glControl1.Name = "glControl1";
|
||||||
this.glControl1.Size = new System.Drawing.Size(776, 632);
|
this.glControl1.Size = new System.Drawing.Size(768, 606);
|
||||||
this.glControl1.TabIndex = 4;
|
this.glControl1.TabIndex = 4;
|
||||||
this.glControl1.Visible = false;
|
this.glControl1.Visible = false;
|
||||||
this.glControl1.VSync = false;
|
this.glControl1.VSync = false;
|
||||||
@@ -848,15 +932,19 @@
|
|||||||
this.glControl1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.glControl1_MouseUp);
|
this.glControl1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.glControl1_MouseUp);
|
||||||
this.glControl1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.glControl1_MouseWheel);
|
this.glControl1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.glControl1_MouseWheel);
|
||||||
//
|
//
|
||||||
// classPreviewPanel
|
// textPreviewBox
|
||||||
//
|
//
|
||||||
this.classPreviewPanel.Controls.Add(this.classTextBox);
|
this.textPreviewBox.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
this.classPreviewPanel.Dock = System.Windows.Forms.DockStyle.Fill;
|
this.textPreviewBox.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||||
this.classPreviewPanel.Location = new System.Drawing.Point(0, 0);
|
this.textPreviewBox.Location = new System.Drawing.Point(0, 0);
|
||||||
this.classPreviewPanel.Name = "classPreviewPanel";
|
this.textPreviewBox.Multiline = true;
|
||||||
this.classPreviewPanel.Size = new System.Drawing.Size(776, 632);
|
this.textPreviewBox.Name = "textPreviewBox";
|
||||||
this.classPreviewPanel.TabIndex = 3;
|
this.textPreviewBox.ReadOnly = true;
|
||||||
this.classPreviewPanel.Visible = false;
|
this.textPreviewBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
||||||
|
this.textPreviewBox.Size = new System.Drawing.Size(768, 606);
|
||||||
|
this.textPreviewBox.TabIndex = 2;
|
||||||
|
this.textPreviewBox.Visible = false;
|
||||||
|
this.textPreviewBox.WordWrap = false;
|
||||||
//
|
//
|
||||||
// classTextBox
|
// classTextBox
|
||||||
//
|
//
|
||||||
@@ -866,10 +954,33 @@
|
|||||||
this.classTextBox.Name = "classTextBox";
|
this.classTextBox.Name = "classTextBox";
|
||||||
this.classTextBox.ReadOnly = true;
|
this.classTextBox.ReadOnly = true;
|
||||||
this.classTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
this.classTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
||||||
this.classTextBox.Size = new System.Drawing.Size(776, 632);
|
this.classTextBox.Size = new System.Drawing.Size(768, 606);
|
||||||
this.classTextBox.TabIndex = 3;
|
this.classTextBox.TabIndex = 3;
|
||||||
|
this.classTextBox.Visible = false;
|
||||||
this.classTextBox.WordWrap = false;
|
this.classTextBox.WordWrap = false;
|
||||||
//
|
//
|
||||||
|
// tabPage5
|
||||||
|
//
|
||||||
|
this.tabPage5.Controls.Add(this.dumpTextBox);
|
||||||
|
this.tabPage5.Location = new System.Drawing.Point(4, 22);
|
||||||
|
this.tabPage5.Name = "tabPage5";
|
||||||
|
this.tabPage5.Size = new System.Drawing.Size(768, 606);
|
||||||
|
this.tabPage5.TabIndex = 1;
|
||||||
|
this.tabPage5.Text = "Dump";
|
||||||
|
this.tabPage5.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// dumpTextBox
|
||||||
|
//
|
||||||
|
this.dumpTextBox.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||||
|
this.dumpTextBox.Location = new System.Drawing.Point(0, 0);
|
||||||
|
this.dumpTextBox.Multiline = true;
|
||||||
|
this.dumpTextBox.Name = "dumpTextBox";
|
||||||
|
this.dumpTextBox.ReadOnly = true;
|
||||||
|
this.dumpTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Both;
|
||||||
|
this.dumpTextBox.Size = new System.Drawing.Size(768, 606);
|
||||||
|
this.dumpTextBox.TabIndex = 0;
|
||||||
|
this.dumpTextBox.WordWrap = false;
|
||||||
|
//
|
||||||
// statusStrip1
|
// statusStrip1
|
||||||
//
|
//
|
||||||
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||||
@@ -901,11 +1012,6 @@
|
|||||||
this.openFileDialog1.Multiselect = true;
|
this.openFileDialog1.Multiselect = true;
|
||||||
this.openFileDialog1.RestoreDirectory = true;
|
this.openFileDialog1.RestoreDirectory = true;
|
||||||
//
|
//
|
||||||
// saveFileDialog1
|
|
||||||
//
|
|
||||||
this.saveFileDialog1.Filter = "FBX file|*.fbx";
|
|
||||||
this.saveFileDialog1.RestoreDirectory = true;
|
|
||||||
//
|
|
||||||
// contextMenuStrip1
|
// contextMenuStrip1
|
||||||
//
|
//
|
||||||
this.contextMenuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20);
|
this.contextMenuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20);
|
||||||
@@ -922,7 +1028,7 @@
|
|||||||
//
|
//
|
||||||
this.copyToolStripMenuItem.Name = "copyToolStripMenuItem";
|
this.copyToolStripMenuItem.Name = "copyToolStripMenuItem";
|
||||||
this.copyToolStripMenuItem.Size = new System.Drawing.Size(326, 22);
|
this.copyToolStripMenuItem.Size = new System.Drawing.Size(326, 22);
|
||||||
this.copyToolStripMenuItem.Text = "Copy";
|
this.copyToolStripMenuItem.Text = "Copy text";
|
||||||
this.copyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem_Click);
|
this.copyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem_Click);
|
||||||
//
|
//
|
||||||
// exportSelectedAssetsToolStripMenuItem
|
// exportSelectedAssetsToolStripMenuItem
|
||||||
@@ -988,14 +1094,16 @@
|
|||||||
this.tabPage2.PerformLayout();
|
this.tabPage2.PerformLayout();
|
||||||
this.tabPage3.ResumeLayout(false);
|
this.tabPage3.ResumeLayout(false);
|
||||||
this.progressbarPanel.ResumeLayout(false);
|
this.progressbarPanel.ResumeLayout(false);
|
||||||
|
this.tabControl2.ResumeLayout(false);
|
||||||
|
this.tabPage4.ResumeLayout(false);
|
||||||
this.previewPanel.ResumeLayout(false);
|
this.previewPanel.ResumeLayout(false);
|
||||||
this.previewPanel.PerformLayout();
|
this.previewPanel.PerformLayout();
|
||||||
this.FMODpanel.ResumeLayout(false);
|
this.FMODpanel.ResumeLayout(false);
|
||||||
this.FMODpanel.PerformLayout();
|
this.FMODpanel.PerformLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.FMODprogressBar)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.FMODprogressBar)).EndInit();
|
||||||
((System.ComponentModel.ISupportInitialize)(this.FMODvolumeBar)).EndInit();
|
((System.ComponentModel.ISupportInitialize)(this.FMODvolumeBar)).EndInit();
|
||||||
this.classPreviewPanel.ResumeLayout(false);
|
this.tabPage5.ResumeLayout(false);
|
||||||
this.classPreviewPanel.PerformLayout();
|
this.tabPage5.PerformLayout();
|
||||||
this.statusStrip1.ResumeLayout(false);
|
this.statusStrip1.ResumeLayout(false);
|
||||||
this.statusStrip1.PerformLayout();
|
this.statusStrip1.PerformLayout();
|
||||||
this.contextMenuStrip1.ResumeLayout(false);
|
this.contextMenuStrip1.ResumeLayout(false);
|
||||||
@@ -1052,7 +1160,6 @@
|
|||||||
private System.Windows.Forms.ToolStripMenuItem extractFileToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem extractFileToolStripMenuItem;
|
||||||
private System.Windows.Forms.ToolStripMenuItem extractFolderToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem extractFolderToolStripMenuItem;
|
||||||
private System.Windows.Forms.OpenFileDialog openFileDialog1;
|
private System.Windows.Forms.OpenFileDialog openFileDialog1;
|
||||||
private System.Windows.Forms.SaveFileDialog saveFileDialog1;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem showExpOpt;
|
private System.Windows.Forms.ToolStripMenuItem showExpOpt;
|
||||||
private GOHierarchy sceneTreeView;
|
private GOHierarchy sceneTreeView;
|
||||||
private System.Windows.Forms.ToolStripMenuItem debugMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem debugMenuItem;
|
||||||
@@ -1060,7 +1167,6 @@
|
|||||||
private System.Windows.Forms.ListView classesListView;
|
private System.Windows.Forms.ListView classesListView;
|
||||||
private System.Windows.Forms.ColumnHeader columnHeader2;
|
private System.Windows.Forms.ColumnHeader columnHeader2;
|
||||||
private System.Windows.Forms.ColumnHeader columnHeader1;
|
private System.Windows.Forms.ColumnHeader columnHeader1;
|
||||||
private System.Windows.Forms.Panel classPreviewPanel;
|
|
||||||
private System.Windows.Forms.TextBox classTextBox;
|
private System.Windows.Forms.TextBox classTextBox;
|
||||||
private System.Windows.Forms.ToolStripMenuItem exportClassStructuresMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem exportClassStructuresMenuItem;
|
||||||
private System.Windows.Forms.Label FMODcopyright;
|
private System.Windows.Forms.Label FMODcopyright;
|
||||||
@@ -1092,6 +1198,18 @@
|
|||||||
private System.Windows.Forms.ColumnHeader columnHeaderContainer;
|
private System.Windows.Forms.ColumnHeader columnHeaderContainer;
|
||||||
private System.Windows.Forms.ColumnHeader columnHeaderPathID;
|
private System.Windows.Forms.ColumnHeader columnHeaderPathID;
|
||||||
private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem;
|
||||||
|
private System.Windows.Forms.TabControl tabControl2;
|
||||||
|
private System.Windows.Forms.TabPage tabPage4;
|
||||||
|
private System.Windows.Forms.TabPage tabPage5;
|
||||||
|
private System.Windows.Forms.TextBox dumpTextBox;
|
||||||
|
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem10;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem11;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem12;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem13;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem14;
|
||||||
|
private System.Windows.Forms.ToolStripTextBox specifyUnityVersion;
|
||||||
|
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem15;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using AssetStudio;
|
using AssetStudio;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using OpenTK;
|
using OpenTK;
|
||||||
using OpenTK.Graphics.OpenGL;
|
using OpenTK.Graphics.OpenGL;
|
||||||
using System;
|
using System;
|
||||||
@@ -18,6 +19,7 @@ using System.Timers;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using static AssetStudioGUI.Studio;
|
using static AssetStudioGUI.Studio;
|
||||||
using Font = AssetStudio.Font;
|
using Font = AssetStudio.Font;
|
||||||
|
using ImageFormat = AssetStudio.ImageFormat;
|
||||||
using PixelFormat = System.Drawing.Imaging.PixelFormat;
|
using PixelFormat = System.Drawing.Imaging.PixelFormat;
|
||||||
using Vector3 = OpenTK.Vector3;
|
using Vector3 = OpenTK.Vector3;
|
||||||
using Vector4 = OpenTK.Vector4;
|
using Vector4 = OpenTK.Vector4;
|
||||||
@@ -27,7 +29,6 @@ namespace AssetStudioGUI
|
|||||||
partial class AssetStudioGUIForm : Form
|
partial class AssetStudioGUIForm : Form
|
||||||
{
|
{
|
||||||
private AssetItem lastSelectedItem;
|
private AssetItem lastSelectedItem;
|
||||||
private AssetItem lastLoadedAsset;
|
|
||||||
private Bitmap imageTexture;
|
private Bitmap imageTexture;
|
||||||
private string tempClipboard;
|
private string tempClipboard;
|
||||||
|
|
||||||
@@ -81,6 +82,11 @@ namespace AssetStudioGUI
|
|||||||
private int nextGObject;
|
private int nextGObject;
|
||||||
private List<TreeNode> treeSrcResults = new List<TreeNode>();
|
private List<TreeNode> treeSrcResults = new List<TreeNode>();
|
||||||
|
|
||||||
|
private string openDirectoryBackup = string.Empty;
|
||||||
|
private string saveDirectoryBackup = string.Empty;
|
||||||
|
|
||||||
|
private GUILogger logger;
|
||||||
|
|
||||||
[DllImport("gdi32.dll")]
|
[DllImport("gdi32.dll")]
|
||||||
private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [In] ref uint pcFonts);
|
private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [In] ref uint pcFonts);
|
||||||
|
|
||||||
@@ -96,7 +102,8 @@ namespace AssetStudioGUI
|
|||||||
enablePreview.Checked = Properties.Settings.Default.enablePreview;
|
enablePreview.Checked = Properties.Settings.Default.enablePreview;
|
||||||
FMODinit();
|
FMODinit();
|
||||||
|
|
||||||
Logger.Default = new GUILogger(StatusStripUpdate);
|
logger = new GUILogger(StatusStripUpdate);
|
||||||
|
Logger.Default = logger;
|
||||||
Progress.Default = new GUIProgress(SetProgressBarValue);
|
Progress.Default = new GUIProgress(SetProgressBarValue);
|
||||||
Studio.StatusStripUpdate = StatusStripUpdate;
|
Studio.StatusStripUpdate = StatusStripUpdate;
|
||||||
}
|
}
|
||||||
@@ -115,7 +122,7 @@ namespace AssetStudioGUI
|
|||||||
if (paths.Length > 0)
|
if (paths.Length > 0)
|
||||||
{
|
{
|
||||||
ResetForm();
|
ResetForm();
|
||||||
|
assetsManager.SpecifyUnityVersion = specifyUnityVersion.Text;
|
||||||
if (paths.Length == 1 && Directory.Exists(paths[0]))
|
if (paths.Length == 1 && Directory.Exists(paths[0]))
|
||||||
{
|
{
|
||||||
await Task.Run(() => assetsManager.LoadFolder(paths[0]));
|
await Task.Run(() => assetsManager.LoadFolder(paths[0]));
|
||||||
@@ -124,16 +131,18 @@ namespace AssetStudioGUI
|
|||||||
{
|
{
|
||||||
await Task.Run(() => assetsManager.LoadFiles(paths));
|
await Task.Run(() => assetsManager.LoadFiles(paths));
|
||||||
}
|
}
|
||||||
|
|
||||||
BuildAssetStructures();
|
BuildAssetStructures();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void loadFile_Click(object sender, EventArgs e)
|
private async void loadFile_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
|
openFileDialog1.InitialDirectory = openDirectoryBackup;
|
||||||
if (openFileDialog1.ShowDialog() == DialogResult.OK)
|
if (openFileDialog1.ShowDialog() == DialogResult.OK)
|
||||||
{
|
{
|
||||||
ResetForm();
|
ResetForm();
|
||||||
|
openDirectoryBackup = Path.GetDirectoryName(openFileDialog1.FileNames[0]);
|
||||||
|
assetsManager.SpecifyUnityVersion = specifyUnityVersion.Text;
|
||||||
await Task.Run(() => assetsManager.LoadFiles(openFileDialog1.FileNames));
|
await Task.Run(() => assetsManager.LoadFiles(openFileDialog1.FileNames));
|
||||||
BuildAssetStructures();
|
BuildAssetStructures();
|
||||||
}
|
}
|
||||||
@@ -142,29 +151,47 @@ namespace AssetStudioGUI
|
|||||||
private async void loadFolder_Click(object sender, EventArgs e)
|
private async void loadFolder_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var openFolderDialog = new OpenFolderDialog();
|
var openFolderDialog = new OpenFolderDialog();
|
||||||
|
openFolderDialog.InitialFolder = openDirectoryBackup;
|
||||||
if (openFolderDialog.ShowDialog(this) == DialogResult.OK)
|
if (openFolderDialog.ShowDialog(this) == DialogResult.OK)
|
||||||
{
|
{
|
||||||
ResetForm();
|
ResetForm();
|
||||||
|
openDirectoryBackup = openFolderDialog.Folder;
|
||||||
|
assetsManager.SpecifyUnityVersion = specifyUnityVersion.Text;
|
||||||
await Task.Run(() => assetsManager.LoadFolder(openFolderDialog.Folder));
|
await Task.Run(() => assetsManager.LoadFolder(openFolderDialog.Folder));
|
||||||
BuildAssetStructures();
|
BuildAssetStructures();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void extractFileToolStripMenuItem_Click(object sender, EventArgs e)
|
private async void extractFileToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (openFileDialog1.ShowDialog() == DialogResult.OK)
|
if (openFileDialog1.ShowDialog() == DialogResult.OK)
|
||||||
{
|
{
|
||||||
ExtractFile(openFileDialog1.FileNames);
|
var saveFolderDialog = new OpenFolderDialog();
|
||||||
|
saveFolderDialog.Title = "Select the save folder";
|
||||||
|
if (saveFolderDialog.ShowDialog(this) == DialogResult.OK)
|
||||||
|
{
|
||||||
|
var fileNames = openFileDialog1.FileNames;
|
||||||
|
var savePath = saveFolderDialog.Folder;
|
||||||
|
var extractedCount = await Task.Run(() => ExtractFile(fileNames, savePath));
|
||||||
|
StatusStripUpdate($"Finished extracting {extractedCount} files.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void extractFolderToolStripMenuItem_Click(object sender, EventArgs e)
|
private async void extractFolderToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
var openFolderDialog1 = new OpenFolderDialog();
|
var openFolderDialog = new OpenFolderDialog();
|
||||||
if (openFolderDialog1.ShowDialog(this) == DialogResult.OK)
|
if (openFolderDialog.ShowDialog(this) == DialogResult.OK)
|
||||||
{
|
{
|
||||||
var files = Directory.GetFiles(openFolderDialog1.Folder, "*.*", SearchOption.AllDirectories);
|
var saveFolderDialog = new OpenFolderDialog();
|
||||||
ExtractFile(files);
|
saveFolderDialog.Title = "Select the save folder";
|
||||||
|
if (saveFolderDialog.ShowDialog(this) == DialogResult.OK)
|
||||||
|
{
|
||||||
|
var path = openFolderDialog.Folder;
|
||||||
|
var savePath = saveFolderDialog.Folder;
|
||||||
|
var extractedCount = await Task.Run(() => ExtractFolder(path, savePath));
|
||||||
|
StatusStripUpdate($"Finished extracting {extractedCount} files.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,31 +314,31 @@ namespace AssetStudioGUI
|
|||||||
{
|
{
|
||||||
if (e.Control)
|
if (e.Control)
|
||||||
{
|
{
|
||||||
bool dirty = false;
|
var need = false;
|
||||||
switch (e.KeyCode)
|
switch (e.KeyCode)
|
||||||
{
|
{
|
||||||
case Keys.B:
|
case Keys.B:
|
||||||
textureChannels[0] = !textureChannels[0];
|
textureChannels[0] = !textureChannels[0];
|
||||||
dirty = true;
|
need = true;
|
||||||
break;
|
break;
|
||||||
case Keys.G:
|
case Keys.G:
|
||||||
textureChannels[1] = !textureChannels[1];
|
textureChannels[1] = !textureChannels[1];
|
||||||
dirty = true;
|
need = true;
|
||||||
break;
|
break;
|
||||||
case Keys.R:
|
case Keys.R:
|
||||||
textureChannels[2] = !textureChannels[2];
|
textureChannels[2] = !textureChannels[2];
|
||||||
dirty = true;
|
need = true;
|
||||||
break;
|
break;
|
||||||
case Keys.A:
|
case Keys.A:
|
||||||
textureChannels[3] = !textureChannels[3];
|
textureChannels[3] = !textureChannels[3];
|
||||||
dirty = true;
|
need = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (dirty)
|
if (need)
|
||||||
{
|
{
|
||||||
PreviewAsset(lastLoadedAsset);
|
if (lastSelectedItem != null)
|
||||||
if (lastSelectedItem != null && assetInfoLabel.Text != null)
|
|
||||||
{
|
{
|
||||||
|
PreviewAsset(lastSelectedItem);
|
||||||
assetInfoLabel.Text = lastSelectedItem.InfoText;
|
assetInfoLabel.Text = lastSelectedItem.InfoText;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -332,10 +359,10 @@ namespace AssetStudioGUI
|
|||||||
Progress.Reset();
|
Progress.Reset();
|
||||||
foreach (TypeTreeItem item in classesListView.Items)
|
foreach (TypeTreeItem item in classesListView.Items)
|
||||||
{
|
{
|
||||||
var versionPath = savePath + "\\" + item.Group.Header;
|
var versionPath = Path.Combine(savePath, item.Group.Header);
|
||||||
Directory.CreateDirectory(versionPath);
|
Directory.CreateDirectory(versionPath);
|
||||||
|
|
||||||
var saveFile = $"{versionPath}\\{item.SubItems[1].Text} {item.Text}.txt";
|
var saveFile = $"{versionPath}{Path.DirectorySeparatorChar}{item.SubItems[1].Text} {item.Text}.txt";
|
||||||
File.WriteAllText(saveFile, item.ToString());
|
File.WriteAllText(saveFile, item.ToString());
|
||||||
|
|
||||||
Progress.Report(++i, count);
|
Progress.Report(++i, count);
|
||||||
@@ -354,9 +381,9 @@ namespace AssetStudioGUI
|
|||||||
|
|
||||||
private void enablePreview_Check(object sender, EventArgs e)
|
private void enablePreview_Check(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (lastLoadedAsset != null)
|
if (lastSelectedItem != null)
|
||||||
{
|
{
|
||||||
switch (lastLoadedAsset.Type)
|
switch (lastSelectedItem.Type)
|
||||||
{
|
{
|
||||||
case ClassIDType.Texture2D:
|
case ClassIDType.Texture2D:
|
||||||
case ClassIDType.Sprite:
|
case ClassIDType.Sprite:
|
||||||
@@ -395,7 +422,7 @@ namespace AssetStudioGUI
|
|||||||
}
|
}
|
||||||
else if (FMODpanel.Visible)
|
else if (FMODpanel.Visible)
|
||||||
{
|
{
|
||||||
PreviewAsset(lastLoadedAsset);
|
PreviewAsset(lastSelectedItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -406,8 +433,7 @@ namespace AssetStudioGUI
|
|||||||
}
|
}
|
||||||
else if (lastSelectedItem != null && enablePreview.Checked)
|
else if (lastSelectedItem != null && enablePreview.Checked)
|
||||||
{
|
{
|
||||||
lastLoadedAsset = lastSelectedItem;
|
PreviewAsset(lastSelectedItem);
|
||||||
PreviewAsset(lastLoadedAsset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Properties.Settings.Default.enablePreview = enablePreview.Checked;
|
Properties.Settings.Default.enablePreview = enablePreview.Checked;
|
||||||
@@ -448,14 +474,8 @@ namespace AssetStudioGUI
|
|||||||
treeSearch.Select();
|
treeSearch.Select();
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
classPreviewPanel.Visible = false;
|
|
||||||
previewPanel.Visible = true;
|
|
||||||
listSearch.Select();
|
listSearch.Select();
|
||||||
break;
|
break;
|
||||||
case 2:
|
|
||||||
previewPanel.Visible = false;
|
|
||||||
classPreviewPanel.Visible = true;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -617,13 +637,13 @@ namespace AssetStudioGUI
|
|||||||
{
|
{
|
||||||
previewPanel.BackgroundImage = Properties.Resources.preview;
|
previewPanel.BackgroundImage = Properties.Resources.preview;
|
||||||
previewPanel.BackgroundImageLayout = ImageLayout.Center;
|
previewPanel.BackgroundImageLayout = ImageLayout.Center;
|
||||||
|
classTextBox.Visible = false;
|
||||||
assetInfoLabel.Visible = false;
|
assetInfoLabel.Visible = false;
|
||||||
assetInfoLabel.Text = null;
|
assetInfoLabel.Text = null;
|
||||||
textPreviewBox.Visible = false;
|
textPreviewBox.Visible = false;
|
||||||
fontPreviewBox.Visible = false;
|
fontPreviewBox.Visible = false;
|
||||||
FMODpanel.Visible = false;
|
FMODpanel.Visible = false;
|
||||||
glControl1.Visible = false;
|
glControl1.Visible = false;
|
||||||
lastLoadedAsset = null;
|
|
||||||
StatusStripUpdate("");
|
StatusStripUpdate("");
|
||||||
|
|
||||||
FMODreset();
|
FMODreset();
|
||||||
@@ -632,21 +652,32 @@ namespace AssetStudioGUI
|
|||||||
|
|
||||||
if (e.IsSelected)
|
if (e.IsSelected)
|
||||||
{
|
{
|
||||||
|
if (tabControl2.SelectedIndex == 1)
|
||||||
|
{
|
||||||
|
dumpTextBox.Text = DumpAsset(lastSelectedItem.Asset);
|
||||||
|
}
|
||||||
if (enablePreview.Checked)
|
if (enablePreview.Checked)
|
||||||
{
|
{
|
||||||
lastLoadedAsset = lastSelectedItem;
|
PreviewAsset(lastSelectedItem);
|
||||||
PreviewAsset(lastLoadedAsset);
|
if (displayInfo.Checked && lastSelectedItem.InfoText != null)
|
||||||
}
|
{
|
||||||
if (displayInfo.Checked && assetInfoLabel.Text != null)//only display the label if asset has info text
|
assetInfoLabel.Text = lastSelectedItem.InfoText;
|
||||||
{
|
assetInfoLabel.Visible = true;
|
||||||
assetInfoLabel.Text = lastSelectedItem.InfoText;
|
}
|
||||||
assetInfoLabel.Visible = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void classesListView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
|
private void classesListView_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
|
||||||
{
|
{
|
||||||
|
classTextBox.Visible = true;
|
||||||
|
assetInfoLabel.Visible = false;
|
||||||
|
assetInfoLabel.Text = null;
|
||||||
|
textPreviewBox.Visible = false;
|
||||||
|
fontPreviewBox.Visible = false;
|
||||||
|
FMODpanel.Visible = false;
|
||||||
|
glControl1.Visible = false;
|
||||||
|
StatusStripUpdate("");
|
||||||
if (e.IsSelected)
|
if (e.IsSelected)
|
||||||
{
|
{
|
||||||
classTextBox.Text = ((TypeTreeItem)classesListView.SelectedItems[0]).ToString();
|
classTextBox.Text = ((TypeTreeItem)classesListView.SelectedItems[0]).ToString();
|
||||||
@@ -722,9 +753,10 @@ namespace AssetStudioGUI
|
|||||||
|
|
||||||
private void PreviewTexture2D(AssetItem assetItem, Texture2D m_Texture2D)
|
private void PreviewTexture2D(AssetItem assetItem, Texture2D m_Texture2D)
|
||||||
{
|
{
|
||||||
var bitmap = m_Texture2D.ConvertToBitmap(true);
|
var stream = m_Texture2D.ConvertToStream(ImageFormat.Png, true);
|
||||||
if (bitmap != null)
|
if (stream != null)
|
||||||
{
|
{
|
||||||
|
var bitmap = new Bitmap(stream);
|
||||||
assetItem.InfoText = $"Width: {m_Texture2D.m_Width}\nHeight: {m_Texture2D.m_Height}\nFormat: {m_Texture2D.m_TextureFormat}";
|
assetItem.InfoText = $"Width: {m_Texture2D.m_Width}\nHeight: {m_Texture2D.m_Height}\nFormat: {m_Texture2D.m_TextureFormat}";
|
||||||
switch (m_Texture2D.m_TextureSettings.m_FilterMode)
|
switch (m_Texture2D.m_TextureSettings.m_FilterMode)
|
||||||
{
|
{
|
||||||
@@ -880,10 +912,15 @@ namespace AssetStudioGUI
|
|||||||
var result = system.createSound(m_AudioData, FMOD.MODE.OPENMEMORY | loopMode, ref exinfo, out sound);
|
var result = system.createSound(m_AudioData, FMOD.MODE.OPENMEMORY | loopMode, ref exinfo, out sound);
|
||||||
if (ERRCHECK(result)) return;
|
if (ERRCHECK(result)) return;
|
||||||
|
|
||||||
result = sound.getSubSound(0, out var subsound);
|
sound.getNumSubSounds(out var numsubsounds);
|
||||||
if (result == FMOD.RESULT.OK)
|
|
||||||
|
if (numsubsounds > 0)
|
||||||
{
|
{
|
||||||
sound = subsound;
|
result = sound.getSubSound(0, out var subsound);
|
||||||
|
if (result == FMOD.RESULT.OK)
|
||||||
|
{
|
||||||
|
sound = subsound;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result = sound.getLength(out FMODlenms, FMOD.TIMEUNIT.MS);
|
result = sound.getLength(out FMODlenms, FMOD.TIMEUNIT.MS);
|
||||||
@@ -910,12 +947,20 @@ namespace AssetStudioGUI
|
|||||||
private void PreviewTextAsset(TextAsset m_TextAsset)
|
private void PreviewTextAsset(TextAsset m_TextAsset)
|
||||||
{
|
{
|
||||||
var text = Encoding.UTF8.GetString(m_TextAsset.m_Script);
|
var text = Encoding.UTF8.GetString(m_TextAsset.m_Script);
|
||||||
PreviewText(text.Replace("\n", "\r\n"));
|
text = text.Replace("\n", "\r\n").Replace("\0", "");
|
||||||
|
PreviewText(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PreviewMonoBehaviour(MonoBehaviour m_MonoBehaviour)
|
private void PreviewMonoBehaviour(MonoBehaviour m_MonoBehaviour)
|
||||||
{
|
{
|
||||||
PreviewText(m_MonoBehaviour.Dump() ?? GetScriptString(m_MonoBehaviour.reader));
|
var obj = m_MonoBehaviour.ToType();
|
||||||
|
if (obj == null)
|
||||||
|
{
|
||||||
|
var type = MonoBehaviourToTypeTree(m_MonoBehaviour);
|
||||||
|
obj = m_MonoBehaviour.ToType(type);
|
||||||
|
}
|
||||||
|
var str = JsonConvert.SerializeObject(obj, Formatting.Indented);
|
||||||
|
PreviewText(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PreviewFont(Font m_Font)
|
private void PreviewFont(Font m_Font)
|
||||||
@@ -1119,11 +1164,11 @@ namespace AssetStudioGUI
|
|||||||
|
|
||||||
private void PreviewSprite(AssetItem assetItem, Sprite m_Sprite)
|
private void PreviewSprite(AssetItem assetItem, Sprite m_Sprite)
|
||||||
{
|
{
|
||||||
var bitmap = m_Sprite.GetImage();
|
var stream = m_Sprite.GetImage(ImageFormat.Png);
|
||||||
if (bitmap != null)
|
if (stream != null)
|
||||||
{
|
{
|
||||||
|
var bitmap = new Bitmap(stream);
|
||||||
assetItem.InfoText = $"Width: {bitmap.Width}\nHeight: {bitmap.Height}\n";
|
assetItem.InfoText = $"Width: {bitmap.Width}\nHeight: {bitmap.Height}\n";
|
||||||
|
|
||||||
PreviewTexture(bitmap);
|
PreviewTexture(bitmap);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1177,6 +1222,7 @@ namespace AssetStudioGUI
|
|||||||
{
|
{
|
||||||
Text = $"AssetStudioGUI v{Application.ProductVersion}";
|
Text = $"AssetStudioGUI v{Application.ProductVersion}";
|
||||||
assetsManager.Clear();
|
assetsManager.Clear();
|
||||||
|
assemblyLoader.Clear();
|
||||||
exportableAssets.Clear();
|
exportableAssets.Clear();
|
||||||
visibleAssets.Clear();
|
visibleAssets.Clear();
|
||||||
sceneTreeView.Nodes.Clear();
|
sceneTreeView.Nodes.Clear();
|
||||||
@@ -1193,7 +1239,6 @@ namespace AssetStudioGUI
|
|||||||
fontPreviewBox.Visible = false;
|
fontPreviewBox.Visible = false;
|
||||||
glControl1.Visible = false;
|
glControl1.Visible = false;
|
||||||
lastSelectedItem = null;
|
lastSelectedItem = null;
|
||||||
lastLoadedAsset = null;
|
|
||||||
sortColumn = -1;
|
sortColumn = -1;
|
||||||
reverseSort = false;
|
reverseSort = false;
|
||||||
enableFiltering = false;
|
enableFiltering = false;
|
||||||
@@ -1206,12 +1251,6 @@ namespace AssetStudioGUI
|
|||||||
}
|
}
|
||||||
|
|
||||||
FMODreset();
|
FMODreset();
|
||||||
|
|
||||||
if (scriptDumper != null)
|
|
||||||
{
|
|
||||||
scriptDumper.Dispose();
|
|
||||||
scriptDumper = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assetListView_MouseClick(object sender, MouseEventArgs e)
|
private void assetListView_MouseClick(object sender, MouseEventArgs e)
|
||||||
@@ -1248,7 +1287,7 @@ namespace AssetStudioGUI
|
|||||||
|
|
||||||
private void exportSelectedAssetsToolStripMenuItem_Click(object sender, EventArgs e)
|
private void exportSelectedAssetsToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ExportAssets(2, ExportType.Convert);
|
ExportAssets(ExportFilter.Selected, ExportType.Convert);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showOriginalFileToolStripMenuItem_Click(object sender, EventArgs e)
|
private void showOriginalFileToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
@@ -1278,10 +1317,12 @@ namespace AssetStudioGUI
|
|||||||
|
|
||||||
if (animator != null)
|
if (animator != null)
|
||||||
{
|
{
|
||||||
var saveFolderDialog1 = new OpenFolderDialog();
|
var saveFolderDialog = new OpenFolderDialog();
|
||||||
if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK)
|
saveFolderDialog.InitialFolder = saveDirectoryBackup;
|
||||||
|
if (saveFolderDialog.ShowDialog(this) == DialogResult.OK)
|
||||||
{
|
{
|
||||||
var exportPath = saveFolderDialog1.Folder + "\\Animator\\";
|
saveDirectoryBackup = saveFolderDialog.Folder;
|
||||||
|
var exportPath = Path.Combine(saveFolderDialog.Folder, "Animator") + Path.DirectorySeparatorChar;
|
||||||
ExportAnimatorWithAnimationClip(animator, animationList, exportPath);
|
ExportAnimatorWithAnimationClip(animator, animationList, exportPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1301,10 +1342,12 @@ namespace AssetStudioGUI
|
|||||||
{
|
{
|
||||||
if (sceneTreeView.Nodes.Count > 0)
|
if (sceneTreeView.Nodes.Count > 0)
|
||||||
{
|
{
|
||||||
var saveFolderDialog1 = new OpenFolderDialog();
|
var saveFolderDialog = new OpenFolderDialog();
|
||||||
if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK)
|
saveFolderDialog.InitialFolder = saveDirectoryBackup;
|
||||||
|
if (saveFolderDialog.ShowDialog(this) == DialogResult.OK)
|
||||||
{
|
{
|
||||||
var exportPath = saveFolderDialog1.Folder + "\\GameObject\\";
|
saveDirectoryBackup = saveFolderDialog.Folder;
|
||||||
|
var exportPath = Path.Combine(saveFolderDialog.Folder, "GameObject") + Path.DirectorySeparatorChar;
|
||||||
List<AssetItem> animationList = null;
|
List<AssetItem> animationList = null;
|
||||||
if (animation)
|
if (animation)
|
||||||
{
|
{
|
||||||
@@ -1343,8 +1386,10 @@ namespace AssetStudioGUI
|
|||||||
saveFileDialog.FileName = gameObjects[0].m_Name + " (merge).fbx";
|
saveFileDialog.FileName = gameObjects[0].m_Name + " (merge).fbx";
|
||||||
saveFileDialog.AddExtension = false;
|
saveFileDialog.AddExtension = false;
|
||||||
saveFileDialog.Filter = "Fbx file (*.fbx)|*.fbx";
|
saveFileDialog.Filter = "Fbx file (*.fbx)|*.fbx";
|
||||||
|
saveFileDialog.InitialDirectory = saveDirectoryBackup;
|
||||||
if (saveFileDialog.ShowDialog() == DialogResult.OK)
|
if (saveFileDialog.ShowDialog() == DialogResult.OK)
|
||||||
{
|
{
|
||||||
|
saveDirectoryBackup = Path.GetDirectoryName(saveFileDialog.FileName);
|
||||||
var exportPath = saveFileDialog.FileName;
|
var exportPath = saveFileDialog.FileName;
|
||||||
List<AssetItem> animationList = null;
|
List<AssetItem> animationList = null;
|
||||||
if (animation)
|
if (animation)
|
||||||
@@ -1372,57 +1417,74 @@ namespace AssetStudioGUI
|
|||||||
|
|
||||||
private void exportAllAssetsMenuItem_Click(object sender, EventArgs e)
|
private void exportAllAssetsMenuItem_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ExportAssets(1, ExportType.Convert);
|
ExportAssets(ExportFilter.All, ExportType.Convert);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void exportSelectedAssetsMenuItem_Click(object sender, EventArgs e)
|
private void exportSelectedAssetsMenuItem_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ExportAssets(2, ExportType.Convert);
|
ExportAssets(ExportFilter.Selected, ExportType.Convert);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void exportFilteredAssetsMenuItem_Click(object sender, EventArgs e)
|
private void exportFilteredAssetsMenuItem_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ExportAssets(3, ExportType.Convert);
|
ExportAssets(ExportFilter.Filtered, ExportType.Convert);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toolStripMenuItem4_Click(object sender, EventArgs e)
|
private void toolStripMenuItem4_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ExportAssets(1, ExportType.Raw);
|
ExportAssets(ExportFilter.All, ExportType.Raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toolStripMenuItem5_Click(object sender, EventArgs e)
|
private void toolStripMenuItem5_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ExportAssets(2, ExportType.Raw);
|
ExportAssets(ExportFilter.Selected, ExportType.Raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toolStripMenuItem6_Click(object sender, EventArgs e)
|
private void toolStripMenuItem6_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ExportAssets(3, ExportType.Raw);
|
ExportAssets(ExportFilter.Filtered, ExportType.Raw);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toolStripMenuItem7_Click(object sender, EventArgs e)
|
private void toolStripMenuItem7_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ExportAssets(1, ExportType.Dump);
|
ExportAssets(ExportFilter.All, ExportType.Dump);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toolStripMenuItem8_Click(object sender, EventArgs e)
|
private void toolStripMenuItem8_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ExportAssets(2, ExportType.Dump);
|
ExportAssets(ExportFilter.Selected, ExportType.Dump);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void toolStripMenuItem9_Click(object sender, EventArgs e)
|
private void toolStripMenuItem9_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
ExportAssets(3, ExportType.Dump);
|
ExportAssets(ExportFilter.Filtered, ExportType.Dump);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void toolStripMenuItem11_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ExportAssetsList(ExportFilter.All);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void toolStripMenuItem12_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ExportAssetsList(ExportFilter.Selected);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void toolStripMenuItem13_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
ExportAssetsList(ExportFilter.Filtered);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void exportAllObjectssplitToolStripMenuItem1_Click(object sender, EventArgs e)
|
private void exportAllObjectssplitToolStripMenuItem1_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (sceneTreeView.Nodes.Count > 0)
|
if (sceneTreeView.Nodes.Count > 0)
|
||||||
{
|
{
|
||||||
var saveFolderDialog1 = new OpenFolderDialog();
|
var saveFolderDialog = new OpenFolderDialog();
|
||||||
if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK)
|
saveFolderDialog.InitialFolder = saveDirectoryBackup;
|
||||||
|
if (saveFolderDialog.ShowDialog(this) == DialogResult.OK)
|
||||||
{
|
{
|
||||||
var savePath = saveFolderDialog1.Folder + "\\";
|
saveDirectoryBackup = saveFolderDialog.Folder;
|
||||||
|
var savePath = saveFolderDialog.Folder + Path.DirectorySeparatorChar;
|
||||||
ExportSplitObjects(savePath, sceneTreeView.Nodes);
|
ExportSplitObjects(savePath, sceneTreeView.Nodes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1475,29 +1537,64 @@ namespace AssetStudioGUI
|
|||||||
assetListView.EndUpdate();
|
assetListView.EndUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ExportAssets(int type, ExportType exportType)
|
private void ExportAssets(ExportFilter type, ExportType exportType)
|
||||||
{
|
{
|
||||||
if (exportableAssets.Count > 0)
|
if (exportableAssets.Count > 0)
|
||||||
{
|
{
|
||||||
var saveFolderDialog1 = new OpenFolderDialog();
|
var saveFolderDialog = new OpenFolderDialog();
|
||||||
if (saveFolderDialog1.ShowDialog(this) == DialogResult.OK)
|
saveFolderDialog.InitialFolder = saveDirectoryBackup;
|
||||||
|
if (saveFolderDialog.ShowDialog(this) == DialogResult.OK)
|
||||||
{
|
{
|
||||||
timer.Stop();
|
timer.Stop();
|
||||||
|
saveDirectoryBackup = saveFolderDialog.Folder;
|
||||||
List<AssetItem> toExportAssets = null;
|
List<AssetItem> toExportAssets = null;
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case 1: //All Assets
|
case ExportFilter.All:
|
||||||
toExportAssets = exportableAssets;
|
toExportAssets = exportableAssets;
|
||||||
break;
|
break;
|
||||||
case 2: //Selected Assets
|
case ExportFilter.Selected:
|
||||||
toExportAssets = GetSelectedAssets();
|
toExportAssets = GetSelectedAssets();
|
||||||
break;
|
break;
|
||||||
case 3: //Filtered Assets
|
case ExportFilter.Filtered:
|
||||||
toExportAssets = visibleAssets;
|
toExportAssets = visibleAssets;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Studio.ExportAssets(saveFolderDialog1.Folder, toExportAssets, exportType);
|
Studio.ExportAssets(saveFolderDialog.Folder, toExportAssets, exportType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StatusStripUpdate("No exportable assets loaded");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ExportAssetsList(ExportFilter type)
|
||||||
|
{
|
||||||
|
// XXX: Only exporting as XML for now, but would JSON(/CSV/other) be useful too?
|
||||||
|
|
||||||
|
if (exportableAssets.Count > 0)
|
||||||
|
{
|
||||||
|
var saveFolderDialog = new OpenFolderDialog();
|
||||||
|
saveFolderDialog.InitialFolder = saveDirectoryBackup;
|
||||||
|
if (saveFolderDialog.ShowDialog(this) == DialogResult.OK)
|
||||||
|
{
|
||||||
|
timer.Stop();
|
||||||
|
saveDirectoryBackup = saveFolderDialog.Folder;
|
||||||
|
List<AssetItem> toExportAssets = null;
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case ExportFilter.All:
|
||||||
|
toExportAssets = exportableAssets;
|
||||||
|
break;
|
||||||
|
case ExportFilter.Selected:
|
||||||
|
toExportAssets = GetSelectedAssets();
|
||||||
|
break;
|
||||||
|
case ExportFilter.Filtered:
|
||||||
|
toExportAssets = visibleAssets;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Studio.ExportAssetsList(saveFolderDialog.Folder, toExportAssets, ExportListType.XML);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1522,7 +1619,7 @@ namespace AssetStudioGUI
|
|||||||
Application.Exit();
|
Application.Exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
result = system.init(1, FMOD.INITFLAGS.NORMAL, IntPtr.Zero);
|
result = system.init(2, FMOD.INITFLAGS.NORMAL, IntPtr.Zero);
|
||||||
if (ERRCHECK(result)) { return; }
|
if (ERRCHECK(result)) { return; }
|
||||||
|
|
||||||
result = system.getMasterSoundGroup(out masterSoundGroup);
|
result = system.getMasterSoundGroup(out masterSoundGroup);
|
||||||
@@ -1934,6 +2031,19 @@ namespace AssetStudioGUI
|
|||||||
glControl1.SwapBuffers();
|
glControl1.SwapBuffers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void tabControl2_SelectedIndexChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (tabControl2.SelectedIndex == 1 && lastSelectedItem != null)
|
||||||
|
{
|
||||||
|
dumpTextBox.Text = DumpAsset(lastSelectedItem.Asset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void toolStripMenuItem15_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
logger.ShowErrorMessage = toolStripMenuItem15.Checked;
|
||||||
|
}
|
||||||
|
|
||||||
private void glControl1_MouseWheel(object sender, MouseEventArgs e)
|
private void glControl1_MouseWheel(object sender, MouseEventArgs e)
|
||||||
{
|
{
|
||||||
if (glControl1.Visible)
|
if (glControl1.Visible)
|
||||||
|
|||||||
@@ -120,9 +120,6 @@
|
|||||||
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>312, 17</value>
|
<value>312, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
|
||||||
<value>432, 17</value>
|
|
||||||
</metadata>
|
|
||||||
<data name="fontPreviewBox.Text" xml:space="preserve">
|
<data name="fontPreviewBox.Text" xml:space="preserve">
|
||||||
<value>abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWYZ
|
<value>abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWYZ
|
||||||
1234567890.:,;'\"(!?)+-*/=
|
1234567890.:,;'\"(!?)+-*/=
|
||||||
@@ -141,15 +138,15 @@ The quick brown fox jumps over the lazy dog. 1234567890
|
|||||||
|
|
||||||
The quick brown fox jumps over the lazy dog. 1234567890</value>
|
The quick brown fox jumps over the lazy dog. 1234567890</value>
|
||||||
</data>
|
</data>
|
||||||
|
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>432, 17</value>
|
||||||
|
</metadata>
|
||||||
<metadata name="timer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="timer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>553, 17</value>
|
<value>553, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="openFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>636, 17</value>
|
<value>636, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
<metadata name="saveFileDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
|
||||||
<value>784, 17</value>
|
|
||||||
</metadata>
|
|
||||||
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>147, 17</value>
|
<value>147, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
|||||||
@@ -29,9 +29,11 @@ namespace AssetStudioGUI
|
|||||||
frm.GetOptions(out var options);
|
frm.GetOptions(out var options);
|
||||||
options |= NativeMethods.FOS_PICKFOLDERS | NativeMethods.FOS_FORCEFILESYSTEM | NativeMethods.FOS_NOVALIDATE | NativeMethods.FOS_NOTESTFILECREATE | NativeMethods.FOS_DONTADDTORECENT;
|
options |= NativeMethods.FOS_PICKFOLDERS | NativeMethods.FOS_FORCEFILESYSTEM | NativeMethods.FOS_NOVALIDATE | NativeMethods.FOS_NOTESTFILECREATE | NativeMethods.FOS_DONTADDTORECENT;
|
||||||
frm.SetOptions(options);
|
frm.SetOptions(options);
|
||||||
if (Title != null)
|
if (!string.IsNullOrEmpty(Title))
|
||||||
|
{
|
||||||
frm.SetTitle(Title);
|
frm.SetTitle(Title);
|
||||||
if (InitialFolder != null)
|
}
|
||||||
|
if (!string.IsNullOrEmpty(InitialFolder))
|
||||||
{
|
{
|
||||||
var riid = new Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"); //IShellItem
|
var riid = new Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"); //IShellItem
|
||||||
if (NativeMethods.SHCreateItemFromParsingName(InitialFolder, IntPtr.Zero, ref riid, out var directoryShellItem) == NativeMethods.S_OK)
|
if (NativeMethods.SHCreateItemFromParsingName(InitialFolder, IntPtr.Zero, ref riid, out var directoryShellItem) == NativeMethods.S_OK)
|
||||||
@@ -39,7 +41,7 @@ namespace AssetStudioGUI
|
|||||||
frm.SetFolder(directoryShellItem);
|
frm.SetFolder(directoryShellItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (DefaultFolder != null)
|
if (!string.IsNullOrEmpty(DefaultFolder))
|
||||||
{
|
{
|
||||||
var riid = new Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"); //IShellItem
|
var riid = new Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"); //IShellItem
|
||||||
if (NativeMethods.SHCreateItemFromParsingName(DefaultFolder, IntPtr.Zero, ref riid, out var directoryShellItem) == NativeMethods.S_OK)
|
if (NativeMethods.SHCreateItemFromParsingName(DefaultFolder, IntPtr.Zero, ref riid, out var directoryShellItem) == NativeMethods.S_OK)
|
||||||
|
|||||||
@@ -7,19 +7,19 @@ namespace AssetStudioGUI
|
|||||||
{
|
{
|
||||||
internal class TypeTreeItem : ListViewItem
|
internal class TypeTreeItem : ListViewItem
|
||||||
{
|
{
|
||||||
private List<TypeTreeNode> m_Nodes;
|
private TypeTree m_Type;
|
||||||
|
|
||||||
public TypeTreeItem(int typeID, List<TypeTreeNode> m_Nodes)
|
public TypeTreeItem(int typeID, TypeTree m_Type)
|
||||||
{
|
{
|
||||||
this.m_Nodes = m_Nodes;
|
this.m_Type = m_Type;
|
||||||
Text = m_Nodes[0].m_Type + " " + m_Nodes[0].m_Name;
|
Text = m_Type.m_Nodes[0].m_Type + " " + m_Type.m_Nodes[0].m_Name;
|
||||||
SubItems.Add(typeID.ToString());
|
SubItems.Add(typeID.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
foreach (var i in m_Nodes)
|
foreach (var i in m_Type.m_Nodes)
|
||||||
{
|
{
|
||||||
sb.AppendFormat("{0}{1} {2} {3} {4}\r\n", new string('\t', i.m_Level), i.m_Type, i.m_Name, i.m_ByteSize, (i.m_MetaFlag & 0x4000) != 0);
|
sb.AppendFormat("{0}{1} {2} {3} {4}\r\n", new string('\t', i.m_Level), i.m_Type, i.m_Name, i.m_ByteSize, (i.m_MetaFlag & 0x4000) != 0);
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+36
-17
@@ -28,6 +28,7 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent()
|
private void InitializeComponent()
|
||||||
{
|
{
|
||||||
|
this.components = new System.ComponentModel.Container();
|
||||||
this.OKbutton = new System.Windows.Forms.Button();
|
this.OKbutton = new System.Windows.Forms.Button();
|
||||||
this.Cancel = new System.Windows.Forms.Button();
|
this.Cancel = new System.Windows.Forms.Button();
|
||||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||||
@@ -43,6 +44,7 @@
|
|||||||
this.tobmp = new System.Windows.Forms.RadioButton();
|
this.tobmp = new System.Windows.Forms.RadioButton();
|
||||||
this.converttexture = new System.Windows.Forms.CheckBox();
|
this.converttexture = new System.Windows.Forms.CheckBox();
|
||||||
this.groupBox2 = new System.Windows.Forms.GroupBox();
|
this.groupBox2 = new System.Windows.Forms.GroupBox();
|
||||||
|
this.exportAllUvsAsDiffuseMaps = new System.Windows.Forms.CheckBox();
|
||||||
this.exportBlendShape = new System.Windows.Forms.CheckBox();
|
this.exportBlendShape = new System.Windows.Forms.CheckBox();
|
||||||
this.exportAnimations = new System.Windows.Forms.CheckBox();
|
this.exportAnimations = new System.Windows.Forms.CheckBox();
|
||||||
this.scaleFactor = new System.Windows.Forms.NumericUpDown();
|
this.scaleFactor = new System.Windows.Forms.NumericUpDown();
|
||||||
@@ -59,6 +61,7 @@
|
|||||||
this.castToBone = new System.Windows.Forms.CheckBox();
|
this.castToBone = new System.Windows.Forms.CheckBox();
|
||||||
this.exportAllNodes = new System.Windows.Forms.CheckBox();
|
this.exportAllNodes = new System.Windows.Forms.CheckBox();
|
||||||
this.eulerFilter = new System.Windows.Forms.CheckBox();
|
this.eulerFilter = new System.Windows.Forms.CheckBox();
|
||||||
|
this.exportUvsTooltip = new System.Windows.Forms.ToolTip(this.components);
|
||||||
this.groupBox1.SuspendLayout();
|
this.groupBox1.SuspendLayout();
|
||||||
this.panel1.SuspendLayout();
|
this.panel1.SuspendLayout();
|
||||||
this.groupBox2.SuspendLayout();
|
this.groupBox2.SuspendLayout();
|
||||||
@@ -69,7 +72,7 @@
|
|||||||
//
|
//
|
||||||
// OKbutton
|
// OKbutton
|
||||||
//
|
//
|
||||||
this.OKbutton.Location = new System.Drawing.Point(308, 320);
|
this.OKbutton.Location = new System.Drawing.Point(318, 351);
|
||||||
this.OKbutton.Name = "OKbutton";
|
this.OKbutton.Name = "OKbutton";
|
||||||
this.OKbutton.Size = new System.Drawing.Size(75, 21);
|
this.OKbutton.Size = new System.Drawing.Size(75, 21);
|
||||||
this.OKbutton.TabIndex = 6;
|
this.OKbutton.TabIndex = 6;
|
||||||
@@ -80,7 +83,7 @@
|
|||||||
// Cancel
|
// Cancel
|
||||||
//
|
//
|
||||||
this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
this.Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||||
this.Cancel.Location = new System.Drawing.Point(389, 320);
|
this.Cancel.Location = new System.Drawing.Point(399, 351);
|
||||||
this.Cancel.Name = "Cancel";
|
this.Cancel.Name = "Cancel";
|
||||||
this.Cancel.Size = new System.Drawing.Size(75, 21);
|
this.Cancel.Size = new System.Drawing.Size(75, 21);
|
||||||
this.Cancel.TabIndex = 7;
|
this.Cancel.TabIndex = 7;
|
||||||
@@ -100,7 +103,7 @@
|
|||||||
this.groupBox1.Controls.Add(this.converttexture);
|
this.groupBox1.Controls.Add(this.converttexture);
|
||||||
this.groupBox1.Location = new System.Drawing.Point(12, 12);
|
this.groupBox1.Location = new System.Drawing.Point(12, 12);
|
||||||
this.groupBox1.Name = "groupBox1";
|
this.groupBox1.Name = "groupBox1";
|
||||||
this.groupBox1.Size = new System.Drawing.Size(232, 302);
|
this.groupBox1.Size = new System.Drawing.Size(232, 334);
|
||||||
this.groupBox1.TabIndex = 9;
|
this.groupBox1.TabIndex = 9;
|
||||||
this.groupBox1.TabStop = false;
|
this.groupBox1.TabStop = false;
|
||||||
this.groupBox1.Text = "Export";
|
this.groupBox1.Text = "Export";
|
||||||
@@ -182,7 +185,7 @@
|
|||||||
this.totga.Name = "totga";
|
this.totga.Name = "totga";
|
||||||
this.totga.Size = new System.Drawing.Size(41, 16);
|
this.totga.Size = new System.Drawing.Size(41, 16);
|
||||||
this.totga.TabIndex = 2;
|
this.totga.TabIndex = 2;
|
||||||
this.totga.Text = "TGA";
|
this.totga.Text = "Tga";
|
||||||
this.totga.UseVisualStyleBackColor = true;
|
this.totga.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// tojpg
|
// tojpg
|
||||||
@@ -192,7 +195,7 @@
|
|||||||
this.tojpg.Name = "tojpg";
|
this.tojpg.Name = "tojpg";
|
||||||
this.tojpg.Size = new System.Drawing.Size(47, 16);
|
this.tojpg.Size = new System.Drawing.Size(47, 16);
|
||||||
this.tojpg.TabIndex = 4;
|
this.tojpg.TabIndex = 4;
|
||||||
this.tojpg.Text = "JPEG";
|
this.tojpg.Text = "Jpeg";
|
||||||
this.tojpg.UseVisualStyleBackColor = true;
|
this.tojpg.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// topng
|
// topng
|
||||||
@@ -204,7 +207,7 @@
|
|||||||
this.topng.Size = new System.Drawing.Size(41, 16);
|
this.topng.Size = new System.Drawing.Size(41, 16);
|
||||||
this.topng.TabIndex = 3;
|
this.topng.TabIndex = 3;
|
||||||
this.topng.TabStop = true;
|
this.topng.TabStop = true;
|
||||||
this.topng.Text = "PNG";
|
this.topng.Text = "Png";
|
||||||
this.topng.UseVisualStyleBackColor = true;
|
this.topng.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// tobmp
|
// tobmp
|
||||||
@@ -214,7 +217,7 @@
|
|||||||
this.tobmp.Name = "tobmp";
|
this.tobmp.Name = "tobmp";
|
||||||
this.tobmp.Size = new System.Drawing.Size(41, 16);
|
this.tobmp.Size = new System.Drawing.Size(41, 16);
|
||||||
this.tobmp.TabIndex = 2;
|
this.tobmp.TabIndex = 2;
|
||||||
this.tobmp.Text = "BMP";
|
this.tobmp.Text = "Bmp";
|
||||||
this.tobmp.UseVisualStyleBackColor = true;
|
this.tobmp.UseVisualStyleBackColor = true;
|
||||||
//
|
//
|
||||||
// converttexture
|
// converttexture
|
||||||
@@ -232,6 +235,7 @@
|
|||||||
// groupBox2
|
// groupBox2
|
||||||
//
|
//
|
||||||
this.groupBox2.AutoSize = true;
|
this.groupBox2.AutoSize = true;
|
||||||
|
this.groupBox2.Controls.Add(this.exportAllUvsAsDiffuseMaps);
|
||||||
this.groupBox2.Controls.Add(this.exportBlendShape);
|
this.groupBox2.Controls.Add(this.exportBlendShape);
|
||||||
this.groupBox2.Controls.Add(this.exportAnimations);
|
this.groupBox2.Controls.Add(this.exportAnimations);
|
||||||
this.groupBox2.Controls.Add(this.scaleFactor);
|
this.groupBox2.Controls.Add(this.scaleFactor);
|
||||||
@@ -250,11 +254,24 @@
|
|||||||
this.groupBox2.Controls.Add(this.eulerFilter);
|
this.groupBox2.Controls.Add(this.eulerFilter);
|
||||||
this.groupBox2.Location = new System.Drawing.Point(250, 12);
|
this.groupBox2.Location = new System.Drawing.Point(250, 12);
|
||||||
this.groupBox2.Name = "groupBox2";
|
this.groupBox2.Name = "groupBox2";
|
||||||
this.groupBox2.Size = new System.Drawing.Size(214, 302);
|
this.groupBox2.Size = new System.Drawing.Size(224, 334);
|
||||||
this.groupBox2.TabIndex = 11;
|
this.groupBox2.TabIndex = 11;
|
||||||
this.groupBox2.TabStop = false;
|
this.groupBox2.TabStop = false;
|
||||||
this.groupBox2.Text = "Fbx";
|
this.groupBox2.Text = "Fbx";
|
||||||
//
|
//
|
||||||
|
// exportAllUvsAsDiffuseMaps
|
||||||
|
//
|
||||||
|
this.exportAllUvsAsDiffuseMaps.AccessibleDescription = "";
|
||||||
|
this.exportAllUvsAsDiffuseMaps.AutoSize = true;
|
||||||
|
this.exportAllUvsAsDiffuseMaps.Location = new System.Drawing.Point(6, 171);
|
||||||
|
this.exportAllUvsAsDiffuseMaps.Name = "exportAllUvsAsDiffuseMaps";
|
||||||
|
this.exportAllUvsAsDiffuseMaps.Size = new System.Drawing.Size(204, 16);
|
||||||
|
this.exportAllUvsAsDiffuseMaps.TabIndex = 23;
|
||||||
|
this.exportAllUvsAsDiffuseMaps.Text = "Export all UVs as diffuse maps";
|
||||||
|
this.exportUvsTooltip.SetToolTip(this.exportAllUvsAsDiffuseMaps, "Unchecked: UV1 exported as normal map. Check this if your export is missing a UV " +
|
||||||
|
"map.");
|
||||||
|
this.exportAllUvsAsDiffuseMaps.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
// exportBlendShape
|
// exportBlendShape
|
||||||
//
|
//
|
||||||
this.exportBlendShape.AutoSize = true;
|
this.exportBlendShape.AutoSize = true;
|
||||||
@@ -287,7 +304,7 @@
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
131072});
|
131072});
|
||||||
this.scaleFactor.Location = new System.Drawing.Point(83, 202);
|
this.scaleFactor.Location = new System.Drawing.Point(83, 224);
|
||||||
this.scaleFactor.Name = "scaleFactor";
|
this.scaleFactor.Name = "scaleFactor";
|
||||||
this.scaleFactor.Size = new System.Drawing.Size(60, 21);
|
this.scaleFactor.Size = new System.Drawing.Size(60, 21);
|
||||||
this.scaleFactor.TabIndex = 20;
|
this.scaleFactor.TabIndex = 20;
|
||||||
@@ -301,7 +318,7 @@
|
|||||||
// label5
|
// label5
|
||||||
//
|
//
|
||||||
this.label5.AutoSize = true;
|
this.label5.AutoSize = true;
|
||||||
this.label5.Location = new System.Drawing.Point(6, 204);
|
this.label5.Location = new System.Drawing.Point(6, 226);
|
||||||
this.label5.Name = "label5";
|
this.label5.Name = "label5";
|
||||||
this.label5.Size = new System.Drawing.Size(71, 12);
|
this.label5.Size = new System.Drawing.Size(71, 12);
|
||||||
this.label5.TabIndex = 19;
|
this.label5.TabIndex = 19;
|
||||||
@@ -314,7 +331,7 @@
|
|||||||
this.fbxFormat.Items.AddRange(new object[] {
|
this.fbxFormat.Items.AddRange(new object[] {
|
||||||
"Binary",
|
"Binary",
|
||||||
"Ascii"});
|
"Ascii"});
|
||||||
this.fbxFormat.Location = new System.Drawing.Point(77, 233);
|
this.fbxFormat.Location = new System.Drawing.Point(77, 254);
|
||||||
this.fbxFormat.Name = "fbxFormat";
|
this.fbxFormat.Name = "fbxFormat";
|
||||||
this.fbxFormat.Size = new System.Drawing.Size(61, 20);
|
this.fbxFormat.Size = new System.Drawing.Size(61, 20);
|
||||||
this.fbxFormat.TabIndex = 18;
|
this.fbxFormat.TabIndex = 18;
|
||||||
@@ -322,7 +339,7 @@
|
|||||||
// label4
|
// label4
|
||||||
//
|
//
|
||||||
this.label4.AutoSize = true;
|
this.label4.AutoSize = true;
|
||||||
this.label4.Location = new System.Drawing.Point(6, 236);
|
this.label4.Location = new System.Drawing.Point(6, 258);
|
||||||
this.label4.Name = "label4";
|
this.label4.Name = "label4";
|
||||||
this.label4.Size = new System.Drawing.Size(59, 12);
|
this.label4.Size = new System.Drawing.Size(59, 12);
|
||||||
this.label4.TabIndex = 17;
|
this.label4.TabIndex = 17;
|
||||||
@@ -339,7 +356,7 @@
|
|||||||
"7.3",
|
"7.3",
|
||||||
"7.4",
|
"7.4",
|
||||||
"7.5"});
|
"7.5"});
|
||||||
this.fbxVersion.Location = new System.Drawing.Point(77, 262);
|
this.fbxVersion.Location = new System.Drawing.Point(77, 284);
|
||||||
this.fbxVersion.Name = "fbxVersion";
|
this.fbxVersion.Name = "fbxVersion";
|
||||||
this.fbxVersion.Size = new System.Drawing.Size(47, 20);
|
this.fbxVersion.Size = new System.Drawing.Size(47, 20);
|
||||||
this.fbxVersion.TabIndex = 16;
|
this.fbxVersion.TabIndex = 16;
|
||||||
@@ -347,7 +364,7 @@
|
|||||||
// label3
|
// label3
|
||||||
//
|
//
|
||||||
this.label3.AutoSize = true;
|
this.label3.AutoSize = true;
|
||||||
this.label3.Location = new System.Drawing.Point(6, 265);
|
this.label3.Location = new System.Drawing.Point(6, 287);
|
||||||
this.label3.Name = "label3";
|
this.label3.Name = "label3";
|
||||||
this.label3.Size = new System.Drawing.Size(65, 12);
|
this.label3.Size = new System.Drawing.Size(65, 12);
|
||||||
this.label3.TabIndex = 15;
|
this.label3.TabIndex = 15;
|
||||||
@@ -355,7 +372,7 @@
|
|||||||
//
|
//
|
||||||
// boneSize
|
// boneSize
|
||||||
//
|
//
|
||||||
this.boneSize.Location = new System.Drawing.Point(65, 175);
|
this.boneSize.Location = new System.Drawing.Point(65, 197);
|
||||||
this.boneSize.Name = "boneSize";
|
this.boneSize.Name = "boneSize";
|
||||||
this.boneSize.Size = new System.Drawing.Size(46, 21);
|
this.boneSize.Size = new System.Drawing.Size(46, 21);
|
||||||
this.boneSize.TabIndex = 11;
|
this.boneSize.TabIndex = 11;
|
||||||
@@ -368,7 +385,7 @@
|
|||||||
// label2
|
// label2
|
||||||
//
|
//
|
||||||
this.label2.AutoSize = true;
|
this.label2.AutoSize = true;
|
||||||
this.label2.Location = new System.Drawing.Point(6, 177);
|
this.label2.Location = new System.Drawing.Point(6, 199);
|
||||||
this.label2.Name = "label2";
|
this.label2.Name = "label2";
|
||||||
this.label2.Size = new System.Drawing.Size(53, 12);
|
this.label2.Size = new System.Drawing.Size(53, 12);
|
||||||
this.label2.TabIndex = 10;
|
this.label2.TabIndex = 10;
|
||||||
@@ -453,7 +470,7 @@
|
|||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
this.CancelButton = this.Cancel;
|
this.CancelButton = this.Cancel;
|
||||||
this.ClientSize = new System.Drawing.Size(477, 351);
|
this.ClientSize = new System.Drawing.Size(486, 384);
|
||||||
this.Controls.Add(this.groupBox2);
|
this.Controls.Add(this.groupBox2);
|
||||||
this.Controls.Add(this.groupBox1);
|
this.Controls.Add(this.groupBox1);
|
||||||
this.Controls.Add(this.Cancel);
|
this.Controls.Add(this.Cancel);
|
||||||
@@ -512,5 +529,7 @@
|
|||||||
private System.Windows.Forms.Label label6;
|
private System.Windows.Forms.Label label6;
|
||||||
private System.Windows.Forms.CheckBox restoreExtensionName;
|
private System.Windows.Forms.CheckBox restoreExtensionName;
|
||||||
private System.Windows.Forms.CheckBox openAfterExport;
|
private System.Windows.Forms.CheckBox openAfterExport;
|
||||||
|
private System.Windows.Forms.CheckBox exportAllUvsAsDiffuseMaps;
|
||||||
|
private System.Windows.Forms.ToolTip exportUvsTooltip;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,5 @@
|
|||||||
using System;
|
using AssetStudio;
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Data;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace AssetStudioGUI
|
namespace AssetStudioGUI
|
||||||
@@ -19,7 +13,7 @@ namespace AssetStudioGUI
|
|||||||
restoreExtensionName.Checked = Properties.Settings.Default.restoreExtensionName;
|
restoreExtensionName.Checked = Properties.Settings.Default.restoreExtensionName;
|
||||||
converttexture.Checked = Properties.Settings.Default.convertTexture;
|
converttexture.Checked = Properties.Settings.Default.convertTexture;
|
||||||
convertAudio.Checked = Properties.Settings.Default.convertAudio;
|
convertAudio.Checked = Properties.Settings.Default.convertAudio;
|
||||||
var str = Properties.Settings.Default.convertType;
|
var str = Properties.Settings.Default.convertType.ToString();
|
||||||
foreach (Control c in panel1.Controls)
|
foreach (Control c in panel1.Controls)
|
||||||
{
|
{
|
||||||
if (c.Text == str)
|
if (c.Text == str)
|
||||||
@@ -36,10 +30,12 @@ namespace AssetStudioGUI
|
|||||||
exportAnimations.Checked = Properties.Settings.Default.exportAnimations;
|
exportAnimations.Checked = Properties.Settings.Default.exportAnimations;
|
||||||
exportBlendShape.Checked = Properties.Settings.Default.exportBlendShape;
|
exportBlendShape.Checked = Properties.Settings.Default.exportBlendShape;
|
||||||
castToBone.Checked = Properties.Settings.Default.castToBone;
|
castToBone.Checked = Properties.Settings.Default.castToBone;
|
||||||
|
exportAllUvsAsDiffuseMaps.Checked = Properties.Settings.Default.exportAllUvsAsDiffuseMaps;
|
||||||
boneSize.Value = Properties.Settings.Default.boneSize;
|
boneSize.Value = Properties.Settings.Default.boneSize;
|
||||||
scaleFactor.Value = Properties.Settings.Default.scaleFactor;
|
scaleFactor.Value = Properties.Settings.Default.scaleFactor;
|
||||||
fbxVersion.SelectedIndex = Properties.Settings.Default.fbxVersion;
|
fbxVersion.SelectedIndex = Properties.Settings.Default.fbxVersion;
|
||||||
fbxFormat.SelectedIndex = Properties.Settings.Default.fbxFormat;
|
fbxFormat.SelectedIndex = Properties.Settings.Default.fbxFormat;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OKbutton_Click(object sender, EventArgs e)
|
private void OKbutton_Click(object sender, EventArgs e)
|
||||||
@@ -52,7 +48,7 @@ namespace AssetStudioGUI
|
|||||||
{
|
{
|
||||||
if (((RadioButton)c).Checked)
|
if (((RadioButton)c).Checked)
|
||||||
{
|
{
|
||||||
Properties.Settings.Default.convertType = c.Text;
|
Properties.Settings.Default.convertType = (ImageFormat)Enum.Parse(typeof(ImageFormat), c.Text);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,6 +60,7 @@ namespace AssetStudioGUI
|
|||||||
Properties.Settings.Default.exportAnimations = exportAnimations.Checked;
|
Properties.Settings.Default.exportAnimations = exportAnimations.Checked;
|
||||||
Properties.Settings.Default.exportBlendShape = exportBlendShape.Checked;
|
Properties.Settings.Default.exportBlendShape = exportBlendShape.Checked;
|
||||||
Properties.Settings.Default.castToBone = castToBone.Checked;
|
Properties.Settings.Default.castToBone = castToBone.Checked;
|
||||||
|
Properties.Settings.Default.exportAllUvsAsDiffuseMaps = exportAllUvsAsDiffuseMaps.Checked;
|
||||||
Properties.Settings.Default.boneSize = boneSize.Value;
|
Properties.Settings.Default.boneSize = boneSize.Value;
|
||||||
Properties.Settings.Default.scaleFactor = scaleFactor.Value;
|
Properties.Settings.Default.scaleFactor = scaleFactor.Value;
|
||||||
Properties.Settings.Default.fbxVersion = fbxVersion.SelectedIndex;
|
Properties.Settings.Default.fbxVersion = fbxVersion.SelectedIndex;
|
||||||
@@ -78,5 +75,6 @@ namespace AssetStudioGUI
|
|||||||
DialogResult = DialogResult.Cancel;
|
DialogResult = DialogResult.Cancel;
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,4 +117,7 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
|
<metadata name="exportUvsTooltip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>17, 17</value>
|
||||||
|
</metadata>
|
||||||
</root>
|
</root>
|
||||||
+90
-124
@@ -1,60 +1,36 @@
|
|||||||
using System.Collections.Generic;
|
using AssetStudio;
|
||||||
using System.Drawing.Imaging;
|
using Newtonsoft.Json;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using AssetStudio;
|
|
||||||
using TGASharpLib;
|
|
||||||
|
|
||||||
namespace AssetStudioGUI
|
namespace AssetStudioGUI
|
||||||
{
|
{
|
||||||
internal static class Exporter
|
internal static class Exporter
|
||||||
{
|
{
|
||||||
public static bool ExportTexture2D(AssetItem item, string exportPathName)
|
public static bool ExportTexture2D(AssetItem item, string exportPath)
|
||||||
{
|
{
|
||||||
var m_Texture2D = (Texture2D)item.Asset;
|
var m_Texture2D = (Texture2D)item.Asset;
|
||||||
if (Properties.Settings.Default.convertTexture)
|
if (Properties.Settings.Default.convertTexture)
|
||||||
{
|
{
|
||||||
var bitmap = m_Texture2D.ConvertToBitmap(true);
|
var type = Properties.Settings.Default.convertType;
|
||||||
if (bitmap == null)
|
if (!TryExportFile(exportPath, item, "." + type.ToString().ToLower(), out var exportFullPath))
|
||||||
return false;
|
return false;
|
||||||
ImageFormat format = null;
|
var stream = m_Texture2D.ConvertToStream(type, true);
|
||||||
var ext = Properties.Settings.Default.convertType;
|
if (stream == null)
|
||||||
bool tga = false;
|
|
||||||
switch (ext)
|
|
||||||
{
|
|
||||||
case "BMP":
|
|
||||||
format = ImageFormat.Bmp;
|
|
||||||
break;
|
|
||||||
case "PNG":
|
|
||||||
format = ImageFormat.Png;
|
|
||||||
break;
|
|
||||||
case "JPEG":
|
|
||||||
format = ImageFormat.Jpeg;
|
|
||||||
break;
|
|
||||||
case "TGA":
|
|
||||||
tga = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
var exportFullName = exportPathName + item.Text + "." + ext.ToLower();
|
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
if (tga)
|
using (stream)
|
||||||
{
|
{
|
||||||
var file = new TGA(bitmap);
|
File.WriteAllBytes(exportFullPath, stream.ToArray());
|
||||||
file.Save(exportFullName);
|
return true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
bitmap.Save(exportFullName, format);
|
|
||||||
bitmap.Dispose();
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var exportFullName = exportPathName + item.Text + ".tex";
|
if (!TryExportFile(exportPath, item, ".tex", out var exportFullPath))
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
File.WriteAllBytes(exportFullName, m_Texture2D.image_data.GetData());
|
File.WriteAllBytes(exportFullPath, m_Texture2D.image_data.GetData());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,44 +44,29 @@ namespace AssetStudioGUI
|
|||||||
var converter = new AudioClipConverter(m_AudioClip);
|
var converter = new AudioClipConverter(m_AudioClip);
|
||||||
if (Properties.Settings.Default.convertAudio && converter.IsSupport)
|
if (Properties.Settings.Default.convertAudio && converter.IsSupport)
|
||||||
{
|
{
|
||||||
var exportFullName = exportPath + item.Text + ".wav";
|
if (!TryExportFile(exportPath, item, ".wav", out var exportFullPath))
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
var buffer = converter.ConvertToWav();
|
var buffer = converter.ConvertToWav();
|
||||||
if (buffer == null)
|
if (buffer == null)
|
||||||
return false;
|
return false;
|
||||||
File.WriteAllBytes(exportFullName, buffer);
|
File.WriteAllBytes(exportFullPath, buffer);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var exportFullName = exportPath + item.Text + converter.GetExtensionName();
|
if (!TryExportFile(exportPath, item, converter.GetExtensionName(), out var exportFullPath))
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
File.WriteAllBytes(exportFullName, m_AudioData);
|
File.WriteAllBytes(exportFullPath, m_AudioData);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool ExportShader(AssetItem item, string exportPath)
|
public static bool ExportShader(AssetItem item, string exportPath)
|
||||||
{
|
{
|
||||||
var exportFullName = exportPath + item.Text + ".shader";
|
if (!TryExportFile(exportPath, item, ".shader", out var exportFullPath))
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
var m_Shader = (Shader)item.Asset;
|
var m_Shader = (Shader)item.Asset;
|
||||||
if (m_Shader.compressedBlob != null) //5.5 and up
|
var str = m_Shader.Convert();
|
||||||
{
|
File.WriteAllText(exportFullPath, str);
|
||||||
var strs = ShaderConverter.ConvertMultiple(m_Shader);
|
|
||||||
for (int i = 0; i < strs.Length; i++)
|
|
||||||
{
|
|
||||||
var platformName = ShaderConverter.GetPlatformString(m_Shader.platforms[i]);
|
|
||||||
File.WriteAllText($"{exportPath}{item.Text}_{platformName}.shader", strs[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var str = ShaderConverter.Convert(m_Shader);
|
|
||||||
File.WriteAllText(exportFullName, str);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,21 +81,25 @@ namespace AssetStudioGUI
|
|||||||
extension = Path.GetExtension(item.Container);
|
extension = Path.GetExtension(item.Container);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var exportFullName = exportPath + item.Text + extension;
|
if (!TryExportFile(exportPath, item, extension, out var exportFullPath))
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
File.WriteAllBytes(exportFullName, m_TextAsset.m_Script);
|
File.WriteAllBytes(exportFullPath, m_TextAsset.m_Script);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool ExportMonoBehaviour(AssetItem item, string exportPath)
|
public static bool ExportMonoBehaviour(AssetItem item, string exportPath)
|
||||||
{
|
{
|
||||||
var exportFullName = exportPath + item.Text + ".txt";
|
if (!TryExportFile(exportPath, item, ".json", out var exportFullPath))
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
var m_MonoBehaviour = (MonoBehaviour)item.Asset;
|
var m_MonoBehaviour = (MonoBehaviour)item.Asset;
|
||||||
var str = m_MonoBehaviour.Dump() ?? Studio.GetScriptString(item.Asset.reader);
|
var type = m_MonoBehaviour.ToType();
|
||||||
File.WriteAllText(exportFullName, str);
|
if (type == null)
|
||||||
|
{
|
||||||
|
var m_Type = Studio.MonoBehaviourToTypeTree(m_MonoBehaviour);
|
||||||
|
type = m_MonoBehaviour.ToType(m_Type);
|
||||||
|
}
|
||||||
|
var str = JsonConvert.SerializeObject(type, Formatting.Indented);
|
||||||
|
File.WriteAllText(exportFullPath, str);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,10 +113,9 @@ namespace AssetStudioGUI
|
|||||||
{
|
{
|
||||||
extension = ".otf";
|
extension = ".otf";
|
||||||
}
|
}
|
||||||
var exportFullName = exportPath + item.Text + extension;
|
if (!TryExportFile(exportPath, item, extension, out var exportFullPath))
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
File.WriteAllBytes(exportFullName, m_Font.m_FontData);
|
File.WriteAllBytes(exportFullPath, m_Font.m_FontData);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -162,8 +126,7 @@ namespace AssetStudioGUI
|
|||||||
var m_Mesh = (Mesh)item.Asset;
|
var m_Mesh = (Mesh)item.Asset;
|
||||||
if (m_Mesh.m_VertexCount <= 0)
|
if (m_Mesh.m_VertexCount <= 0)
|
||||||
return false;
|
return false;
|
||||||
var exportFullName = exportPath + item.Text + ".obj";
|
if (!TryExportFile(exportPath, item, ".obj", out var exportFullPath))
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
sb.AppendLine("g " + m_Mesh.m_Name);
|
sb.AppendLine("g " + m_Mesh.m_Name);
|
||||||
@@ -235,20 +198,18 @@ namespace AssetStudioGUI
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
sb.Replace("NaN", "0");
|
sb.Replace("NaN", "0");
|
||||||
File.WriteAllText(exportFullName, sb.ToString());
|
File.WriteAllText(exportFullPath, sb.ToString());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool ExportVideoClip(AssetItem item, string exportPath)
|
public static bool ExportVideoClip(AssetItem item, string exportPath)
|
||||||
{
|
{
|
||||||
var m_VideoClip = (VideoClip)item.Asset;
|
var m_VideoClip = (VideoClip)item.Asset;
|
||||||
var m_VideoData = m_VideoClip.m_VideoData.GetData();
|
if (m_VideoClip.m_ExternalResources.m_Size > 0)
|
||||||
if (m_VideoData != null && m_VideoData.Length != 0)
|
|
||||||
{
|
{
|
||||||
var exportFullName = exportPath + item.Text + Path.GetExtension(m_VideoClip.m_OriginalPath);
|
if (!TryExportFile(exportPath, item, Path.GetExtension(m_VideoClip.m_OriginalPath), out var exportFullPath))
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
File.WriteAllBytes(exportFullName, m_VideoData);
|
m_VideoClip.m_VideoData.WriteData(exportFullPath);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -257,91 +218,85 @@ namespace AssetStudioGUI
|
|||||||
public static bool ExportMovieTexture(AssetItem item, string exportPath)
|
public static bool ExportMovieTexture(AssetItem item, string exportPath)
|
||||||
{
|
{
|
||||||
var m_MovieTexture = (MovieTexture)item.Asset;
|
var m_MovieTexture = (MovieTexture)item.Asset;
|
||||||
var exportFullName = exportPath + item.Text + ".ogv";
|
if (!TryExportFile(exportPath, item, ".ogv", out var exportFullPath))
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
File.WriteAllBytes(exportFullName, m_MovieTexture.m_MovieData);
|
File.WriteAllBytes(exportFullPath, m_MovieTexture.m_MovieData);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool ExportSprite(AssetItem item, string exportPath)
|
public static bool ExportSprite(AssetItem item, string exportPath)
|
||||||
{
|
{
|
||||||
ImageFormat format = null;
|
|
||||||
var type = Properties.Settings.Default.convertType;
|
var type = Properties.Settings.Default.convertType;
|
||||||
bool tga = false;
|
if (!TryExportFile(exportPath, item, "." + type.ToString().ToLower(), out var exportFullPath))
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case "BMP":
|
|
||||||
format = ImageFormat.Bmp;
|
|
||||||
break;
|
|
||||||
case "PNG":
|
|
||||||
format = ImageFormat.Png;
|
|
||||||
break;
|
|
||||||
case "JPEG":
|
|
||||||
format = ImageFormat.Jpeg;
|
|
||||||
break;
|
|
||||||
case "TGA":
|
|
||||||
tga = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
var exportFullName = exportPath + item.Text + "." + type.ToLower();
|
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
var bitmap = ((Sprite)item.Asset).GetImage();
|
var stream = ((Sprite)item.Asset).GetImage(type);
|
||||||
if (bitmap != null)
|
if (stream != null)
|
||||||
{
|
{
|
||||||
if (tga)
|
using (stream)
|
||||||
{
|
{
|
||||||
var file = new TGA(bitmap);
|
File.WriteAllBytes(exportFullPath, stream.ToArray());
|
||||||
file.Save(exportFullName);
|
return true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
bitmap.Save(exportFullName, format);
|
|
||||||
bitmap.Dispose();
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool ExportRawFile(AssetItem item, string exportPath)
|
public static bool ExportRawFile(AssetItem item, string exportPath)
|
||||||
{
|
{
|
||||||
var exportFullName = exportPath + item.Text + ".dat";
|
if (!TryExportFile(exportPath, item, ".dat", out var exportFullPath))
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
File.WriteAllBytes(exportFullName, item.Asset.GetRawData());
|
File.WriteAllBytes(exportFullPath, item.Asset.GetRawData());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool ExportFileExists(string filename)
|
private static bool TryExportFile(string dir, AssetItem item, string extension, out string fullPath)
|
||||||
{
|
{
|
||||||
if (File.Exists(filename))
|
var fileName = FixFileName(item.Text);
|
||||||
|
fullPath = Path.Combine(dir, fileName + extension);
|
||||||
|
if (!File.Exists(fullPath))
|
||||||
{
|
{
|
||||||
|
Directory.CreateDirectory(dir);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
fullPath = Path.Combine(dir, fileName + item.UniqueID + extension);
|
||||||
|
if (!File.Exists(fullPath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(dir);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
Directory.CreateDirectory(Path.GetDirectoryName(filename));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool ExportAnimator(AssetItem item, string exportPath, List<AssetItem> animationList = null)
|
public static bool ExportAnimator(AssetItem item, string exportPath, List<AssetItem> animationList = null)
|
||||||
{
|
{
|
||||||
|
var exportFullPath = Path.Combine(exportPath, item.Text, item.Text + ".fbx");
|
||||||
|
if (File.Exists(exportFullPath))
|
||||||
|
{
|
||||||
|
exportFullPath = Path.Combine(exportPath, item.Text + item.UniqueID, item.Text + ".fbx");
|
||||||
|
}
|
||||||
var m_Animator = (Animator)item.Asset;
|
var m_Animator = (Animator)item.Asset;
|
||||||
var convert = animationList != null ? new ModelConverter(m_Animator, animationList.Select(x => (AnimationClip)x.Asset).ToArray()) : new ModelConverter(m_Animator);
|
var convert = animationList != null
|
||||||
exportPath = $"{exportPath}{item.Text}\\{item.Text}.fbx";
|
? new ModelConverter(m_Animator, Properties.Settings.Default.convertType, animationList.Select(x => (AnimationClip)x.Asset).ToArray())
|
||||||
ExportFbx(convert, exportPath);
|
: new ModelConverter(m_Animator, Properties.Settings.Default.convertType);
|
||||||
|
ExportFbx(convert, exportFullPath);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ExportGameObject(GameObject gameObject, string exportPath, List<AssetItem> animationList = null)
|
public static void ExportGameObject(GameObject gameObject, string exportPath, List<AssetItem> animationList = null)
|
||||||
{
|
{
|
||||||
var convert = animationList != null ? new ModelConverter(gameObject, animationList.Select(x => (AnimationClip)x.Asset).ToArray()) : new ModelConverter(gameObject);
|
var convert = animationList != null
|
||||||
exportPath = exportPath + Studio.FixFileName(gameObject.m_Name) + ".fbx";
|
? new ModelConverter(gameObject, Properties.Settings.Default.convertType, animationList.Select(x => (AnimationClip)x.Asset).ToArray())
|
||||||
|
: new ModelConverter(gameObject, Properties.Settings.Default.convertType);
|
||||||
|
exportPath = exportPath + FixFileName(gameObject.m_Name) + ".fbx";
|
||||||
ExportFbx(convert, exportPath);
|
ExportFbx(convert, exportPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void ExportGameObjectMerge(List<GameObject> gameObject, string exportPath, List<AssetItem> animationList = null)
|
public static void ExportGameObjectMerge(List<GameObject> gameObject, string exportPath, List<AssetItem> animationList = null)
|
||||||
{
|
{
|
||||||
var rootName = Path.GetFileNameWithoutExtension(exportPath);
|
var rootName = Path.GetFileNameWithoutExtension(exportPath);
|
||||||
var convert = animationList != null ? new ModelConverter(rootName, gameObject, animationList.Select(x => (AnimationClip)x.Asset).ToArray()) : new ModelConverter(rootName, gameObject);
|
var convert = animationList != null
|
||||||
|
? new ModelConverter(rootName, gameObject, Properties.Settings.Default.convertType, animationList.Select(x => (AnimationClip)x.Asset).ToArray())
|
||||||
|
: new ModelConverter(rootName, gameObject, Properties.Settings.Default.convertType);
|
||||||
ExportFbx(convert, exportPath);
|
ExportFbx(convert, exportPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -355,22 +310,27 @@ namespace AssetStudioGUI
|
|||||||
var exportBlendShape = Properties.Settings.Default.exportBlendShape;
|
var exportBlendShape = Properties.Settings.Default.exportBlendShape;
|
||||||
var castToBone = Properties.Settings.Default.castToBone;
|
var castToBone = Properties.Settings.Default.castToBone;
|
||||||
var boneSize = (int)Properties.Settings.Default.boneSize;
|
var boneSize = (int)Properties.Settings.Default.boneSize;
|
||||||
|
var exportAllUvsAsDiffuseMaps = Properties.Settings.Default.exportAllUvsAsDiffuseMaps;
|
||||||
var scaleFactor = (float)Properties.Settings.Default.scaleFactor;
|
var scaleFactor = (float)Properties.Settings.Default.scaleFactor;
|
||||||
var fbxVersion = Properties.Settings.Default.fbxVersion;
|
var fbxVersion = Properties.Settings.Default.fbxVersion;
|
||||||
var fbxFormat = Properties.Settings.Default.fbxFormat;
|
var fbxFormat = Properties.Settings.Default.fbxFormat;
|
||||||
ModelExporter.ExportFbx(exportPath, convert, eulerFilter, filterPrecision,
|
ModelExporter.ExportFbx(exportPath, convert, eulerFilter, filterPrecision,
|
||||||
exportAllNodes, exportSkins, exportAnimations, exportBlendShape, castToBone, boneSize, scaleFactor, fbxVersion, fbxFormat == 1);
|
exportAllNodes, exportSkins, exportAnimations, exportBlendShape, castToBone, boneSize, exportAllUvsAsDiffuseMaps, scaleFactor, fbxVersion, fbxFormat == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool ExportDumpFile(AssetItem item, string exportPath)
|
public static bool ExportDumpFile(AssetItem item, string exportPath)
|
||||||
{
|
{
|
||||||
var exportFullName = exportPath + item.Text + ".txt";
|
if (!TryExportFile(exportPath, item, ".txt", out var exportFullPath))
|
||||||
if (ExportFileExists(exportFullName))
|
|
||||||
return false;
|
return false;
|
||||||
var str = item.Asset.Dump();
|
var str = item.Asset.Dump();
|
||||||
|
if (str == null && item.Asset is MonoBehaviour m_MonoBehaviour)
|
||||||
|
{
|
||||||
|
var m_Type = Studio.MonoBehaviourToTypeTree(m_MonoBehaviour);
|
||||||
|
str = m_MonoBehaviour.Dump(m_Type);
|
||||||
|
}
|
||||||
if (str != null)
|
if (str != null)
|
||||||
{
|
{
|
||||||
File.WriteAllText(exportFullName, str);
|
File.WriteAllText(exportFullPath, str);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -408,5 +368,11 @@ namespace AssetStudioGUI
|
|||||||
return ExportRawFile(item, exportPath);
|
return ExportRawFile(item, exportPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string FixFileName(string str)
|
||||||
|
{
|
||||||
|
if (str.Length >= 260) return Path.GetRandomFileName();
|
||||||
|
return Path.GetInvalidFileNameChars().Aggregate(str, (current, c) => current.Replace(c, '_'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
using System;
|
using AssetStudio;
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
using System.Linq;
|
using System.Windows.Forms;
|
||||||
using System.Text;
|
|
||||||
using AssetStudio;
|
|
||||||
|
|
||||||
namespace AssetStudioGUI
|
namespace AssetStudioGUI
|
||||||
{
|
{
|
||||||
class GUILogger : ILogger
|
class GUILogger : ILogger
|
||||||
{
|
{
|
||||||
|
public bool ShowErrorMessage = true;
|
||||||
private Action<string> action;
|
private Action<string> action;
|
||||||
|
|
||||||
public GUILogger(Action<string> action)
|
public GUILogger(Action<string> action)
|
||||||
@@ -17,7 +16,19 @@ namespace AssetStudioGUI
|
|||||||
|
|
||||||
public void Log(LoggerEvent loggerEvent, string message)
|
public void Log(LoggerEvent loggerEvent, string message)
|
||||||
{
|
{
|
||||||
action(message);
|
switch (loggerEvent)
|
||||||
|
{
|
||||||
|
case LoggerEvent.Error:
|
||||||
|
if (ShowErrorMessage)
|
||||||
|
{
|
||||||
|
MessageBox.Show(message);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
action(message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1,25 +0,0 @@
|
|||||||
<configuration>
|
|
||||||
<dllmap os="linux" dll="opengl32.dll" target="libGL.so.1"/>
|
|
||||||
<dllmap os="linux" dll="glu32.dll" target="libGLU.so.1"/>
|
|
||||||
<dllmap os="linux" dll="openal32.dll" target="libopenal.so.1"/>
|
|
||||||
<dllmap os="linux" dll="alut.dll" target="libalut.so.0"/>
|
|
||||||
<dllmap os="linux" dll="opencl.dll" target="libOpenCL.so"/>
|
|
||||||
<dllmap os="linux" dll="libX11" target="libX11.so.6"/>
|
|
||||||
<dllmap os="linux" dll="libXi" target="libXi.so.6"/>
|
|
||||||
<dllmap os="linux" dll="SDL2.dll" target="libSDL2-2.0.so.0"/>
|
|
||||||
<dllmap os="osx" dll="opengl32.dll" target="/System/Library/Frameworks/OpenGL.framework/OpenGL"/>
|
|
||||||
<dllmap os="osx" dll="openal32.dll" target="/System/Library/Frameworks/OpenAL.framework/OpenAL" />
|
|
||||||
<dllmap os="osx" dll="alut.dll" target="/System/Library/Frameworks/OpenAL.framework/OpenAL" />
|
|
||||||
<dllmap os="osx" dll="libGLES.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
|
|
||||||
<dllmap os="osx" dll="libGLESv1_CM.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
|
|
||||||
<dllmap os="osx" dll="libGLESv2.dll" target="/System/Library/Frameworks/OpenGLES.framework/OpenGLES" />
|
|
||||||
<dllmap os="osx" dll="opencl.dll" target="/System/Library/Frameworks/OpenCL.framework/OpenCL"/>
|
|
||||||
<dllmap os="osx" dll="SDL2.dll" target="libSDL2.dylib"/>
|
|
||||||
<!-- XQuartz compatibility (X11 on Mac) -->
|
|
||||||
<dllmap os="osx" dll="libGL.so.1" target="/usr/X11/lib/libGL.dylib"/>
|
|
||||||
<dllmap os="osx" dll="libX11" target="/usr/X11/lib/libX11.dylib"/>
|
|
||||||
<dllmap os="osx" dll="libXcursor.so.1" target="/usr/X11/lib/libXcursor.dylib"/>
|
|
||||||
<dllmap os="osx" dll="libXi" target="/usr/X11/lib/libXi.dylib"/>
|
|
||||||
<dllmap os="osx" dll="libXinerama" target="/usr/X11/lib/libXinerama.dylib"/>
|
|
||||||
<dllmap os="osx" dll="libXrandr.so.2" target="/usr/X11/lib/libXrandr.dylib"/>
|
|
||||||
</configuration>
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -9,11 +9,14 @@ namespace AssetStudioGUI
|
|||||||
static class Program
|
static class Program
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 应用程序的主入口点。
|
/// The main entry point for the application.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[STAThread]
|
[STAThread]
|
||||||
static void Main()
|
static void Main()
|
||||||
{
|
{
|
||||||
|
#if !NETFRAMEWORK
|
||||||
|
Application.SetHighDpiMode(HighDpiMode.SystemAware);
|
||||||
|
#endif
|
||||||
Application.EnableVisualStyles();
|
Application.EnableVisualStyles();
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
Application.Run(new AssetStudioGUIForm());
|
Application.Run(new AssetStudioGUIForm());
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
using System.Reflection;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
// 有关程序集的一般信息由以下
|
|
||||||
// 控制。更改这些特性值可修改
|
|
||||||
// 与程序集关联的信息。
|
|
||||||
[assembly: AssemblyTitle("AssetStudioGUI")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
|
||||||
[assembly: AssemblyProduct("AssetStudioGUI")]
|
|
||||||
[assembly: AssemblyCopyright("Copyright © Perfare 2018-2020")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
|
|
||||||
// 将 ComVisible 设置为 false 会使此程序集中的类型
|
|
||||||
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
|
|
||||||
//请将此类型的 ComVisible 特性设置为 true。
|
|
||||||
[assembly: ComVisible(false)]
|
|
||||||
|
|
||||||
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
|
|
||||||
[assembly: Guid("52b196fb-4c8a-499b-b877-1a0eb4f33ec0")]
|
|
||||||
|
|
||||||
// 程序集的版本信息由下列四个值组成:
|
|
||||||
//
|
|
||||||
// 主版本
|
|
||||||
// 次版本
|
|
||||||
// 生成号
|
|
||||||
// 修订号
|
|
||||||
//
|
|
||||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
|
|
||||||
//通过使用 "*",如下所示:
|
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
||||||
+2
-2
@@ -47,8 +47,8 @@ namespace AssetStudioGUI.Properties {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 重写当前线程的 CurrentUICulture 属性
|
/// 重写当前线程的 CurrentUICulture 属性,对
|
||||||
/// 重写当前线程的 CurrentUICulture 属性。
|
/// 使用此强类型资源类的所有资源查找执行重写。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
internal static global::System.Globalization.CultureInfo Culture {
|
internal static global::System.Globalization.CultureInfo Culture {
|
||||||
|
|||||||
+16
-4
@@ -12,7 +12,7 @@ namespace AssetStudioGUI.Properties {
|
|||||||
|
|
||||||
|
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.5.0.0")]
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")]
|
||||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||||
|
|
||||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||||
@@ -109,10 +109,10 @@ namespace AssetStudioGUI.Properties {
|
|||||||
|
|
||||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
[global::System.Configuration.DefaultSettingValueAttribute("PNG")]
|
[global::System.Configuration.DefaultSettingValueAttribute("Png")]
|
||||||
public string convertType {
|
public global::AssetStudio.ImageFormat convertType {
|
||||||
get {
|
get {
|
||||||
return ((string)(this["convertType"]));
|
return ((global::AssetStudio.ImageFormat)(this["convertType"]));
|
||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
this["convertType"] = value;
|
this["convertType"] = value;
|
||||||
@@ -262,5 +262,17 @@ namespace AssetStudioGUI.Properties {
|
|||||||
this["restoreExtensionName"] = value;
|
this["restoreExtensionName"] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||||
|
public bool exportAllUvsAsDiffuseMaps {
|
||||||
|
get {
|
||||||
|
return ((bool)(this["exportAllUvsAsDiffuseMaps"]));
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
this["exportAllUvsAsDiffuseMaps"] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,8 +23,8 @@
|
|||||||
<Setting Name="convertAudio" Type="System.Boolean" Scope="User">
|
<Setting Name="convertAudio" Type="System.Boolean" Scope="User">
|
||||||
<Value Profile="(Default)">True</Value>
|
<Value Profile="(Default)">True</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
<Setting Name="convertType" Type="System.String" Scope="User">
|
<Setting Name="convertType" Type="AssetStudio.ImageFormat" Scope="User">
|
||||||
<Value Profile="(Default)">PNG</Value>
|
<Value Profile="(Default)">Png</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
<Setting Name="eulerFilter" Type="System.Boolean" Scope="User">
|
<Setting Name="eulerFilter" Type="System.Boolean" Scope="User">
|
||||||
<Value Profile="(Default)">True</Value>
|
<Value Profile="(Default)">True</Value>
|
||||||
@@ -62,5 +62,8 @@
|
|||||||
<Setting Name="restoreExtensionName" Type="System.Boolean" Scope="User">
|
<Setting Name="restoreExtensionName" Type="System.Boolean" Scope="User">
|
||||||
<Value Profile="(Default)">True</Value>
|
<Value Profile="(Default)">True</Value>
|
||||||
</Setting>
|
</Setting>
|
||||||
|
<Setting Name="exportAllUvsAsDiffuseMaps" Type="System.Boolean" Scope="User">
|
||||||
|
<Value Profile="(Default)">False</Value>
|
||||||
|
</Setting>
|
||||||
</Settings>
|
</Settings>
|
||||||
</SettingsFile>
|
</SettingsFile>
|
||||||
+171
-82
@@ -7,6 +7,7 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using System.Xml.Linq;
|
||||||
using static AssetStudioGUI.Exporter;
|
using static AssetStudioGUI.Exporter;
|
||||||
using Object = AssetStudio.Object;
|
using Object = AssetStudio.Object;
|
||||||
|
|
||||||
@@ -19,58 +20,89 @@ namespace AssetStudioGUI
|
|||||||
Dump
|
Dump
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal enum ExportFilter
|
||||||
|
{
|
||||||
|
All,
|
||||||
|
Selected,
|
||||||
|
Filtered
|
||||||
|
}
|
||||||
|
|
||||||
|
internal enum ExportListType
|
||||||
|
{
|
||||||
|
XML
|
||||||
|
}
|
||||||
|
|
||||||
internal static class Studio
|
internal static class Studio
|
||||||
{
|
{
|
||||||
public static AssetsManager assetsManager = new AssetsManager();
|
public static AssetsManager assetsManager = new AssetsManager();
|
||||||
public static ScriptDumper scriptDumper = new ScriptDumper();
|
public static AssemblyLoader assemblyLoader = new AssemblyLoader();
|
||||||
public static List<AssetItem> exportableAssets = new List<AssetItem>();
|
public static List<AssetItem> exportableAssets = new List<AssetItem>();
|
||||||
public static List<AssetItem> visibleAssets = new List<AssetItem>();
|
public static List<AssetItem> visibleAssets = new List<AssetItem>();
|
||||||
internal static Action<string> StatusStripUpdate = x => { };
|
internal static Action<string> StatusStripUpdate = x => { };
|
||||||
|
|
||||||
public static void ExtractFile(string[] fileNames)
|
public static int ExtractFolder(string path, string savePath)
|
||||||
{
|
{
|
||||||
ThreadPool.QueueUserWorkItem(state =>
|
int extractedCount = 0;
|
||||||
|
Progress.Reset();
|
||||||
|
var files = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
|
||||||
|
for (int i = 0; i < files.Length; i++)
|
||||||
{
|
{
|
||||||
int extractedCount = 0;
|
var file = files[i];
|
||||||
Progress.Reset();
|
var fileOriPath = Path.GetDirectoryName(file);
|
||||||
for (var i = 0; i < fileNames.Length; i++)
|
var fileSavePath = fileOriPath.Replace(path, savePath);
|
||||||
{
|
extractedCount += ExtractFile(file, fileSavePath);
|
||||||
var fileName = fileNames[i];
|
Progress.Report(i + 1, files.Length);
|
||||||
var type = ImportHelper.CheckFileType(fileName, out var reader);
|
}
|
||||||
if (type == FileType.BundleFile)
|
return extractedCount;
|
||||||
extractedCount += ExtractBundleFile(fileName, reader);
|
|
||||||
else if (type == FileType.WebFile)
|
|
||||||
extractedCount += ExtractWebDataFile(fileName, reader);
|
|
||||||
else
|
|
||||||
reader.Dispose();
|
|
||||||
Progress.Report(i + 1, fileNames.Length);
|
|
||||||
}
|
|
||||||
|
|
||||||
StatusStripUpdate($"Finished extracting {extractedCount} files.");
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int ExtractBundleFile(string bundleFileName, EndianBinaryReader reader)
|
public static int ExtractFile(string[] fileNames, string savePath)
|
||||||
{
|
{
|
||||||
StatusStripUpdate($"Decompressing {Path.GetFileName(bundleFileName)} ...");
|
int extractedCount = 0;
|
||||||
var bundleFile = new BundleFile(reader, bundleFileName);
|
Progress.Reset();
|
||||||
|
for (var i = 0; i < fileNames.Length; i++)
|
||||||
|
{
|
||||||
|
var fileName = fileNames[i];
|
||||||
|
extractedCount += ExtractFile(fileName, savePath);
|
||||||
|
Progress.Report(i + 1, fileNames.Length);
|
||||||
|
}
|
||||||
|
return extractedCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int ExtractFile(string fileName, string savePath)
|
||||||
|
{
|
||||||
|
int extractedCount = 0;
|
||||||
|
var reader = new FileReader(fileName);
|
||||||
|
if (reader.FileType == FileType.BundleFile)
|
||||||
|
extractedCount += ExtractBundleFile(reader, savePath);
|
||||||
|
else if (reader.FileType == FileType.WebFile)
|
||||||
|
extractedCount += ExtractWebDataFile(reader, savePath);
|
||||||
|
else
|
||||||
|
reader.Dispose();
|
||||||
|
return extractedCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int ExtractBundleFile(FileReader reader, string savePath)
|
||||||
|
{
|
||||||
|
StatusStripUpdate($"Decompressing {reader.FileName} ...");
|
||||||
|
var bundleFile = new BundleFile(reader);
|
||||||
reader.Dispose();
|
reader.Dispose();
|
||||||
if (bundleFile.fileList.Length > 0)
|
if (bundleFile.fileList.Length > 0)
|
||||||
{
|
{
|
||||||
var extractPath = bundleFileName + "_unpacked\\";
|
var extractPath = Path.Combine(savePath, reader.FileName + "_unpacked");
|
||||||
return ExtractStreamFile(extractPath, bundleFile.fileList);
|
return ExtractStreamFile(extractPath, bundleFile.fileList);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int ExtractWebDataFile(string webFileName, EndianBinaryReader reader)
|
private static int ExtractWebDataFile(FileReader reader, string savePath)
|
||||||
{
|
{
|
||||||
StatusStripUpdate($"Decompressing {Path.GetFileName(webFileName)} ...");
|
StatusStripUpdate($"Decompressing {reader.FileName} ...");
|
||||||
var webFile = new WebFile(reader);
|
var webFile = new WebFile(reader);
|
||||||
reader.Dispose();
|
reader.Dispose();
|
||||||
if (webFile.fileList.Length > 0)
|
if (webFile.fileList.Length > 0)
|
||||||
{
|
{
|
||||||
var extractPath = webFileName + "_unpacked\\";
|
var extractPath = Path.Combine(savePath, reader.FileName + "_unpacked");
|
||||||
return ExtractStreamFile(extractPath, webFile.fileList);
|
return ExtractStreamFile(extractPath, webFile.fileList);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -81,14 +113,18 @@ namespace AssetStudioGUI
|
|||||||
int extractedCount = 0;
|
int extractedCount = 0;
|
||||||
foreach (var file in fileList)
|
foreach (var file in fileList)
|
||||||
{
|
{
|
||||||
var filePath = extractPath + file.fileName;
|
var filePath = Path.Combine(extractPath, file.path);
|
||||||
if (!Directory.Exists(extractPath))
|
var fileDirectory = Path.GetDirectoryName(filePath);
|
||||||
|
if (!Directory.Exists(fileDirectory))
|
||||||
{
|
{
|
||||||
Directory.CreateDirectory(extractPath);
|
Directory.CreateDirectory(fileDirectory);
|
||||||
}
|
}
|
||||||
if (!File.Exists(filePath) && file.stream is MemoryStream stream)
|
if (!File.Exists(filePath))
|
||||||
{
|
{
|
||||||
File.WriteAllBytes(filePath, stream.ToArray());
|
using (var fileStream = File.Create(filePath))
|
||||||
|
{
|
||||||
|
file.stream.CopyTo(fileStream);
|
||||||
|
}
|
||||||
extractedCount += 1;
|
extractedCount += 1;
|
||||||
}
|
}
|
||||||
file.stream.Dispose();
|
file.stream.Dispose();
|
||||||
@@ -101,15 +137,13 @@ namespace AssetStudioGUI
|
|||||||
StatusStripUpdate("Building asset list...");
|
StatusStripUpdate("Building asset list...");
|
||||||
|
|
||||||
string productName = null;
|
string productName = null;
|
||||||
var assetsNameHash = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
|
||||||
var objectCount = assetsManager.assetsFileList.Sum(x => x.Objects.Count);
|
var objectCount = assetsManager.assetsFileList.Sum(x => x.Objects.Count);
|
||||||
var objectAssetItemDic = new Dictionary<Object, AssetItem>(objectCount);
|
var objectAssetItemDic = new Dictionary<Object, AssetItem>(objectCount);
|
||||||
|
var containers = new List<(PPtr<Object>, string)>();
|
||||||
int i = 0;
|
int i = 0;
|
||||||
Progress.Reset();
|
Progress.Reset();
|
||||||
foreach (var assetsFile in assetsManager.assetsFileList)
|
foreach (var assetsFile in assetsManager.assetsFileList)
|
||||||
{
|
{
|
||||||
var tempExportableAssets = new List<AssetItem>();
|
|
||||||
Dictionary<long, string> containers = null;
|
|
||||||
foreach (var asset in assetsFile.Objects)
|
foreach (var asset in assetsFile.Objects)
|
||||||
{
|
{
|
||||||
var assetItem = new AssetItem(asset);
|
var assetItem = new AssetItem(asset);
|
||||||
@@ -135,7 +169,7 @@ namespace AssetStudioGUI
|
|||||||
break;
|
break;
|
||||||
case VideoClip m_VideoClip:
|
case VideoClip m_VideoClip:
|
||||||
if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath))
|
if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath))
|
||||||
assetItem.FullSize = asset.byteSize + (long)m_VideoClip.m_Size;
|
assetItem.FullSize = asset.byteSize + (long)m_VideoClip.m_ExternalResources.m_Size;
|
||||||
assetItem.Text = m_VideoClip.m_Name;
|
assetItem.Text = m_VideoClip.m_Name;
|
||||||
exportable = true;
|
exportable = true;
|
||||||
break;
|
break;
|
||||||
@@ -174,13 +208,24 @@ namespace AssetStudioGUI
|
|||||||
productName = m_PlayerSettings.productName;
|
productName = m_PlayerSettings.productName;
|
||||||
break;
|
break;
|
||||||
case AssetBundle m_AssetBundle:
|
case AssetBundle m_AssetBundle:
|
||||||
containers = new Dictionary<long, string>();
|
|
||||||
foreach (var m_Container in m_AssetBundle.m_Container)
|
foreach (var m_Container in m_AssetBundle.m_Container)
|
||||||
{
|
{
|
||||||
containers[m_Container.Value.asset.m_PathID] = m_Container.Key;
|
var preloadIndex = m_Container.Value.preloadIndex;
|
||||||
|
var preloadSize = m_Container.Value.preloadSize;
|
||||||
|
var preloadEnd = preloadIndex + preloadSize;
|
||||||
|
for (int k = preloadIndex; k < preloadEnd; k++)
|
||||||
|
{
|
||||||
|
containers.Add((m_AssetBundle.m_PreloadTable[k], m_Container.Key));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
assetItem.Text = m_AssetBundle.m_Name;
|
assetItem.Text = m_AssetBundle.m_Name;
|
||||||
break;
|
break;
|
||||||
|
case ResourceManager m_ResourceManager:
|
||||||
|
foreach (var m_Container in m_ResourceManager.m_Container)
|
||||||
|
{
|
||||||
|
containers.Add((m_Container.Value, m_Container.Key));
|
||||||
|
}
|
||||||
|
break;
|
||||||
case NamedObject m_NamedObject:
|
case NamedObject m_NamedObject:
|
||||||
assetItem.Text = m_NamedObject.m_Name;
|
assetItem.Text = m_NamedObject.m_Name;
|
||||||
break;
|
break;
|
||||||
@@ -189,39 +234,27 @@ namespace AssetStudioGUI
|
|||||||
{
|
{
|
||||||
assetItem.Text = assetItem.TypeString + assetItem.UniqueID;
|
assetItem.Text = assetItem.TypeString + assetItem.UniqueID;
|
||||||
}
|
}
|
||||||
//处理同名文件
|
|
||||||
if (!assetsNameHash.Add(assetItem.TypeString + assetItem.Text))
|
|
||||||
{
|
|
||||||
assetItem.Text += assetItem.UniqueID;
|
|
||||||
}
|
|
||||||
//处理非法文件名
|
|
||||||
assetItem.Text = FixFileName(assetItem.Text);
|
|
||||||
if (Properties.Settings.Default.displayAll || exportable)
|
if (Properties.Settings.Default.displayAll || exportable)
|
||||||
{
|
{
|
||||||
tempExportableAssets.Add(assetItem);
|
exportableAssets.Add(assetItem);
|
||||||
}
|
}
|
||||||
Progress.Report(++i, objectCount);
|
Progress.Report(++i, objectCount);
|
||||||
}
|
}
|
||||||
foreach (var item in tempExportableAssets)
|
|
||||||
{
|
|
||||||
if (containers != null)
|
|
||||||
{
|
|
||||||
if (containers.TryGetValue(item.Asset.m_PathID, out var container))
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(container))
|
|
||||||
{
|
|
||||||
item.Container = container;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
item.SetSubItems();
|
|
||||||
}
|
|
||||||
exportableAssets.AddRange(tempExportableAssets);
|
|
||||||
tempExportableAssets.Clear();
|
|
||||||
containers?.Clear();
|
|
||||||
}
|
}
|
||||||
|
foreach ((var pptr, var container) in containers)
|
||||||
|
{
|
||||||
|
if (pptr.TryGet(out var obj))
|
||||||
|
{
|
||||||
|
objectAssetItemDic[obj].Container = container;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (var tmp in exportableAssets)
|
||||||
|
{
|
||||||
|
tmp.SetSubItems();
|
||||||
|
}
|
||||||
|
containers.Clear();
|
||||||
|
|
||||||
visibleAssets = exportableAssets;
|
visibleAssets = exportableAssets;
|
||||||
assetsNameHash.Clear();
|
|
||||||
|
|
||||||
StatusStripUpdate("Building tree structure...");
|
StatusStripUpdate("Building tree structure...");
|
||||||
|
|
||||||
@@ -308,27 +341,27 @@ namespace AssetStudioGUI
|
|||||||
{
|
{
|
||||||
if (typeMap.TryGetValue(assetsFile.unityVersion, out var curVer))
|
if (typeMap.TryGetValue(assetsFile.unityVersion, out var curVer))
|
||||||
{
|
{
|
||||||
foreach (var type in assetsFile.m_Types.Where(x => x.m_Nodes != null))
|
foreach (var type in assetsFile.m_Types.Where(x => x.m_Type != null))
|
||||||
{
|
{
|
||||||
var key = type.classID;
|
var key = type.classID;
|
||||||
if (type.m_ScriptTypeIndex >= 0)
|
if (type.m_ScriptTypeIndex >= 0)
|
||||||
{
|
{
|
||||||
key = -1 - type.m_ScriptTypeIndex;
|
key = -1 - type.m_ScriptTypeIndex;
|
||||||
}
|
}
|
||||||
curVer[key] = new TypeTreeItem(key, type.m_Nodes);
|
curVer[key] = new TypeTreeItem(key, type.m_Type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var items = new SortedDictionary<int, TypeTreeItem>();
|
var items = new SortedDictionary<int, TypeTreeItem>();
|
||||||
foreach (var type in assetsFile.m_Types.Where(x => x.m_Nodes != null))
|
foreach (var type in assetsFile.m_Types.Where(x => x.m_Type != null))
|
||||||
{
|
{
|
||||||
var key = type.classID;
|
var key = type.classID;
|
||||||
if (type.m_ScriptTypeIndex >= 0)
|
if (type.m_ScriptTypeIndex >= 0)
|
||||||
{
|
{
|
||||||
key = -1 - type.m_ScriptTypeIndex;
|
key = -1 - type.m_ScriptTypeIndex;
|
||||||
}
|
}
|
||||||
items[key] = new TypeTreeItem(key, type.m_Nodes);
|
items[key] = new TypeTreeItem(key, type.m_Type);
|
||||||
}
|
}
|
||||||
typeMap.Add(assetsFile.unityVersion, items);
|
typeMap.Add(assetsFile.unityVersion, items);
|
||||||
}
|
}
|
||||||
@@ -337,12 +370,6 @@ namespace AssetStudioGUI
|
|||||||
return typeMap;
|
return typeMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string FixFileName(string str)
|
|
||||||
{
|
|
||||||
if (str.Length >= 260) return Path.GetRandomFileName();
|
|
||||||
return Path.GetInvalidFileNameChars().Aggregate(str, (current, c) => current.Replace(c, '_'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void ExportAssets(string savePath, List<AssetItem> toExportAssets, ExportType exportType)
|
public static void ExportAssets(string savePath, List<AssetItem> toExportAssets, ExportType exportType)
|
||||||
{
|
{
|
||||||
ThreadPool.QueueUserWorkItem(state =>
|
ThreadPool.QueueUserWorkItem(state =>
|
||||||
@@ -372,7 +399,14 @@ namespace AssetStudioGUI
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: //source file
|
case 2: //source file
|
||||||
exportPath = Path.Combine(savePath, asset.SourceFile.fullName + "_export");
|
if (string.IsNullOrEmpty(asset.SourceFile.originalPath))
|
||||||
|
{
|
||||||
|
exportPath = Path.Combine(savePath, asset.SourceFile.fileName + "_export");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
exportPath = Path.Combine(savePath, Path.GetFileName(asset.SourceFile.originalPath) + "_export", asset.SourceFile.fileName);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
exportPath = savePath;
|
exportPath = savePath;
|
||||||
@@ -428,6 +462,51 @@ namespace AssetStudioGUI
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void ExportAssetsList(string savePath, List<AssetItem> toExportAssets, ExportListType exportListType)
|
||||||
|
{
|
||||||
|
ThreadPool.QueueUserWorkItem(state =>
|
||||||
|
{
|
||||||
|
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
|
||||||
|
|
||||||
|
Progress.Reset();
|
||||||
|
|
||||||
|
switch (exportListType)
|
||||||
|
{
|
||||||
|
case ExportListType.XML:
|
||||||
|
var filename = Path.Combine(savePath, "assets.xml");
|
||||||
|
var doc = new XDocument(
|
||||||
|
new XElement("Assets",
|
||||||
|
new XAttribute("filename", filename),
|
||||||
|
new XAttribute("createdAt", DateTime.UtcNow.ToString("s")),
|
||||||
|
toExportAssets.Select(
|
||||||
|
asset => new XElement("Asset",
|
||||||
|
new XElement("Name", asset.Text),
|
||||||
|
new XElement("Container", asset.Container),
|
||||||
|
new XElement("Type", new XAttribute("id", (int)asset.Type), asset.TypeString),
|
||||||
|
new XElement("PathID", asset.m_PathID),
|
||||||
|
new XElement("Source", asset.SourceFile.fullName),
|
||||||
|
new XElement("Size", asset.FullSize)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
doc.Save(filename);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var statusText = $"Finished exporting asset list with {toExportAssets.Count()} items.";
|
||||||
|
|
||||||
|
StatusStripUpdate(statusText);
|
||||||
|
|
||||||
|
if (Properties.Settings.Default.openAfterExport && toExportAssets.Count() > 0)
|
||||||
|
{
|
||||||
|
Process.Start(savePath);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public static void ExportSplitObjects(string savePath, TreeNodeCollection nodes)
|
public static void ExportSplitObjects(string savePath, TreeNodeCollection nodes)
|
||||||
{
|
{
|
||||||
ThreadPool.QueueUserWorkItem(state =>
|
ThreadPool.QueueUserWorkItem(state =>
|
||||||
@@ -452,13 +531,13 @@ namespace AssetStudioGUI
|
|||||||
//处理非法文件名
|
//处理非法文件名
|
||||||
var filename = FixFileName(j.Text);
|
var filename = FixFileName(j.Text);
|
||||||
//每个文件存放在单独的文件夹
|
//每个文件存放在单独的文件夹
|
||||||
var targetPath = $"{savePath}{filename}\\";
|
var targetPath = $"{savePath}{filename}{Path.DirectorySeparatorChar}";
|
||||||
//重名文件处理
|
//重名文件处理
|
||||||
for (int i = 1; ; i++)
|
for (int i = 1; ; i++)
|
||||||
{
|
{
|
||||||
if (Directory.Exists(targetPath))
|
if (Directory.Exists(targetPath))
|
||||||
{
|
{
|
||||||
targetPath = $"{savePath}{filename} ({i})\\";
|
targetPath = $"{savePath}{filename} ({i}){Path.DirectorySeparatorChar}";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -601,23 +680,33 @@ namespace AssetStudioGUI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetScriptString(ObjectReader reader)
|
public static TypeTree MonoBehaviourToTypeTree(MonoBehaviour m_MonoBehaviour)
|
||||||
{
|
{
|
||||||
if (scriptDumper == null)
|
if (!assemblyLoader.Loaded)
|
||||||
{
|
{
|
||||||
var openFolderDialog = new OpenFolderDialog();
|
var openFolderDialog = new OpenFolderDialog();
|
||||||
openFolderDialog.Title = "Select Assembly Folder";
|
openFolderDialog.Title = "Select Assembly Folder";
|
||||||
if (openFolderDialog.ShowDialog() == DialogResult.OK)
|
if (openFolderDialog.ShowDialog() == DialogResult.OK)
|
||||||
{
|
{
|
||||||
scriptDumper = new ScriptDumper(openFolderDialog.Folder);
|
assemblyLoader.Load(openFolderDialog.Folder);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scriptDumper = new ScriptDumper();
|
assemblyLoader.Loaded = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return m_MonoBehaviour.ConvertToTypeTree(assemblyLoader);
|
||||||
|
}
|
||||||
|
|
||||||
return scriptDumper.DumpScript(reader);
|
public static string DumpAsset(Object obj)
|
||||||
|
{
|
||||||
|
var str = obj.Dump();
|
||||||
|
if (str == null && obj is MonoBehaviour m_MonoBehaviour)
|
||||||
|
{
|
||||||
|
var type = MonoBehaviourToTypeTree(m_MonoBehaviour);
|
||||||
|
str = m_MonoBehaviour.Dump(type);
|
||||||
|
}
|
||||||
|
return str;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,75 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<configuration>
|
|
||||||
<configSections>
|
|
||||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
|
||||||
<section name="AssetStudioGUI.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
|
||||||
</sectionGroup>
|
|
||||||
</configSections>
|
|
||||||
<startup>
|
|
||||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
|
|
||||||
</startup>
|
|
||||||
<userSettings>
|
|
||||||
<AssetStudioGUI.Properties.Settings>
|
|
||||||
<setting name="displayAll" serializeAs="String">
|
|
||||||
<value>False</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="enablePreview" serializeAs="String">
|
|
||||||
<value>True</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="displayInfo" serializeAs="String">
|
|
||||||
<value>True</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="openAfterExport" serializeAs="String">
|
|
||||||
<value>True</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="assetGroupOption" serializeAs="String">
|
|
||||||
<value>0</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="convertTexture" serializeAs="String">
|
|
||||||
<value>True</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="convertAudio" serializeAs="String">
|
|
||||||
<value>True</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="convertType" serializeAs="String">
|
|
||||||
<value>PNG</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="eulerFilter" serializeAs="String">
|
|
||||||
<value>True</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="filterPrecision" serializeAs="String">
|
|
||||||
<value>0.25</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="exportAllNodes" serializeAs="String">
|
|
||||||
<value>True</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="exportSkins" serializeAs="String">
|
|
||||||
<value>True</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="exportAnimations" serializeAs="String">
|
|
||||||
<value>True</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="boneSize" serializeAs="String">
|
|
||||||
<value>10</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="fbxVersion" serializeAs="String">
|
|
||||||
<value>3</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="fbxFormat" serializeAs="String">
|
|
||||||
<value>0</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="scaleFactor" serializeAs="String">
|
|
||||||
<value>1</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="exportBlendShape" serializeAs="String">
|
|
||||||
<value>True</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="castToBone" serializeAs="String">
|
|
||||||
<value>False</value>
|
|
||||||
</setting>
|
|
||||||
<setting name="restoreExtensionName" serializeAs="String">
|
|
||||||
<value>True</value>
|
|
||||||
</setting>
|
|
||||||
</AssetStudioGUI.Properties.Settings>
|
|
||||||
</userSettings>
|
|
||||||
</configuration>
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<packages>
|
|
||||||
<package id="OpenTK" version="3.1.0" targetFramework="net472" />
|
|
||||||
<package id="OpenTK.GLControl" version="3.1.0" targetFramework="net472" />
|
|
||||||
</packages>
|
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
using Mono.Cecil;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace AssetStudio
|
||||||
|
{
|
||||||
|
public class AssemblyLoader
|
||||||
|
{
|
||||||
|
public bool Loaded;
|
||||||
|
private Dictionary<string, ModuleDefinition> moduleDic = new Dictionary<string, ModuleDefinition>();
|
||||||
|
|
||||||
|
public void Load(string path)
|
||||||
|
{
|
||||||
|
var files = Directory.GetFiles(path, "*.dll");
|
||||||
|
var resolver = new MyAssemblyResolver();
|
||||||
|
var readerParameters = new ReaderParameters();
|
||||||
|
readerParameters.AssemblyResolver = resolver;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
foreach (var file in files)
|
||||||
|
{
|
||||||
|
var assembly = AssemblyDefinition.ReadAssembly(file, readerParameters);
|
||||||
|
resolver.Register(assembly);
|
||||||
|
moduleDic.Add(assembly.MainModule.Name, assembly.MainModule);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// ignored
|
||||||
|
}
|
||||||
|
Loaded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TypeDefinition GetTypeDefinition(string assemblyName, string fullName)
|
||||||
|
{
|
||||||
|
if (moduleDic.TryGetValue(assemblyName, out var module))
|
||||||
|
{
|
||||||
|
var typeDef = module.GetType(fullName);
|
||||||
|
if (typeDef == null && assemblyName == "UnityEngine.dll")
|
||||||
|
{
|
||||||
|
foreach (var pair in moduleDic)
|
||||||
|
{
|
||||||
|
typeDef = pair.Value.GetType(fullName);
|
||||||
|
if (typeDef != null)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return typeDef;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Clear()
|
||||||
|
{
|
||||||
|
foreach (var pair in moduleDic)
|
||||||
|
{
|
||||||
|
pair.Value.Dispose();
|
||||||
|
}
|
||||||
|
moduleDic.Clear();
|
||||||
|
Loaded = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,83 +1,23 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<TargetFrameworks>net472;netstandard2.0</TargetFrameworks>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
<Version>0.16.0.0</Version>
|
||||||
<ProjectGuid>{80AEC261-21EE-4E4F-A93B-7A744DC84888}</ProjectGuid>
|
<AssemblyVersion>0.16.0.0</AssemblyVersion>
|
||||||
<OutputType>Library</OutputType>
|
<FileVersion>0.16.0.0</FileVersion>
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
<Copyright>Copyright © Perfare 2018-2021</Copyright>
|
||||||
<RootNamespace>AssetStudioUtility</RootNamespace>
|
|
||||||
<AssemblyName>AssetStudioUtility</AssemblyName>
|
|
||||||
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<Deterministic>true</Deterministic>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<LangVersion>7.3</LangVersion>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|AnyCPU'">
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<LangVersion>7.3</LangVersion>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="dnlib">
|
<PackageReference Include="Mono.Cecil" Version="0.11.3" />
|
||||||
<HintPath>Libraries\dnlib.dll</HintPath>
|
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta13" />
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Drawing" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="Microsoft.CSharp" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Net.Http" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="AudioClipConverter.cs" />
|
<ProjectReference Include="..\AssetStudio.PInvoke\AssetStudio.PInvoke.csproj" />
|
||||||
<Compile Include="FMOD Studio API\fmod.cs" />
|
<ProjectReference Include="..\AssetStudioFBXWrapper\AssetStudioFBXWrapper.csproj" />
|
||||||
<Compile Include="FMOD Studio API\fmod_dsp.cs" />
|
<ProjectReference Include="..\AssetStudio\AssetStudio.csproj" />
|
||||||
<Compile Include="FMOD Studio API\fmod_errors.cs" />
|
<ProjectReference Include="..\Texture2DDecoderWrapper\Texture2DDecoderWrapper.csproj" />
|
||||||
<Compile Include="ModelConverter.cs" />
|
|
||||||
<Compile Include="ModelExporter.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
<Compile Include="ScriptDumper.cs" />
|
|
||||||
<Compile Include="ShaderConverter.cs" />
|
|
||||||
<Compile Include="SpriteHelper.cs" />
|
|
||||||
<Compile Include="Texture2DConverter.cs" />
|
|
||||||
<Compile Include="Texture2DExtensions.cs" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\AssetStudio.PInvoke\AssetStudio.PInvoke.csproj">
|
</Project>
|
||||||
<Project>{40c796b5-88ce-4adc-acd6-2f4862b7f136}</Project>
|
|
||||||
<Name>AssetStudio.PInvoke</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="..\AssetStudioFBXWrapper\AssetStudioFBXWrapper.csproj">
|
|
||||||
<Project>{bd76e63f-1517-47fa-8233-33e853a3acee}</Project>
|
|
||||||
<Name>AssetStudioFBXWrapper</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="..\AssetStudio\AssetStudio.csproj">
|
|
||||||
<Project>{7662f8c2-7bfd-442e-a948-a43b4f7eb06e}</Project>
|
|
||||||
<Name>AssetStudio</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="..\Texture2DDecoderWrapper\Texture2DDecoderWrapper.csproj">
|
|
||||||
<Project>{2afce830-b463-49b3-a026-877e5eafc0a4}</Project>
|
|
||||||
<Name>Texture2DDecoderWrapper</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
</Project>
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using FMOD;
|
||||||
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
@@ -18,33 +19,53 @@ namespace AssetStudio
|
|||||||
var m_AudioData = m_AudioClip.m_AudioData.GetData();
|
var m_AudioData = m_AudioClip.m_AudioData.GetData();
|
||||||
if (m_AudioData == null || m_AudioData.Length == 0)
|
if (m_AudioData == null || m_AudioData.Length == 0)
|
||||||
return null;
|
return null;
|
||||||
var exinfo = new FMOD.CREATESOUNDEXINFO();
|
var exinfo = new CREATESOUNDEXINFO();
|
||||||
var result = FMOD.Factory.System_Create(out var system);
|
var result = Factory.System_Create(out var system);
|
||||||
if (result != FMOD.RESULT.OK)
|
if (result != RESULT.OK)
|
||||||
return null;
|
return null;
|
||||||
result = system.init(1, FMOD.INITFLAGS.NORMAL, IntPtr.Zero);
|
result = system.init(1, INITFLAGS.NORMAL, IntPtr.Zero);
|
||||||
if (result != FMOD.RESULT.OK)
|
if (result != RESULT.OK)
|
||||||
return null;
|
return null;
|
||||||
exinfo.cbsize = Marshal.SizeOf(exinfo);
|
exinfo.cbsize = Marshal.SizeOf(exinfo);
|
||||||
exinfo.length = (uint)m_AudioClip.m_Size;
|
exinfo.length = (uint)m_AudioClip.m_Size;
|
||||||
result = system.createSound(m_AudioData, FMOD.MODE.OPENMEMORY, ref exinfo, out var sound);
|
result = system.createSound(m_AudioData, MODE.OPENMEMORY, ref exinfo, out var sound);
|
||||||
if (result != FMOD.RESULT.OK)
|
if (result != RESULT.OK)
|
||||||
return null;
|
return null;
|
||||||
result = sound.getSubSound(0, out var subsound);
|
result = sound.getNumSubSounds(out var numsubsounds);
|
||||||
if (result != FMOD.RESULT.OK)
|
if (result != RESULT.OK)
|
||||||
return null;
|
return null;
|
||||||
result = subsound.getFormat(out var type, out var format, out int channels, out int bits);
|
byte[] buff;
|
||||||
if (result != FMOD.RESULT.OK)
|
if (numsubsounds > 0)
|
||||||
|
{
|
||||||
|
result = sound.getSubSound(0, out var subsound);
|
||||||
|
if (result != RESULT.OK)
|
||||||
|
return null;
|
||||||
|
buff = SoundToWav(subsound);
|
||||||
|
subsound.release();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
buff = SoundToWav(sound);
|
||||||
|
}
|
||||||
|
sound.release();
|
||||||
|
system.release();
|
||||||
|
return buff;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] SoundToWav(Sound sound)
|
||||||
|
{
|
||||||
|
var result = sound.getFormat(out _, out _, out int channels, out int bits);
|
||||||
|
if (result != RESULT.OK)
|
||||||
return null;
|
return null;
|
||||||
result = subsound.getDefaults(out var frequency, out int priority);
|
result = sound.getDefaults(out var frequency, out _);
|
||||||
if (result != FMOD.RESULT.OK)
|
if (result != RESULT.OK)
|
||||||
return null;
|
return null;
|
||||||
var sampleRate = (int)frequency;
|
var sampleRate = (int)frequency;
|
||||||
result = subsound.getLength(out var length, FMOD.TIMEUNIT.PCMBYTES);
|
result = sound.getLength(out var length, TIMEUNIT.PCMBYTES);
|
||||||
if (result != FMOD.RESULT.OK)
|
if (result != RESULT.OK)
|
||||||
return null;
|
return null;
|
||||||
result = subsound.@lock(0, length, out var ptr1, out var ptr2, out var len1, out var len2);
|
result = sound.@lock(0, length, out var ptr1, out var ptr2, out var len1, out var len2);
|
||||||
if (result != FMOD.RESULT.OK)
|
if (result != RESULT.OK)
|
||||||
return null;
|
return null;
|
||||||
byte[] buffer = new byte[len1 + 44];
|
byte[] buffer = new byte[len1 + 44];
|
||||||
//添加wav头
|
//添加wav头
|
||||||
@@ -61,12 +82,9 @@ namespace AssetStudio
|
|||||||
Encoding.UTF8.GetBytes("data").CopyTo(buffer, 36);
|
Encoding.UTF8.GetBytes("data").CopyTo(buffer, 36);
|
||||||
BitConverter.GetBytes(len1).CopyTo(buffer, 40);
|
BitConverter.GetBytes(len1).CopyTo(buffer, 40);
|
||||||
Marshal.Copy(ptr1, buffer, 44, (int)len1);
|
Marshal.Copy(ptr1, buffer, 44, (int)len1);
|
||||||
result = subsound.unlock(ptr1, ptr2, len1, len2);
|
result = sound.unlock(ptr1, ptr2, len1, len2);
|
||||||
if (result != FMOD.RESULT.OK)
|
if (result != RESULT.OK)
|
||||||
return null;
|
return null;
|
||||||
subsound.release();
|
|
||||||
sound.release();
|
|
||||||
system.release();
|
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,221 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace SpirV
|
||||||
|
{
|
||||||
|
public struct ModuleHeader
|
||||||
|
{
|
||||||
|
public Version Version { get; set; }
|
||||||
|
public string GeneratorVendor { get; set; }
|
||||||
|
public string GeneratorName { get; set; }
|
||||||
|
public int GeneratorVersion { get; set; }
|
||||||
|
public uint Bound { get; set; }
|
||||||
|
public uint Reserved { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Flags]
|
||||||
|
public enum DisassemblyOptions
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
ShowTypes,
|
||||||
|
ShowNames,
|
||||||
|
Default = ShowTypes | ShowNames
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Disassembler
|
||||||
|
{
|
||||||
|
public string Disassemble (Module module)
|
||||||
|
{
|
||||||
|
return Disassemble(module, DisassemblyOptions.Default);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Disassemble(Module module, DisassemblyOptions options)
|
||||||
|
{
|
||||||
|
m_sb.AppendLine("; SPIR-V");
|
||||||
|
m_sb.Append("; Version: ").Append(module.Header.Version).AppendLine();
|
||||||
|
if (module.Header.GeneratorName == null)
|
||||||
|
{
|
||||||
|
m_sb.Append("; Generator: unknown; ").Append(module.Header.GeneratorVersion).AppendLine();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_sb.Append("; Generator: ").Append(module.Header.GeneratorVendor).Append(' ').
|
||||||
|
Append(module.Header.GeneratorName).Append("; ").Append(module.Header.GeneratorVersion).AppendLine();
|
||||||
|
}
|
||||||
|
m_sb.Append("; Bound: ").Append(module.Header.Bound).AppendLine();
|
||||||
|
m_sb.Append("; Schema: ").Append(module.Header.Reserved).AppendLine();
|
||||||
|
|
||||||
|
string[] lines = new string[module.Instructions.Count + 1];
|
||||||
|
lines[0] = m_sb.ToString();
|
||||||
|
m_sb.Clear();
|
||||||
|
|
||||||
|
for (int i = 0; i < module.Instructions.Count; i++)
|
||||||
|
{
|
||||||
|
ParsedInstruction instruction = module.Instructions[i];
|
||||||
|
PrintInstruction(m_sb, instruction, options);
|
||||||
|
lines[i + 1] = m_sb.ToString();
|
||||||
|
m_sb.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
int longestPrefix = 0;
|
||||||
|
for (int i = 0; i < lines.Length; i++)
|
||||||
|
{
|
||||||
|
string line = lines[i];
|
||||||
|
longestPrefix = Math.Max(longestPrefix, line.IndexOf('='));
|
||||||
|
if (longestPrefix > 50)
|
||||||
|
{
|
||||||
|
longestPrefix = 50;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_sb.Append(lines[0]);
|
||||||
|
for (int i = 1; i < lines.Length; i++)
|
||||||
|
{
|
||||||
|
string line = lines[i];
|
||||||
|
int index = line.IndexOf('=');
|
||||||
|
if (index == -1)
|
||||||
|
{
|
||||||
|
m_sb.Append(' ', longestPrefix + 4);
|
||||||
|
m_sb.Append(line);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int pad = Math.Max(0, longestPrefix - index);
|
||||||
|
m_sb.Append(' ', pad);
|
||||||
|
m_sb.Append(line, 0, index);
|
||||||
|
m_sb.Append('=');
|
||||||
|
m_sb.Append(line, index + 1, line.Length - index - 1);
|
||||||
|
}
|
||||||
|
m_sb.AppendLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
string result = m_sb.ToString();
|
||||||
|
m_sb.Clear();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void PrintInstruction(StringBuilder sb, ParsedInstruction instruction, DisassemblyOptions options)
|
||||||
|
{
|
||||||
|
if (instruction.Operands.Count == 0)
|
||||||
|
{
|
||||||
|
sb.Append(instruction.Instruction.Name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int currentOperand = 0;
|
||||||
|
if (instruction.Instruction.Operands[currentOperand].Type is IdResultType)
|
||||||
|
{
|
||||||
|
if (options.HasFlag(DisassemblyOptions.ShowTypes))
|
||||||
|
{
|
||||||
|
instruction.ResultType.ToString(sb).Append(' ');
|
||||||
|
}
|
||||||
|
++currentOperand;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentOperand < instruction.Operands.Count && instruction.Instruction.Operands[currentOperand].Type is IdResult)
|
||||||
|
{
|
||||||
|
if (!options.HasFlag(DisassemblyOptions.ShowNames) || string.IsNullOrWhiteSpace(instruction.Name))
|
||||||
|
{
|
||||||
|
PrintOperandValue(sb, instruction.Operands[currentOperand].Value, options);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sb.Append(instruction.Name);
|
||||||
|
}
|
||||||
|
sb.Append(" = ");
|
||||||
|
|
||||||
|
++currentOperand;
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.Append(instruction.Instruction.Name);
|
||||||
|
sb.Append(' ');
|
||||||
|
|
||||||
|
for (; currentOperand < instruction.Operands.Count; ++currentOperand)
|
||||||
|
{
|
||||||
|
PrintOperandValue(sb, instruction.Operands[currentOperand].Value, options);
|
||||||
|
sb.Append(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void PrintOperandValue(StringBuilder sb, object value, DisassemblyOptions options)
|
||||||
|
{
|
||||||
|
switch (value)
|
||||||
|
{
|
||||||
|
case System.Type t:
|
||||||
|
sb.Append(t.Name);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case string s:
|
||||||
|
{
|
||||||
|
sb.Append('"');
|
||||||
|
sb.Append(s);
|
||||||
|
sb.Append('"');
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ObjectReference or:
|
||||||
|
{
|
||||||
|
if (options.HasFlag(DisassemblyOptions.ShowNames) && or.Reference != null && !string.IsNullOrWhiteSpace(or.Reference.Name))
|
||||||
|
{
|
||||||
|
sb.Append(or.Reference.Name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
or.ToString(sb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IBitEnumOperandValue beov:
|
||||||
|
PrintBitEnumValue(sb, beov, options);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IValueEnumOperandValue veov:
|
||||||
|
PrintValueEnumValue(sb, veov, options);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VaryingOperandValue varOpVal:
|
||||||
|
varOpVal.ToString(sb);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
sb.Append(value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void PrintBitEnumValue(StringBuilder sb, IBitEnumOperandValue enumOperandValue, DisassemblyOptions options)
|
||||||
|
{
|
||||||
|
foreach (uint key in enumOperandValue.Values.Keys)
|
||||||
|
{
|
||||||
|
sb.Append(enumOperandValue.EnumerationType.GetEnumName(key));
|
||||||
|
IReadOnlyList<object> value = enumOperandValue.Values[key];
|
||||||
|
if (value.Count != 0)
|
||||||
|
{
|
||||||
|
sb.Append(' ');
|
||||||
|
foreach (object v in value)
|
||||||
|
{
|
||||||
|
PrintOperandValue(sb, v, options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void PrintValueEnumValue(StringBuilder sb, IValueEnumOperandValue valueOperandValue, DisassemblyOptions options)
|
||||||
|
{
|
||||||
|
sb.Append(valueOperandValue.Key);
|
||||||
|
if (valueOperandValue.Value is IList<object> valueList && valueList.Count > 0)
|
||||||
|
{
|
||||||
|
sb.Append(' ');
|
||||||
|
foreach (object v in valueList)
|
||||||
|
{
|
||||||
|
PrintOperandValue(sb, v, options);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly StringBuilder m_sb = new StringBuilder();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace SpirV
|
||||||
|
{
|
||||||
|
public static class EnumValuesExtensions
|
||||||
|
{
|
||||||
|
public static Array GetEnumValues(this System.Type _this)
|
||||||
|
{
|
||||||
|
TypeInfo typeInfo = _this.GetTypeInfo ();
|
||||||
|
if (!typeInfo.IsEnum) {
|
||||||
|
throw new ArgumentException ("GetEnumValues: Type '" + _this.Name + "' is not an enum");
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
(
|
||||||
|
from field in typeInfo.DeclaredFields
|
||||||
|
where field.IsLiteral
|
||||||
|
select field.GetValue (null)
|
||||||
|
)
|
||||||
|
.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetEnumName(this System.Type _this, object value)
|
||||||
|
{
|
||||||
|
TypeInfo typeInfo = _this.GetTypeInfo ();
|
||||||
|
if (!typeInfo.IsEnum) {
|
||||||
|
throw new ArgumentException ("GetEnumName: Type '" + _this.Name + "' is not an enum");
|
||||||
|
}
|
||||||
|
return
|
||||||
|
(
|
||||||
|
from field in typeInfo.DeclaredFields
|
||||||
|
where field.IsLiteral && (uint)field.GetValue(null) == (uint)value
|
||||||
|
select field.Name
|
||||||
|
)
|
||||||
|
.First();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace SpirV
|
||||||
|
{
|
||||||
|
public enum OperandQuantifier
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 1
|
||||||
|
/// </summary>
|
||||||
|
Default,
|
||||||
|
/// <summary>
|
||||||
|
/// 0 or 1
|
||||||
|
/// </summary>
|
||||||
|
Optional,
|
||||||
|
/// <summary>
|
||||||
|
/// 0+
|
||||||
|
/// </summary>
|
||||||
|
Varying
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Operand
|
||||||
|
{
|
||||||
|
public Operand(OperandType kind, string name, OperandQuantifier quantifier)
|
||||||
|
{
|
||||||
|
Name = name;
|
||||||
|
Type = kind;
|
||||||
|
Quantifier = quantifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name { get; }
|
||||||
|
public OperandType Type { get; }
|
||||||
|
public OperandQuantifier Quantifier { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Instruction
|
||||||
|
{
|
||||||
|
public Instruction (string name)
|
||||||
|
: this (name, new List<Operand> ())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public Instruction (string name, IReadOnlyList<Operand> operands)
|
||||||
|
{
|
||||||
|
Operands = operands;
|
||||||
|
Name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name { get; }
|
||||||
|
public IReadOnlyList<Operand> Operands { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
BSD 2-Clause License
|
||||||
|
|
||||||
|
Copyright (c) 2017, Matthäus G. Chajdas
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
@@ -0,0 +1,426 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace SpirV
|
||||||
|
{
|
||||||
|
public class Module
|
||||||
|
{
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
private struct FloatUIntUnion
|
||||||
|
{
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public uint Int;
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public float Float;
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Explicit)]
|
||||||
|
private struct DoubleULongUnion
|
||||||
|
{
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public ulong Long;
|
||||||
|
[FieldOffset(0)]
|
||||||
|
public double Double;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Module(ModuleHeader header, IReadOnlyList<ParsedInstruction> instructions)
|
||||||
|
{
|
||||||
|
Header = header;
|
||||||
|
Instructions = instructions;
|
||||||
|
|
||||||
|
Read(Instructions, objects_);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsDebugInstruction(ParsedInstruction instruction)
|
||||||
|
{
|
||||||
|
return debugInstructions_.Contains(instruction.Instruction.Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void Read(IReadOnlyList<ParsedInstruction> instructions, Dictionary<uint, ParsedInstruction> objects)
|
||||||
|
{
|
||||||
|
// Debug instructions can be only processed after everything
|
||||||
|
// else has been parsed, as they may reference types which haven't
|
||||||
|
// been seen in the file yet
|
||||||
|
List<ParsedInstruction> debugInstructions = new List<ParsedInstruction>();
|
||||||
|
// Entry points contain forward references
|
||||||
|
// Those need to be resolved afterwards
|
||||||
|
List<ParsedInstruction> entryPoints = new List<ParsedInstruction>();
|
||||||
|
|
||||||
|
foreach (var instruction in instructions)
|
||||||
|
{
|
||||||
|
if (IsDebugInstruction(instruction))
|
||||||
|
{
|
||||||
|
debugInstructions.Add(instruction);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (instruction.Instruction is OpEntryPoint)
|
||||||
|
{
|
||||||
|
entryPoints.Add(instruction);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (instruction.Instruction.Name.StartsWith("OpType", StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
ProcessTypeInstruction(instruction, objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
instruction.ResolveResultType(objects);
|
||||||
|
if (instruction.HasResult)
|
||||||
|
{
|
||||||
|
objects[instruction.ResultId] = instruction;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (instruction.Instruction)
|
||||||
|
{
|
||||||
|
// Constants require that the result type has been resolved
|
||||||
|
case OpSpecConstant sc:
|
||||||
|
case OpConstant oc:
|
||||||
|
{
|
||||||
|
Type t = instruction.ResultType;
|
||||||
|
Debug.Assert (t != null);
|
||||||
|
Debug.Assert (t is ScalarType);
|
||||||
|
|
||||||
|
object constant = ConvertConstant(instruction.ResultType as ScalarType, instruction.Words, 3);
|
||||||
|
instruction.Operands[2].Value = constant;
|
||||||
|
instruction.Value = constant;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (ParsedInstruction instruction in debugInstructions)
|
||||||
|
{
|
||||||
|
switch (instruction.Instruction)
|
||||||
|
{
|
||||||
|
case OpMemberName mn:
|
||||||
|
{
|
||||||
|
StructType t = (StructType)objects[instruction.Words[1]].ResultType;
|
||||||
|
t.SetMemberName((uint)instruction.Operands[1].Value, (string)instruction.Operands[2].Value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpName n:
|
||||||
|
{
|
||||||
|
// We skip naming objects we don't know about
|
||||||
|
ParsedInstruction t = objects[instruction.Words[1]];
|
||||||
|
t.Name = (string)instruction.Operands[1].Value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (ParsedInstruction instruction in instructions)
|
||||||
|
{
|
||||||
|
instruction.ResolveReferences(objects);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Module ReadFrom(Stream stream)
|
||||||
|
{
|
||||||
|
BinaryReader br = new BinaryReader(stream);
|
||||||
|
Reader reader = new Reader(br);
|
||||||
|
|
||||||
|
uint versionNumber = reader.ReadDWord();
|
||||||
|
int majorVersion = (int)(versionNumber >> 16);
|
||||||
|
int minorVersion = (int)((versionNumber >> 8) & 0xFF);
|
||||||
|
Version version = new Version(majorVersion, minorVersion);
|
||||||
|
|
||||||
|
uint generatorMagicNumber = reader.ReadDWord();
|
||||||
|
int generatorToolId = (int)(generatorMagicNumber >> 16);
|
||||||
|
string generatorVendor = "unknown";
|
||||||
|
string generatorName = null;
|
||||||
|
|
||||||
|
if (Meta.Tools.ContainsKey(generatorToolId))
|
||||||
|
{
|
||||||
|
Meta.ToolInfo toolInfo = Meta.Tools[generatorToolId];
|
||||||
|
generatorVendor = toolInfo.Vendor;
|
||||||
|
if (toolInfo.Name != null)
|
||||||
|
{
|
||||||
|
generatorName = toolInfo.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read header
|
||||||
|
ModuleHeader header = new ModuleHeader();
|
||||||
|
header.Version = version;
|
||||||
|
header.GeneratorName = generatorName;
|
||||||
|
header.GeneratorVendor = generatorVendor;
|
||||||
|
header.GeneratorVersion = (int)(generatorMagicNumber & 0xFFFF);
|
||||||
|
header.Bound = reader.ReadDWord();
|
||||||
|
header.Reserved = reader.ReadDWord();
|
||||||
|
|
||||||
|
List<ParsedInstruction> instructions = new List<ParsedInstruction>();
|
||||||
|
while (!reader.EndOfStream)
|
||||||
|
{
|
||||||
|
uint instructionStart = reader.ReadDWord ();
|
||||||
|
ushort wordCount = (ushort)(instructionStart >> 16);
|
||||||
|
int opCode = (int)(instructionStart & 0xFFFF);
|
||||||
|
|
||||||
|
uint[] words = new uint[wordCount];
|
||||||
|
words[0] = instructionStart;
|
||||||
|
for (ushort i = 1; i < wordCount; ++i)
|
||||||
|
{
|
||||||
|
words[i] = reader.ReadDWord();
|
||||||
|
}
|
||||||
|
|
||||||
|
ParsedInstruction instruction = new ParsedInstruction(opCode, words);
|
||||||
|
instructions.Add(instruction);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Module(header, instructions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Collect types from OpType* instructions
|
||||||
|
/// </summary>
|
||||||
|
private static void ProcessTypeInstruction(ParsedInstruction i, IReadOnlyDictionary<uint, ParsedInstruction> objects)
|
||||||
|
{
|
||||||
|
switch (i.Instruction)
|
||||||
|
{
|
||||||
|
case OpTypeInt t:
|
||||||
|
{
|
||||||
|
i.ResultType = new IntegerType((int)i.Words[2], i.Words[3] == 1u);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypeFloat t:
|
||||||
|
{
|
||||||
|
i.ResultType = new FloatingPointType((int)i.Words[2]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypeVector t:
|
||||||
|
{
|
||||||
|
i.ResultType = new VectorType((ScalarType)objects[i.Words[2]].ResultType, (int)i.Words[3]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypeMatrix t:
|
||||||
|
{
|
||||||
|
i.ResultType = new MatrixType((VectorType)objects[i.Words[2]].ResultType, (int)i.Words[3]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypeArray t:
|
||||||
|
{
|
||||||
|
object constant = objects[i.Words[3]].Value;
|
||||||
|
int size = 0;
|
||||||
|
|
||||||
|
switch (constant)
|
||||||
|
{
|
||||||
|
case ushort u16:
|
||||||
|
size = u16;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case uint u32:
|
||||||
|
size = (int)u32;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ulong u64:
|
||||||
|
size = (int)u64;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case short i16:
|
||||||
|
size = i16;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case int i32:
|
||||||
|
size = i32;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case long i64:
|
||||||
|
size = (int)i64;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
i.ResultType = new ArrayType(objects[i.Words[2]].ResultType, size);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypeRuntimeArray t:
|
||||||
|
{
|
||||||
|
i.ResultType = new RuntimeArrayType((Type)objects[i.Words[2]].ResultType);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypeBool t:
|
||||||
|
{
|
||||||
|
i.ResultType = new BoolType();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypeOpaque t:
|
||||||
|
{
|
||||||
|
i.ResultType = new OpaqueType();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypeVoid t:
|
||||||
|
{
|
||||||
|
i.ResultType = new VoidType();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypeImage t:
|
||||||
|
{
|
||||||
|
Type sampledType = objects[i.Operands[1].GetId ()].ResultType;
|
||||||
|
Dim dim = i.Operands[2].GetSingleEnumValue<Dim>();
|
||||||
|
uint depth = (uint)i.Operands[3].Value;
|
||||||
|
bool isArray = (uint)i.Operands[4].Value != 0;
|
||||||
|
bool isMultiSampled = (uint)i.Operands[5].Value != 0;
|
||||||
|
uint sampled = (uint)i.Operands[6].Value;
|
||||||
|
ImageFormat imageFormat = i.Operands[7].GetSingleEnumValue<ImageFormat>();
|
||||||
|
|
||||||
|
i.ResultType = new ImageType(sampledType,
|
||||||
|
dim,
|
||||||
|
(int)depth, isArray, isMultiSampled,
|
||||||
|
(int)sampled, imageFormat,
|
||||||
|
i.Operands.Count > 8 ? i.Operands[8].GetSingleEnumValue<AccessQualifier>() : AccessQualifier.ReadOnly);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypeSampler st:
|
||||||
|
{
|
||||||
|
i.ResultType = new SamplerType();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case OpTypeSampledImage t:
|
||||||
|
{
|
||||||
|
i.ResultType = new SampledImageType((ImageType)objects[i.Words[2]].ResultType);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypeFunction t:
|
||||||
|
{
|
||||||
|
List<Type> parameterTypes = new List<Type>();
|
||||||
|
for (int j = 3; j < i.Words.Count; ++j)
|
||||||
|
{
|
||||||
|
parameterTypes.Add(objects[i.Words[j]].ResultType);
|
||||||
|
}
|
||||||
|
i.ResultType = new FunctionType(objects[i.Words[2]].ResultType, parameterTypes);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypeForwardPointer t:
|
||||||
|
{
|
||||||
|
// We create a normal pointer, but with unspecified type
|
||||||
|
// This will get resolved later on
|
||||||
|
i.ResultType = new PointerType((StorageClass)i.Words[2]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypePointer t:
|
||||||
|
{
|
||||||
|
if (objects.ContainsKey(i.Words[1]))
|
||||||
|
{
|
||||||
|
// If there is something present, it must have been
|
||||||
|
// a forward reference. The storage type must
|
||||||
|
// match
|
||||||
|
PointerType pt = (PointerType)i.ResultType;
|
||||||
|
Debug.Assert (pt != null);
|
||||||
|
Debug.Assert (pt.StorageClass == (StorageClass)i.Words[2]);
|
||||||
|
pt.ResolveForwardReference (objects[i.Words[3]].ResultType);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i.ResultType = new PointerType((StorageClass)i.Words[2], objects[i.Words[3]].ResultType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OpTypeStruct t:
|
||||||
|
{
|
||||||
|
List<Type> memberTypes = new List<Type>();
|
||||||
|
for (int j = 2; j < i.Words.Count; ++j)
|
||||||
|
{
|
||||||
|
memberTypes.Add(objects[i.Words[j]].ResultType);
|
||||||
|
}
|
||||||
|
i.ResultType = new StructType(memberTypes);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static object ConvertConstant(ScalarType type, IReadOnlyList<uint> words, int index)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case IntegerType i:
|
||||||
|
{
|
||||||
|
if (i.Signed)
|
||||||
|
{
|
||||||
|
if (i.Width == 16)
|
||||||
|
{
|
||||||
|
return unchecked((short)(words[index]));
|
||||||
|
}
|
||||||
|
else if (i.Width == 32)
|
||||||
|
{
|
||||||
|
return unchecked((int)(words[index]));
|
||||||
|
}
|
||||||
|
else if (i.Width == 64)
|
||||||
|
{
|
||||||
|
return unchecked((long)(words[index] | (ulong)(words[index + 1]) << 32));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (i.Width == 16)
|
||||||
|
{
|
||||||
|
return unchecked((ushort)(words[index]));
|
||||||
|
}
|
||||||
|
else if (i.Width == 32)
|
||||||
|
{
|
||||||
|
return words[index];
|
||||||
|
}
|
||||||
|
else if (i.Width == 64)
|
||||||
|
{
|
||||||
|
return words[index] | (ulong)(words[index + 1]) << 32;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Exception ("Cannot construct integer literal.");
|
||||||
|
}
|
||||||
|
|
||||||
|
case FloatingPointType f:
|
||||||
|
{
|
||||||
|
if (f.Width == 32)
|
||||||
|
{
|
||||||
|
return new FloatUIntUnion { Int = words[0] }.Float;
|
||||||
|
}
|
||||||
|
else if (f.Width == 64)
|
||||||
|
{
|
||||||
|
return new DoubleULongUnion { Long = (words[index] | (ulong)(words[index + 1]) << 32) }.Double;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new Exception("Cannot construct floating point literal.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ModuleHeader Header { get; }
|
||||||
|
public IReadOnlyList<ParsedInstruction> Instructions { get; }
|
||||||
|
|
||||||
|
private static HashSet<string> debugInstructions_ = new HashSet<string>
|
||||||
|
{
|
||||||
|
"OpSourceContinued",
|
||||||
|
"OpSource",
|
||||||
|
"OpSourceExtension",
|
||||||
|
"OpName",
|
||||||
|
"OpMemberName",
|
||||||
|
"OpString",
|
||||||
|
"OpLine",
|
||||||
|
"OpNoLine",
|
||||||
|
"OpModuleProcessed"
|
||||||
|
};
|
||||||
|
|
||||||
|
private readonly Dictionary<uint, ParsedInstruction> objects_ = new Dictionary<uint, ParsedInstruction>();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,302 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace SpirV
|
||||||
|
{
|
||||||
|
public class OperandType
|
||||||
|
{
|
||||||
|
public virtual bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
// This returns the dynamic type
|
||||||
|
value = GetType();
|
||||||
|
wordsUsed = 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Literal : OperandType
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class LiteralNumber : Literal
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// The SPIR-V JSON file uses only literal integers
|
||||||
|
public class LiteralInteger : LiteralNumber
|
||||||
|
{
|
||||||
|
public override bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
value = words[index];
|
||||||
|
wordsUsed = 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class LiteralString : Literal
|
||||||
|
{
|
||||||
|
public override bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
// This is just a fail-safe -- the loop below must terminate
|
||||||
|
wordsUsed = 1;
|
||||||
|
int bytesUsed = 0;
|
||||||
|
byte[] bytes = new byte[(words.Count - index) * 4];
|
||||||
|
for (int i = index; i < words.Count; ++i)
|
||||||
|
{
|
||||||
|
uint word = words[i];
|
||||||
|
byte b0 = (byte)(word & 0xFF);
|
||||||
|
if (b0 == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bytes[bytesUsed++] = b0;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte b1 = (byte)((word >> 8) & 0xFF);
|
||||||
|
if (b1 == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bytes[bytesUsed++] = b1;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte b2 = (byte)((word >> 16) & 0xFF);
|
||||||
|
if (b2 == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bytes[bytesUsed++] = b2;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte b3 = (byte)(word >> 24);
|
||||||
|
if (b3 == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bytes[bytesUsed++] = b3;
|
||||||
|
}
|
||||||
|
wordsUsed++;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = Encoding.UTF8.GetString(bytes, 0, bytesUsed);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class LiteralContextDependentNumber : Literal
|
||||||
|
{
|
||||||
|
// This is handled during parsing by ConvertConstant
|
||||||
|
}
|
||||||
|
|
||||||
|
public class LiteralExtInstInteger : Literal
|
||||||
|
{
|
||||||
|
public override bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
value = words[index];
|
||||||
|
wordsUsed = 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class LiteralSpecConstantOpInteger : Literal
|
||||||
|
{
|
||||||
|
public override bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
List<ObjectReference> result = new List<ObjectReference>();
|
||||||
|
for (int i = index; i < words.Count; i++)
|
||||||
|
{
|
||||||
|
ObjectReference objRef = new ObjectReference(words[i]);
|
||||||
|
result.Add(objRef);
|
||||||
|
}
|
||||||
|
|
||||||
|
value = result;
|
||||||
|
wordsUsed = words.Count - index;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Parameter
|
||||||
|
{
|
||||||
|
public virtual IReadOnlyList<OperandType> OperandTypes { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ParameterFactory
|
||||||
|
{
|
||||||
|
public virtual Parameter CreateParameter(object value)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EnumType<T> : EnumType<T, ParameterFactory>
|
||||||
|
where T : Enum
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
public class EnumType<T, U> : OperandType
|
||||||
|
where T : Enum
|
||||||
|
where U : ParameterFactory, new ()
|
||||||
|
{
|
||||||
|
public override bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
int wordsUsedForParameters = 0;
|
||||||
|
if (typeof(T).GetTypeInfo().GetCustomAttributes<FlagsAttribute>().Any())
|
||||||
|
{
|
||||||
|
Dictionary<uint, IReadOnlyList<object>> result = new Dictionary<uint, IReadOnlyList<object>>();
|
||||||
|
foreach (object enumValue in EnumerationType.GetEnumValues())
|
||||||
|
{
|
||||||
|
uint bit = (uint)enumValue;
|
||||||
|
// bit == 0 and words[0] == 0 handles the 0x0 = None cases
|
||||||
|
if ((words[index] & bit) != 0 || (bit == 0 && words[index] == 0))
|
||||||
|
{
|
||||||
|
Parameter p = parameterFactory_.CreateParameter(bit);
|
||||||
|
if (p == null)
|
||||||
|
{
|
||||||
|
result.Add(bit, Array.Empty<object>());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
object[] resultItems = new object[p.OperandTypes.Count];
|
||||||
|
for (int j = 0; j < p.OperandTypes.Count; ++j)
|
||||||
|
{
|
||||||
|
p.OperandTypes[j].ReadValue(words, 1 + wordsUsedForParameters, out object pValue, out int pWordsUsed);
|
||||||
|
wordsUsedForParameters += pWordsUsed;
|
||||||
|
resultItems[j] = pValue;
|
||||||
|
}
|
||||||
|
result.Add(bit, resultItems);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
value = new BitEnumOperandValue<T>(result);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
object[] resultItems;
|
||||||
|
Parameter p = parameterFactory_.CreateParameter(words[index]);
|
||||||
|
if (p == null)
|
||||||
|
{
|
||||||
|
resultItems = Array.Empty<object>();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
resultItems = new object[p.OperandTypes.Count];
|
||||||
|
for (int j = 0; j < p.OperandTypes.Count; ++j)
|
||||||
|
{
|
||||||
|
p.OperandTypes[j].ReadValue(words, 1 + wordsUsedForParameters, out object pValue, out int pWordsUsed);
|
||||||
|
wordsUsedForParameters += pWordsUsed;
|
||||||
|
resultItems[j] = pValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
value = new ValueEnumOperandValue<T>((T)(object)words[index], resultItems);
|
||||||
|
}
|
||||||
|
|
||||||
|
wordsUsed = wordsUsedForParameters + 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public System.Type EnumerationType => typeof(T);
|
||||||
|
|
||||||
|
private U parameterFactory_ = new U();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class IdScope : OperandType
|
||||||
|
{
|
||||||
|
public override bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
value = (Scope)words[index];
|
||||||
|
wordsUsed = 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class IdMemorySemantics : OperandType
|
||||||
|
{
|
||||||
|
public override bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
value = (MemorySemantics)words[index];
|
||||||
|
wordsUsed = 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class IdType : OperandType
|
||||||
|
{
|
||||||
|
public override bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
value = words[index];
|
||||||
|
wordsUsed = 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class IdResult : IdType
|
||||||
|
{
|
||||||
|
public override bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
value = new ObjectReference(words[index]);
|
||||||
|
wordsUsed = 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class IdResultType : IdType
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class IdRef : IdType
|
||||||
|
{
|
||||||
|
public override bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
value = new ObjectReference(words[index]);
|
||||||
|
wordsUsed = 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PairIdRefIdRef : OperandType
|
||||||
|
{
|
||||||
|
public override bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
ObjectReference variable = new ObjectReference(words[index]);
|
||||||
|
ObjectReference parent = new ObjectReference(words[index + 1]);
|
||||||
|
value = new { Variable = variable, Parent = parent };
|
||||||
|
wordsUsed = 2;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PairIdRefLiteralInteger : OperandType
|
||||||
|
{
|
||||||
|
public override bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
ObjectReference type = new ObjectReference(words[index]);
|
||||||
|
uint word = words[index + 1];
|
||||||
|
value = new { Type = type, Member = word };
|
||||||
|
wordsUsed = 2;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PairLiteralIntegerIdRef : OperandType
|
||||||
|
{
|
||||||
|
public override bool ReadValue(IReadOnlyList<uint> words, int index, out object value, out int wordsUsed)
|
||||||
|
{
|
||||||
|
uint selector = words[index];
|
||||||
|
ObjectReference label = new ObjectReference(words[index + 1]);
|
||||||
|
value = new { Selector = selector, Label = label };
|
||||||
|
wordsUsed = 2;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,265 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace SpirV
|
||||||
|
{
|
||||||
|
public class ParsedOperand
|
||||||
|
{
|
||||||
|
public ParsedOperand(IReadOnlyList<uint> words, int index, int count, object value, Operand operand)
|
||||||
|
{
|
||||||
|
uint[] array = new uint[count];
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
array[i] = words[index + i];
|
||||||
|
}
|
||||||
|
|
||||||
|
Words = array;
|
||||||
|
Value = value;
|
||||||
|
Operand = operand;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T GetSingleEnumValue<T>()
|
||||||
|
where T : Enum
|
||||||
|
{
|
||||||
|
IValueEnumOperandValue v = (IValueEnumOperandValue)Value;
|
||||||
|
if (v.Value.Count == 0)
|
||||||
|
{
|
||||||
|
// If there's no value at all, the enum is probably something like ImageFormat.
|
||||||
|
// In which case we just return the enum value
|
||||||
|
return (T)v.Key;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// This means the enum has a value attached to it, so we return the attached value
|
||||||
|
return (T)((IValueEnumOperandValue)Value).Value[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint GetId()
|
||||||
|
{
|
||||||
|
return ((ObjectReference)Value).Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T GetBitEnumValue<T>()
|
||||||
|
where T : Enum
|
||||||
|
{
|
||||||
|
var v = Value as IBitEnumOperandValue;
|
||||||
|
|
||||||
|
uint result = 0;
|
||||||
|
foreach (var k in v.Values.Keys)
|
||||||
|
{
|
||||||
|
result |= k;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T)(object)result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IReadOnlyList<uint> Words { get; }
|
||||||
|
public object Value { get; set; }
|
||||||
|
public Operand Operand { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class VaryingOperandValue
|
||||||
|
{
|
||||||
|
public VaryingOperandValue(IReadOnlyList<object> values)
|
||||||
|
{
|
||||||
|
Values = values;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
ToString(sb);
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Values.Count; ++i)
|
||||||
|
{
|
||||||
|
if (Values[i] is ObjectReference objRef)
|
||||||
|
{
|
||||||
|
objRef.ToString(sb);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sb.Append(Values[i]);
|
||||||
|
}
|
||||||
|
if (i < (Values.Count - 1))
|
||||||
|
{
|
||||||
|
sb.Append(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IReadOnlyList<object> Values { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IEnumOperandValue
|
||||||
|
{
|
||||||
|
System.Type EnumerationType { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IBitEnumOperandValue : IEnumOperandValue
|
||||||
|
{
|
||||||
|
IReadOnlyDictionary<uint, IReadOnlyList<object>> Values { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IValueEnumOperandValue : IEnumOperandValue
|
||||||
|
{
|
||||||
|
object Key { get; }
|
||||||
|
IReadOnlyList<object> Value { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ValueEnumOperandValue<T> : IValueEnumOperandValue
|
||||||
|
where T : Enum
|
||||||
|
{
|
||||||
|
public ValueEnumOperandValue(T key, IReadOnlyList<object> value)
|
||||||
|
{
|
||||||
|
Key = key;
|
||||||
|
Value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public System.Type EnumerationType => typeof(T);
|
||||||
|
public object Key { get; }
|
||||||
|
public IReadOnlyList<object> Value { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BitEnumOperandValue<T> : IBitEnumOperandValue
|
||||||
|
where T : Enum
|
||||||
|
{
|
||||||
|
public BitEnumOperandValue(Dictionary<uint, IReadOnlyList<object>> values)
|
||||||
|
{
|
||||||
|
Values = values;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IReadOnlyDictionary<uint, IReadOnlyList<object>> Values { get; }
|
||||||
|
public System.Type EnumerationType => typeof(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ObjectReference
|
||||||
|
{
|
||||||
|
public ObjectReference(uint id)
|
||||||
|
{
|
||||||
|
Id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Resolve(IReadOnlyDictionary<uint, ParsedInstruction> objects)
|
||||||
|
{
|
||||||
|
Reference = objects[Id];
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"%{Id}";
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
return sb.Append('%').Append(Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint Id { get; }
|
||||||
|
public ParsedInstruction Reference { get; private set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ParsedInstruction
|
||||||
|
{
|
||||||
|
public ParsedInstruction(int opCode, IReadOnlyList<uint> words)
|
||||||
|
{
|
||||||
|
Words = words;
|
||||||
|
Instruction = Instructions.OpcodeToInstruction[opCode];
|
||||||
|
ParseOperands();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ParseOperands()
|
||||||
|
{
|
||||||
|
if (Instruction.Operands.Count == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Word 0 describes this instruction so we can ignore it
|
||||||
|
int currentWord = 1;
|
||||||
|
int currentOperand = 0;
|
||||||
|
List<object> varyingOperandValues = new List<object>();
|
||||||
|
int varyingWordStart = 0;
|
||||||
|
Operand varyingOperand = null;
|
||||||
|
|
||||||
|
while (currentWord < Words.Count)
|
||||||
|
{
|
||||||
|
Operand operand = Instruction.Operands[currentOperand];
|
||||||
|
operand.Type.ReadValue(Words, currentWord, out object value, out int wordsUsed);
|
||||||
|
if (operand.Quantifier == OperandQuantifier.Varying)
|
||||||
|
{
|
||||||
|
varyingOperandValues.Add(value);
|
||||||
|
varyingWordStart = currentWord;
|
||||||
|
varyingOperand = operand;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int wordCount = Math.Min(Words.Count - currentWord, wordsUsed);
|
||||||
|
ParsedOperand parsedOperand = new ParsedOperand(Words, currentWord, wordCount, value, operand);
|
||||||
|
Operands.Add(parsedOperand);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentWord += wordsUsed;
|
||||||
|
if (operand.Quantifier != OperandQuantifier.Varying)
|
||||||
|
{
|
||||||
|
++currentOperand;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (varyingOperand != null)
|
||||||
|
{
|
||||||
|
VaryingOperandValue varOperantValue = new VaryingOperandValue(varyingOperandValues);
|
||||||
|
ParsedOperand parsedOperand = new ParsedOperand(Words, currentWord, Words.Count - currentWord, varOperantValue, varyingOperand);
|
||||||
|
Operands.Add(parsedOperand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ResolveResultType(IReadOnlyDictionary<uint, ParsedInstruction> objects)
|
||||||
|
{
|
||||||
|
if (Instruction.Operands.Count > 0 && Instruction.Operands[0].Type is IdResultType)
|
||||||
|
{
|
||||||
|
ResultType = objects[(uint)Operands[0].Value].ResultType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ResolveReferences (IReadOnlyDictionary<uint, ParsedInstruction> objects)
|
||||||
|
{
|
||||||
|
foreach (var operand in Operands)
|
||||||
|
{
|
||||||
|
if (operand.Value is ObjectReference objectReference)
|
||||||
|
{
|
||||||
|
objectReference.Resolve (objects);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type ResultType { get; set; }
|
||||||
|
public uint ResultId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
for (int i = 0; i < Instruction.Operands.Count; ++i)
|
||||||
|
{
|
||||||
|
if (Instruction.Operands[i].Type is IdResult)
|
||||||
|
{
|
||||||
|
return Operands[i].GetId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public bool HasResult => ResultId != 0;
|
||||||
|
|
||||||
|
public IReadOnlyList<uint> Words { get; }
|
||||||
|
public Instruction Instruction { get; }
|
||||||
|
public IList<ParsedOperand> Operands { get; } = new List<ParsedOperand>();
|
||||||
|
public string Name { get; set; }
|
||||||
|
public object Value { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
namespace SpirV
|
||||||
|
{
|
||||||
|
internal sealed class Reader
|
||||||
|
{
|
||||||
|
public Reader(BinaryReader reader)
|
||||||
|
{
|
||||||
|
reader_ = reader;
|
||||||
|
uint magicNumber = reader_.ReadUInt32();
|
||||||
|
if (magicNumber == Meta.MagicNumber)
|
||||||
|
{
|
||||||
|
littleEndian_ = true;
|
||||||
|
}
|
||||||
|
else if (Reverse(magicNumber) == Meta.MagicNumber)
|
||||||
|
{
|
||||||
|
littleEndian_ = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new Exception("Invalid magic number");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint ReadDWord()
|
||||||
|
{
|
||||||
|
if (littleEndian_)
|
||||||
|
{
|
||||||
|
return reader_.ReadUInt32 ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return Reverse(reader_.ReadUInt32());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
|
private static uint Reverse(uint u)
|
||||||
|
{
|
||||||
|
return (u << 24) | (u & 0xFF00U) << 8 | (u >> 8) & 0xFF00U | (u >> 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool EndOfStream => reader_.BaseStream.Position == reader_.BaseStream.Length;
|
||||||
|
|
||||||
|
private readonly BinaryReader reader_;
|
||||||
|
private readonly bool littleEndian_;
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,54 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace SpirV
|
||||||
|
{
|
||||||
|
internal class Meta
|
||||||
|
{
|
||||||
|
public class ToolInfo
|
||||||
|
{
|
||||||
|
public ToolInfo(string vendor)
|
||||||
|
{
|
||||||
|
Vendor = vendor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ToolInfo(string vendor, string name)
|
||||||
|
{
|
||||||
|
Vendor = vendor;
|
||||||
|
Name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name { get; }
|
||||||
|
public string Vendor { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static uint MagicNumber => 119734787U;
|
||||||
|
public static uint Version => 66048U;
|
||||||
|
public static uint Revision => 2U;
|
||||||
|
public static uint OpCodeMask => 65535U;
|
||||||
|
public static uint WordCountShift => 16U;
|
||||||
|
|
||||||
|
public static IReadOnlyDictionary<int, ToolInfo> Tools => toolInfos_;
|
||||||
|
|
||||||
|
private readonly static Dictionary<int, ToolInfo> toolInfos_ = new Dictionary<int, ToolInfo>
|
||||||
|
{
|
||||||
|
{ 0, new ToolInfo("Khronos") },
|
||||||
|
{ 1, new ToolInfo("LunarG") },
|
||||||
|
{ 2, new ToolInfo("Valve") },
|
||||||
|
{ 3, new ToolInfo("Codeplay") },
|
||||||
|
{ 4, new ToolInfo("NVIDIA") },
|
||||||
|
{ 5, new ToolInfo("ARM") },
|
||||||
|
{ 6, new ToolInfo("Khronos", "LLVM/SPIR-V Translator") },
|
||||||
|
{ 7, new ToolInfo("Khronos", "SPIR-V Tools Assembler") },
|
||||||
|
{ 8, new ToolInfo("Khronos", "Glslang Reference Front End") },
|
||||||
|
{ 9, new ToolInfo("Qualcomm") },
|
||||||
|
{ 10, new ToolInfo("AMD") },
|
||||||
|
{ 11, new ToolInfo("Intel") },
|
||||||
|
{ 12, new ToolInfo("Imagination") },
|
||||||
|
{ 13, new ToolInfo("Google", "Shaderc over Glslang") },
|
||||||
|
{ 14, new ToolInfo("Google", "spiregg") },
|
||||||
|
{ 15, new ToolInfo("Google", "rspirv") },
|
||||||
|
{ 16, new ToolInfo("X-LEGEND", "Mesa-IR/SPIR-V Translator") },
|
||||||
|
{ 17, new ToolInfo("Khronos", "SPIR-V Tools Linker") },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,428 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace SpirV
|
||||||
|
{
|
||||||
|
public class Type
|
||||||
|
{
|
||||||
|
public virtual StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
return sb;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class VoidType : Type
|
||||||
|
{
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "void";
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
return sb.Append("void");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ScalarType : Type
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BoolType : ScalarType
|
||||||
|
{
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "bool";
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
return sb.Append("bool");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class IntegerType : ScalarType
|
||||||
|
{
|
||||||
|
public IntegerType (int width, bool signed)
|
||||||
|
{
|
||||||
|
Width = width;
|
||||||
|
Signed = signed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
if (Signed)
|
||||||
|
{
|
||||||
|
return $"i{Width}";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return $"u{Width}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
if (Signed)
|
||||||
|
{
|
||||||
|
sb.Append('i').Append(Width);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sb.Append('u').Append(Width);
|
||||||
|
}
|
||||||
|
return sb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Width { get; }
|
||||||
|
public bool Signed { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class FloatingPointType : ScalarType
|
||||||
|
{
|
||||||
|
public FloatingPointType (int width)
|
||||||
|
{
|
||||||
|
Width = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"f{Width}";
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
return sb.Append('f').Append(Width);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Width { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class VectorType : Type
|
||||||
|
{
|
||||||
|
public VectorType (ScalarType scalarType, int componentCount)
|
||||||
|
{
|
||||||
|
ComponentType = scalarType;
|
||||||
|
ComponentCount = componentCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"{ComponentType}_{ComponentCount}";
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
return ComponentType.ToString(sb).Append('_').Append(ComponentCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScalarType ComponentType { get; }
|
||||||
|
public int ComponentCount { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MatrixType : Type
|
||||||
|
{
|
||||||
|
public MatrixType (VectorType vectorType, int columnCount)
|
||||||
|
{
|
||||||
|
ColumnType = vectorType;
|
||||||
|
ColumnCount = columnCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString ()
|
||||||
|
{
|
||||||
|
return $"{ColumnType}x{ColumnCount}";
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
return sb.Append(ColumnType).Append('x').Append(ColumnCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public VectorType ColumnType { get; }
|
||||||
|
public int ColumnCount { get; }
|
||||||
|
public int RowCount => ColumnType.ComponentCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ImageType : Type
|
||||||
|
{
|
||||||
|
public ImageType (Type sampledType, Dim dim, int depth, bool isArray, bool isMultisampled, int sampleCount,
|
||||||
|
ImageFormat imageFormat, AccessQualifier accessQualifier)
|
||||||
|
{
|
||||||
|
SampledType = sampledType;
|
||||||
|
Dim = dim;
|
||||||
|
Depth = depth;
|
||||||
|
IsArray = isArray;
|
||||||
|
IsMultisampled = isMultisampled;
|
||||||
|
SampleCount = sampleCount;
|
||||||
|
Format = imageFormat;
|
||||||
|
AccessQualifier = accessQualifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString ()
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder ();
|
||||||
|
ToString(sb);
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
switch (AccessQualifier)
|
||||||
|
{
|
||||||
|
case AccessQualifier.ReadWrite:
|
||||||
|
sb.Append("read_write ");
|
||||||
|
break;
|
||||||
|
case AccessQualifier.WriteOnly:
|
||||||
|
sb.Append("write_only ");
|
||||||
|
break;
|
||||||
|
case AccessQualifier.ReadOnly:
|
||||||
|
sb.Append("read_only ");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.Append("Texture");
|
||||||
|
switch (Dim)
|
||||||
|
{
|
||||||
|
case Dim.Dim1D:
|
||||||
|
sb.Append("1D");
|
||||||
|
break;
|
||||||
|
case Dim.Dim2D:
|
||||||
|
sb.Append("2D");
|
||||||
|
break;
|
||||||
|
case Dim.Dim3D:
|
||||||
|
sb.Append("3D");
|
||||||
|
break;
|
||||||
|
case Dim.Cube:
|
||||||
|
sb.Append("Cube");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsMultisampled)
|
||||||
|
{
|
||||||
|
sb.Append("MS");
|
||||||
|
}
|
||||||
|
if (IsArray)
|
||||||
|
{
|
||||||
|
sb.Append("Array");
|
||||||
|
}
|
||||||
|
return sb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type SampledType { get; }
|
||||||
|
public Dim Dim { get; }
|
||||||
|
public int Depth { get; }
|
||||||
|
public bool IsArray { get; }
|
||||||
|
public bool IsMultisampled { get; }
|
||||||
|
public int SampleCount { get; }
|
||||||
|
public ImageFormat Format { get; }
|
||||||
|
public AccessQualifier AccessQualifier { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SamplerType : Type
|
||||||
|
{
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "sampler";
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
return sb.Append("sampler");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SampledImageType : Type
|
||||||
|
{
|
||||||
|
public SampledImageType (ImageType imageType)
|
||||||
|
{
|
||||||
|
ImageType = imageType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"{ImageType}Sampled";
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
return ImageType.ToString(sb).Append("Sampled");
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImageType ImageType { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ArrayType : Type
|
||||||
|
{
|
||||||
|
public ArrayType (Type elementType, int elementCount)
|
||||||
|
{
|
||||||
|
ElementType = elementType;
|
||||||
|
ElementCount = elementCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"{ElementType}[{ElementCount}]";
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
return ElementType.ToString(sb).Append('[').Append(ElementCount).Append(']');
|
||||||
|
}
|
||||||
|
|
||||||
|
public int ElementCount { get; }
|
||||||
|
public Type ElementType { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class RuntimeArrayType : Type
|
||||||
|
{
|
||||||
|
public RuntimeArrayType(Type elementType)
|
||||||
|
{
|
||||||
|
ElementType = elementType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type ElementType { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class StructType : Type
|
||||||
|
{
|
||||||
|
public StructType(IReadOnlyList<Type> memberTypes)
|
||||||
|
{
|
||||||
|
MemberTypes = memberTypes;
|
||||||
|
memberNames_ = new List<string>();
|
||||||
|
|
||||||
|
for (int i = 0; i < memberTypes.Count; ++i)
|
||||||
|
{
|
||||||
|
memberNames_.Add(string.Empty);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetMemberName(uint member, string name)
|
||||||
|
{
|
||||||
|
memberNames_[(int)member] = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
ToString(sb);
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
sb.Append("struct {");
|
||||||
|
for (int i = 0; i < MemberTypes.Count; ++i)
|
||||||
|
{
|
||||||
|
Type memberType = MemberTypes[i];
|
||||||
|
memberType.ToString(sb);
|
||||||
|
if (!string.IsNullOrEmpty(memberNames_[i]))
|
||||||
|
{
|
||||||
|
sb.Append(' ');
|
||||||
|
sb.Append(MemberNames[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.Append(';');
|
||||||
|
if (i < (MemberTypes.Count - 1))
|
||||||
|
{
|
||||||
|
sb.Append(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sb.Append('}');
|
||||||
|
return sb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IReadOnlyList<Type> MemberTypes { get; }
|
||||||
|
public IReadOnlyList<string> MemberNames => memberNames_;
|
||||||
|
|
||||||
|
private List<string> memberNames_;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OpaqueType : Type
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PointerType : Type
|
||||||
|
{
|
||||||
|
public PointerType(StorageClass storageClass, Type type)
|
||||||
|
{
|
||||||
|
StorageClass = storageClass;
|
||||||
|
Type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PointerType(StorageClass storageClass)
|
||||||
|
{
|
||||||
|
StorageClass = storageClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ResolveForwardReference(Type t)
|
||||||
|
{
|
||||||
|
Type = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
if (Type == null)
|
||||||
|
{
|
||||||
|
return $"{StorageClass} *";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return $"{StorageClass} {Type}*";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override StringBuilder ToString(StringBuilder sb)
|
||||||
|
{
|
||||||
|
sb.Append(StorageClass.ToString()).Append(' ');
|
||||||
|
if (Type != null)
|
||||||
|
{
|
||||||
|
Type.ToString(sb);
|
||||||
|
}
|
||||||
|
sb.Append('*');
|
||||||
|
return sb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StorageClass StorageClass { get; }
|
||||||
|
public Type Type { get; private set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class FunctionType : Type
|
||||||
|
{
|
||||||
|
public FunctionType(Type returnType, IReadOnlyList<Type> parameterTypes)
|
||||||
|
{
|
||||||
|
ReturnType = returnType;
|
||||||
|
ParameterTypes = parameterTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Type ReturnType { get; }
|
||||||
|
public IReadOnlyList<Type> ParameterTypes { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EventType : Type
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DeviceEventType : Type
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ReserveIdType : Type
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class QueueType : Type
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PipeType : Type
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PipeStorage : Type
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NamedBarrier : Type
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
using SixLabors.ImageSharp;
|
||||||
|
using SixLabors.ImageSharp.Formats.Bmp;
|
||||||
|
using SixLabors.ImageSharp.Formats.Tga;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace AssetStudio
|
||||||
|
{
|
||||||
|
public static class ImageExtensions
|
||||||
|
{
|
||||||
|
public static MemoryStream ConvertToStream(this Image image, ImageFormat imageFormat)
|
||||||
|
{
|
||||||
|
var outputStream = new MemoryStream();
|
||||||
|
switch (imageFormat)
|
||||||
|
{
|
||||||
|
case ImageFormat.Jpeg:
|
||||||
|
image.SaveAsJpeg(outputStream);
|
||||||
|
break;
|
||||||
|
case ImageFormat.Png:
|
||||||
|
image.SaveAsPng(outputStream);
|
||||||
|
break;
|
||||||
|
case ImageFormat.Bmp:
|
||||||
|
image.Save(outputStream, new BmpEncoder
|
||||||
|
{
|
||||||
|
BitsPerPixel = BmpBitsPerPixel.Pixel32,
|
||||||
|
SupportTransparency = true
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
case ImageFormat.Tga:
|
||||||
|
image.Save(outputStream, new TgaEncoder
|
||||||
|
{
|
||||||
|
BitsPerPixel = TgaBitsPerPixel.Pixel32,
|
||||||
|
Compression = TgaCompression.None
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return outputStream;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
namespace AssetStudio
|
||||||
|
{
|
||||||
|
public enum ImageFormat
|
||||||
|
{
|
||||||
|
Jpeg,
|
||||||
|
Png,
|
||||||
|
Bmp,
|
||||||
|
Tga
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user