Prototype animation export
This commit is contained in:
@@ -8,6 +8,7 @@ namespace AssetStudio
|
||||
{
|
||||
public class GameObject : TreeNode
|
||||
{
|
||||
public AssetPreloadData asset;
|
||||
public List<PPtr> m_Components = new List<PPtr>();
|
||||
public PPtr m_Transform;
|
||||
public PPtr m_MeshRenderer;
|
||||
@@ -24,6 +25,7 @@ namespace AssetStudio
|
||||
{
|
||||
if (preloadData != null)
|
||||
{
|
||||
asset = preloadData;
|
||||
var sourceFile = preloadData.sourceFile;
|
||||
var reader = preloadData.InitReader();
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.IO;
|
||||
using System.Collections;
|
||||
using SharpDX;
|
||||
|
||||
/*Notes about handedness
|
||||
Converting from left-handed to right-handed and vice versa requires either:
|
||||
@@ -122,6 +123,8 @@ namespace AssetStudio
|
||||
public float[] m_UV3;
|
||||
public float[] m_UV4;
|
||||
public float[] m_Tangents;
|
||||
public uint[] m_BoneNameHashes;
|
||||
public BlendShapeData m_Shapes;
|
||||
|
||||
public class SubMesh
|
||||
{
|
||||
@@ -166,6 +169,100 @@ namespace AssetStudio
|
||||
public byte m_BitSize;
|
||||
}
|
||||
|
||||
public class BlendShapeData
|
||||
{
|
||||
public class BlendShapeVertex
|
||||
{
|
||||
public Vector3 vertex { get; set; }
|
||||
public Vector3 normal { get; set; }
|
||||
public Vector3 tangent { get; set; }
|
||||
public uint index { get; set; }
|
||||
|
||||
public BlendShapeVertex() { }
|
||||
|
||||
public BlendShapeVertex(EndianBinaryReader reader)
|
||||
{
|
||||
vertex = reader.ReadVector3();
|
||||
normal = reader.ReadVector3();
|
||||
tangent = reader.ReadVector3();
|
||||
index = reader.ReadUInt32();
|
||||
}
|
||||
}
|
||||
|
||||
public class MeshBlendShape
|
||||
{
|
||||
public uint firstVertex { get; set; }
|
||||
public uint vertexCount { get; set; }
|
||||
public bool hasNormals { get; set; }
|
||||
public bool hasTangents { get; set; }
|
||||
|
||||
public MeshBlendShape() { }
|
||||
|
||||
public MeshBlendShape(EndianBinaryReader reader)
|
||||
{
|
||||
firstVertex = reader.ReadUInt32();
|
||||
vertexCount = reader.ReadUInt32();
|
||||
hasNormals = reader.ReadBoolean();
|
||||
hasTangents = reader.ReadBoolean();
|
||||
reader.ReadBytes(2);
|
||||
}
|
||||
}
|
||||
|
||||
public class MeshBlendShapeChannel
|
||||
{
|
||||
public string name { get; set; }
|
||||
public uint nameHash { get; set; }
|
||||
public int frameIndex { get; set; }
|
||||
public int frameCount { get; set; }
|
||||
|
||||
public MeshBlendShapeChannel() { }
|
||||
|
||||
public MeshBlendShapeChannel(EndianBinaryReader reader)
|
||||
{
|
||||
name = reader.ReadStringToNull();
|
||||
nameHash = reader.ReadUInt32();
|
||||
frameIndex = reader.ReadInt32();
|
||||
frameCount = reader.ReadInt32();
|
||||
}
|
||||
}
|
||||
|
||||
public List<BlendShapeVertex> vertices { get; set; }
|
||||
public List<MeshBlendShape> shapes { get; set; }
|
||||
public List<MeshBlendShapeChannel> channels { get; set; }
|
||||
public List<float> fullWeights { get; set; }
|
||||
|
||||
public BlendShapeData(EndianBinaryReader reader)
|
||||
{
|
||||
int numVerts = reader.ReadInt32();
|
||||
vertices = new List<BlendShapeVertex>(numVerts);
|
||||
for (int i = 0; i < numVerts; i++)
|
||||
{
|
||||
vertices.Add(new BlendShapeVertex(reader));
|
||||
}
|
||||
|
||||
int numShapes = reader.ReadInt32();
|
||||
shapes = new List<MeshBlendShape>(numShapes);
|
||||
for (int i = 0; i < numShapes; i++)
|
||||
{
|
||||
shapes.Add(new MeshBlendShape(reader));
|
||||
}
|
||||
|
||||
int numChannels = reader.ReadInt32();
|
||||
channels = new List<MeshBlendShapeChannel>(numChannels);
|
||||
for (int i = 0; i < numChannels; i++)
|
||||
{
|
||||
channels.Add(new MeshBlendShapeChannel(reader));
|
||||
}
|
||||
|
||||
int numWeights = reader.ReadInt32();
|
||||
fullWeights = new List<float>(numWeights);
|
||||
for (int i = 0; i < numWeights; i++)
|
||||
{
|
||||
fullWeights.Add(reader.ReadSingle());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public float bytesToFloat(byte[] inputBytes)
|
||||
{
|
||||
float result = 0;
|
||||
@@ -177,7 +274,7 @@ namespace AssetStudio
|
||||
result = inputBytes[0] / 255.0f;
|
||||
break;
|
||||
case 2:
|
||||
result = Half.ToHalf(inputBytes, 0);
|
||||
result = System.Half.ToHalf(inputBytes, 0);
|
||||
break;
|
||||
case 4:
|
||||
result = BitConverter.ToSingle(inputBytes, 0);
|
||||
@@ -420,25 +517,7 @@ namespace AssetStudio
|
||||
#region BlendShapeData and BindPose for 4.3.0 and later
|
||||
else if (version[0] >= 5 || (version[0] == 4 && version[1] >= 3))
|
||||
{
|
||||
int m_ShapeVertices_size = reader.ReadInt32();
|
||||
if (m_ShapeVertices_size > 0)
|
||||
{
|
||||
//bool stop = true;
|
||||
}
|
||||
reader.Position += m_ShapeVertices_size * 40; //vertex positions, normals, tangents & uint index
|
||||
|
||||
int shapes_size = reader.ReadInt32();
|
||||
reader.Position += shapes_size * 12; //uint firstVertex, vertexCount; bool hasNormals, hasTangents
|
||||
|
||||
int channels_size = reader.ReadInt32();
|
||||
for (int c = 0; c < channels_size; c++)
|
||||
{
|
||||
string channel_name = reader.ReadAlignedString();
|
||||
reader.Position += 12; //uint nameHash; int frameIndex, frameCount
|
||||
}
|
||||
|
||||
int fullWeights_size = reader.ReadInt32();
|
||||
reader.Position += fullWeights_size * 4; //floats
|
||||
m_Shapes = new BlendShapeData(reader);//TODO 4.3 down
|
||||
|
||||
m_BindPose = new float[reader.ReadInt32()][,];
|
||||
for (int i = 0; i < m_BindPose.Length; i++)
|
||||
@@ -451,7 +530,11 @@ namespace AssetStudio
|
||||
}
|
||||
|
||||
int m_BoneNameHashes_size = reader.ReadInt32();
|
||||
reader.Position += m_BoneNameHashes_size * 4; //uints
|
||||
m_BoneNameHashes = new uint[m_BoneNameHashes_size];
|
||||
for (int i = 0; i < m_BoneNameHashes_size; i++)
|
||||
{
|
||||
m_BoneNameHashes[i] = reader.ReadUInt32();
|
||||
}
|
||||
|
||||
uint m_RootBoneNameHash = reader.ReadUInt32();
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ using System.Text;
|
||||
|
||||
namespace AssetStudio
|
||||
{
|
||||
class MeshRenderer
|
||||
public class MeshRenderer
|
||||
{
|
||||
public PPtr m_GameObject;
|
||||
public bool m_Enabled;
|
||||
@@ -15,6 +15,8 @@ namespace AssetStudio
|
||||
public ushort m_LightmapIndexDynamic;
|
||||
public PPtr[] m_Materials;
|
||||
|
||||
protected MeshRenderer() { }
|
||||
|
||||
public MeshRenderer(AssetPreloadData preloadData)
|
||||
{
|
||||
var sourceFile = preloadData.sourceFile;
|
||||
|
||||
@@ -5,17 +5,11 @@ using System.Text;
|
||||
|
||||
namespace AssetStudio
|
||||
{
|
||||
public class SkinnedMeshRenderer
|
||||
public class SkinnedMeshRenderer : MeshRenderer
|
||||
{
|
||||
public PPtr m_GameObject;
|
||||
public bool m_Enabled;
|
||||
public byte m_CastShadows;
|
||||
public bool m_ReceiveShadows;
|
||||
public ushort m_LightmapIndex;
|
||||
public ushort m_LightmapIndexDynamic;
|
||||
public PPtr[] m_Materials;
|
||||
public PPtr m_Mesh;
|
||||
public PPtr[] m_Bones;
|
||||
public List<float> m_BlendShapeWeights;
|
||||
|
||||
public SkinnedMeshRenderer(AssetPreloadData preloadData)
|
||||
{
|
||||
@@ -126,13 +120,17 @@ namespace AssetStudio
|
||||
}
|
||||
else
|
||||
{
|
||||
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3))
|
||||
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3))//4.3 and up
|
||||
{
|
||||
int m_BlendShapeWeights = reader.ReadInt32();
|
||||
reader.Position += m_BlendShapeWeights * 4; //floats
|
||||
int numBSWeights = reader.ReadInt32();
|
||||
m_BlendShapeWeights = new List<float>(numBSWeights);
|
||||
for (int i = 0; i < numBSWeights; i++)
|
||||
{
|
||||
m_BlendShapeWeights.Add(reader.ReadSingle());
|
||||
}
|
||||
}
|
||||
|
||||
if (version[0] > 4 || (version[0] >= 3 && version[1] >= 5))
|
||||
/*if (version[0] > 4 || (version[0] >= 3 && version[1] >= 5))
|
||||
{
|
||||
PPtr m_RootBone = sourceFile.ReadPPtr();
|
||||
}
|
||||
@@ -143,7 +141,7 @@ namespace AssetStudio
|
||||
float[] m_Center = { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() };
|
||||
float[] m_Extent = { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() };
|
||||
bool m_DirtyAABB = reader.ReadBoolean();
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user