Initial commit for AniMiku plugin

This commit is contained in:
Michael Becker 2014-03-28 09:33:08 -04:00
parent 971b2b8d20
commit 859ae16b72
10 changed files with 624 additions and 0 deletions

View File

@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Text;
using UniversalEditor.ObjectModels.FileSystem;
namespace UniversalEditor.DataFormats.AniMiku.AnimatedTexture
{
public class AMTDataFormat : DataFormat
{
private static DataFormatReference _dfr = null;
public override DataFormatReference MakeReference()
{
if (_dfr == null)
{
_dfr = base.MakeReference();
_dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All);
_dfr.Filters.Add("AniMiku texture package", new string[] { "*.amt" });
}
return _dfr;
}
protected override void LoadInternal(ref ObjectModel objectModel)
{
FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel);
if (fsom == null) return;
IO.BinaryReader br = base.Stream.BinaryReader;
int unknown = br.ReadInt32();
int count = br.ReadInt32();
for (int i = 0; i < count; i++)
{
int dataSize = br.ReadInt32();
byte[] data = br.ReadBytes(dataSize);
fsom.Files.Add(i.ToString().PadLeft(8, '0'), data);
}
}
protected override void SaveInternal(ObjectModel objectModel)
{
FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel);
if (fsom == null) return;
IO.BinaryWriter bw = base.Stream.BinaryWriter;
int unknown = 150;
bw.Write(unknown);
bw.Write(fsom.Files.Count);
foreach (File file in fsom.Files)
{
byte[] data = file.GetDataAsByteArray();
bw.Write(data.Length);
bw.Write(data);
}
}
}
}

View File

@ -0,0 +1,116 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UniversalEditor;
using UniversalEditor.DataFormats.PropertyList.Microsoft;
using UniversalEditor.ObjectModels.PropertyList;
using UniversalEditor.ObjectModels.Concertroid;
using UniversalEditor.ObjectModels.Concertroid.Concert;
namespace UniversalEditor.DataFormats.AniMiku.Concert
{
public class AniMikuINIDataFormat : WindowsConfigurationDataFormat
{
public override DataFormatReference MakeReference()
{
DataFormatReference dfr = base.MakeReference();
dfr.Clear();
dfr.Capabilities.Add(typeof(ConcertObjectModel), DataFormatCapabilities.All);
dfr.Filters.Add("AniMiku performance", new byte?[][] { new byte?[] { (byte)'A', (byte)'M', (byte)'P', (byte)'V', (byte)'2', (byte)'\r', (byte)'\n' } }, new string[] { "*.amp" });
return dfr;
}
protected override void BeforeLoadInternal(Stack<ObjectModel> objectModels)
{
base.BeforeLoadInternal(objectModels);
objectModels.Push(new PropertyListObjectModel());
string magic = base.Stream.TextReader.ReadLine();
if (magic != "AMPV2") throw new DataFormatException(UniversalEditor.Localization.StringTable.ErrorDataFormatInvalid);
}
protected override void AfterLoadInternal(Stack<ObjectModel> objectModels)
{
base.AfterLoadInternal(objectModels);
PropertyListObjectModel plom = (objectModels.Pop() as PropertyListObjectModel);
ConcertObjectModel concert = (objectModels.Pop() as ConcertObjectModel);
Group grpPERF = plom.Groups["PERF"];
if (grpPERF == null) throw new DataFormatException(UniversalEditor.Localization.StringTable.ErrorDataFormatInvalid);
Property prpPERFnum = grpPERF.Properties["num"];
if (prpPERFnum == null) throw new DataFormatException(UniversalEditor.Localization.StringTable.ErrorDataFormatInvalid);
int perfNum = Int32.Parse(prpPERFnum.Value.ToString());
for (int i = 0; i < perfNum; i++)
{
Group grp = plom.Groups["CHP-" + i.ToString()];
Performance perf = new Performance();
Property prpName = grp.Properties["name"];
perf.Title = prpName.Value.ToString();
Property prpVmd1 = grp.Properties["vmd1"];
Property prpVmd2 = grp.Properties["vmd2"];
Property prpSound = grp.Properties["sound"];
Property prpDelay = grp.Properties["delay"];
Property prpModel1 = grp.Properties["model1"];
Property prpModel2 = grp.Properties["model2"];
Property prpOffset1 = grp.Properties["offset1"];
Property prpOffset2 = grp.Properties["offset2"];
#region Performer 1
{
Performer performer = new Performer();
performer.Character = new Character();
performer.Character.FullName = System.IO.Path.GetFileNameWithoutExtension(prpModel1.Value.ToString());
performer.Costume = new Costume();
performer.Costume.Title = System.IO.Path.GetFileNameWithoutExtension(prpModel1.Value.ToString());
performer.Costume.ModelFileName = prpModel1.Value.ToString();
performer.Animation = new Animation();
performer.Animation.FileName = prpVmd1.Value.ToString();
performer.Offset = new PositionVector3((double)prpOffset1.Value, 0, 0);
perf.Performers.Add(performer);
}
#endregion
#region Performer 2
{
Performer performer = new Performer();
performer.Character = new Character();
performer.Character.FullName = System.IO.Path.GetFileNameWithoutExtension(prpModel2.Value.ToString());
performer.Costume = new Costume();
performer.Costume.Title = System.IO.Path.GetFileNameWithoutExtension(prpModel2.Value.ToString());
performer.Costume.ModelFileName = prpModel2.Value.ToString();
performer.Animation = new Animation();
performer.Animation.FileName = prpVmd2.Value.ToString();
performer.Offset = new PositionVector3((double)prpOffset2.Value, 0, 0);
perf.Performers.Add(performer);
}
#endregion
#region Song
Song song = new Song();
song.AudioFileName = prpSound.Value.ToString();
song.Delay = (int)prpDelay.Value;
song.Title = System.IO.Path.GetFileNameWithoutExtension(song.AudioFileName);
perf.Song = song;
#endregion
concert.Performances.Add(perf);
}
}
}
}

View File

@ -0,0 +1,62 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UniversalEditor.Accessors.Stream;
using UniversalEditor.ObjectModels.AniMiku.PMDExtension;
using UniversalEditor.DataFormats.AniMiku.PMDExtension;
using UniversalEditor.DataFormats.Multimedia3D.Model.PolygonMovieMaker;
using UniversalEditor.ObjectModels.Multimedia3D.Model;
namespace UniversalEditor.DataFormats.AniMiku.ExtendedPMD
{
public class ExtendedPMDDataFormat : PMDModelDataFormat
{
private static DataFormatReference _dfr = null;
public override DataFormatReference MakeReference()
{
if (_dfr == null)
{
_dfr = base.MakeReference();
_dfr.Clear();
_dfr.Capabilities.Add(typeof(ModelObjectModel), DataFormatCapabilities.All);
_dfr.Filters.Add("AniMiku extended Polygon Movie Maker model", new string[] { "*.apmd" });
_dfr.Priority = 1;
}
return _dfr;
}
protected override void AfterLoadInternal(Stack<ObjectModel> objectModels)
{
base.AfterLoadInternal(objectModels);
ModelObjectModel model = (objectModels.Pop() as ModelObjectModel);
// attempt to load more
IO.BinaryReader br = base.Stream.BinaryReader;
if (br.EndOfStream) return;
byte[] datas = br.ReadUntil("END", false);
PMDExtensionObjectModel pmdo = new PMDExtensionObjectModel();
PMDExtensionDataFormat pmdf = new PMDExtensionDataFormat();
StreamAccessor accessor = new StreamAccessor(pmdo, pmdf);
pmdf.Model = model;
System.IO.MemoryStream ms = new System.IO.MemoryStream(datas);
accessor.Open(ms);
accessor.Load();
accessor.Close();
foreach (PMDExtensionTextureGroup file in pmdo.ArchiveFiles)
{
foreach (string fileName in file.TextureImageFileNames)
{
file.Material.Textures.Add(file.ArchiveFileName + "::/" + fileName, null, ModelTextureFlags.Texture);
}
}
}
}
}

View File

@ -0,0 +1,93 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UniversalEditor.ObjectModels.AniMiku.PMDExtension;
using UniversalEditor.ObjectModels.Multimedia3D.Model;
namespace UniversalEditor.DataFormats.AniMiku.PMDExtension
{
internal class PMDExtensionDataFormat : DataFormat
{
private static DataFormatReference _dfr = null;
public override DataFormatReference MakeReference()
{
if (_dfr == null)
{
_dfr = base.MakeReference();
_dfr.Capabilities.Add(typeof(PMDExtensionObjectModel), DataFormatCapabilities.All);
// _dfr.Filters.Add("AniMiku PMD extension");
}
return _dfr;
}
protected override void LoadInternal(ref ObjectModel objectModel)
{
PMDExtensionObjectModel pmdo = (objectModel as PMDExtensionObjectModel);
if (pmdo == null) return;
IO.BinaryReader br = base.Stream.BinaryReader;
foreach (ModelMaterial mat in mvarModel.Materials)
{
mat.AlwaysLight = br.ReadBoolean();
mat.EnableAnimation = br.ReadBoolean();
mat.EnableGlow = br.ReadBoolean();
if (mat.EnableAnimation)
{
int textureCount = br.ReadInt32();
string archiveFileName = br.ReadNullTerminatedString(100);
PMDExtensionTextureGroup file = new PMDExtensionTextureGroup();
file.Material = mat;
file.ArchiveFileName = archiveFileName;
for (int i = 0; i < textureCount; i++)
{
string textureFileName = br.ReadNullTerminatedString(256);
file.TextureImageFileNames.Add(textureFileName);
}
pmdo.ArchiveFiles.Add(file);
}
}
int originalModelLength = br.ReadInt32();
string END = br.ReadFixedLengthString(3);
}
protected override void SaveInternal(ObjectModel objectModel)
{
#if READYTOSAVE
IO.BinaryWriter bw = base.Stream.BinaryWriter;
foreach (ModelMaterial mat in mvarModel.Materials)
{
bw.Write(mat.AlwaysLight);
bw.Write(mat.EnableAnimation);
bw.Write(mat.EnableGlow);
if (mat.EnableAnimation)
{
// TODO: figure out how to get texture count for the model
int textureCount = br.ReadInt32();
string archiveFileName = br.ReadNullTerminatedString(100);
PMDExtensionTextureGroup file = new PMDExtensionTextureGroup();
file.Material = mat;
file.ArchiveFileName = archiveFileName;
for (int i = 0; i < textureCount; i++)
{
string textureFileName = br.ReadNullTerminatedString(256);
file.TextureImageFileNames.Add(textureFileName);
}
pmdo.ArchiveFiles.Add(file);
}
}
int originalModelLength = br.ReadInt32();
string END = br.ReadFixedLengthString(3);
#endif
throw new NotImplementedException();
}
private ModelObjectModel mvarModel = null;
public ModelObjectModel Model { get { return mvarModel; } set { mvarModel = value; } }
}
}

View File

@ -0,0 +1,75 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UniversalEditor.ObjectModels.Multimedia3D.Motion;
namespace UniversalEditor.DataFormats.Multimedia3D.Motion.AniMiku
{
public class AniMikuMotionDataFormat : DataFormat
{
private static DataFormatReference _dfr = null;
public override DataFormatReference MakeReference()
{
if (_dfr == null)
{
_dfr = base.MakeReference();
_dfr.Capabilities.Add(typeof(MotionObjectModel), DataFormatCapabilities.All);
_dfr.Filters.Add("AniMiku motion data", new byte?[][] { new byte?[] { (byte)'a', (byte)'m', (byte)'d' } }, new string[] { "*.amd" });
}
return _dfr;
}
protected override void LoadInternal(ref ObjectModel objectModel)
{
IO.BinaryReader br = new IO.BinaryReader(base.Stream.BaseStream, System.Text.Encoding.UTF8);
br.BaseStream.Position = 0;
MotionObjectModel motion = (objectModel as MotionObjectModel);
string amd = br.ReadFixedLengthString(3);
if (amd != "amd") throw new InvalidDataFormatException("File does not begin with \"amd\"");
float version = br.ReadSingle();
if (version != 1.0) Console.WriteLine("AniMiku: do not know how to parse version " + version.ToString());
uint boneCount = br.ReadUInt32();
for (uint i = 0; i < boneCount; i++)
{
string boneName = br.ReadString();
uint frameCount = br.ReadUInt32();
for (uint j = 0; j < frameCount; j++)
{
uint frameIndex = br.ReadUInt32();
MotionFrame frame = new MotionFrame();
frame.Index = frameIndex;
float px = br.ReadSingle();
float py = br.ReadSingle();
float pz = br.ReadSingle();
float rx = br.ReadSingle();
float ry = br.ReadSingle();
float rz = br.ReadSingle();
float rw = br.ReadSingle();
byte[] interpolationData = br.ReadBytes(64);
MotionBoneRepositionAction repos = new MotionBoneRepositionAction();
repos.BoneName = boneName;
repos.Position = new PositionVector3(px, py, pz);
repos.Rotation = new PositionVector4(rx, ry, rz, rw);
frame.Actions.Add(repos);
motion.Frames.Add(frame);
}
}
}
protected override void SaveInternal(ObjectModel objectModel)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.ObjectModels.AniMiku.PMDExtension
{
public class PMDExtensionArchiveFile : ICloneable
{
public class PMDExtensionArchiveFileCollection
: System.Collections.ObjectModel.Collection<PMDExtensionArchiveFile>
{
}
private string mvarName = String.Empty;
public string Name { get { return mvarName; } set { mvarName = value; } }
private System.Collections.Specialized.StringCollection mvarTextureImageFileNames = new System.Collections.Specialized.StringCollection();
public System.Collections.Specialized.StringCollection TextureImageFileNames { get { return mvarTextureImageFileNames; } }
public object Clone()
{
PMDExtensionArchiveFile clone = new PMDExtensionArchiveFile();
clone.Name = (mvarName.Clone() as string);
foreach (string s in mvarTextureImageFileNames)
{
clone.TextureImageFileNames.Add(s.Clone() as string);
}
return clone;
}
}
}

View File

@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UniversalEditor.ObjectModels.AniMiku.PMDExtension
{
internal class PMDExtensionObjectModel : ObjectModel
{
private static ObjectModelReference _omr = null;
public override ObjectModelReference MakeReference()
{
if (_omr == null)
{
_omr = base.MakeReference();
_omr.Title = "AniMiku PMD model extension";
}
return _omr;
}
public override void Clear()
{
mvarArchiveFiles.Clear();
}
public override void CopyTo(ObjectModel where)
{
PMDExtensionObjectModel clone = (where as PMDExtensionObjectModel);
if (clone == null) return;
foreach (PMDExtensionTextureGroup file in mvarArchiveFiles)
{
clone.ArchiveFiles.Add(file.Clone() as PMDExtensionTextureGroup);
}
}
private PMDExtensionTextureGroup.PMDExtensionArchiveFileCollection mvarArchiveFiles = new PMDExtensionTextureGroup.PMDExtensionArchiveFileCollection();
public PMDExtensionTextureGroup.PMDExtensionArchiveFileCollection ArchiveFiles
{
get { return mvarArchiveFiles; }
}
}
}

View File

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UniversalEditor.ObjectModels.Multimedia3D.Model;
namespace UniversalEditor.ObjectModels.AniMiku.PMDExtension
{
public class PMDExtensionTextureGroup : ICloneable
{
public class PMDExtensionArchiveFileCollection
: System.Collections.ObjectModel.Collection<PMDExtensionTextureGroup>
{
}
private string mvarName = String.Empty;
public string ArchiveFileName { get { return mvarName; } set { mvarName = value; } }
private System.Collections.Specialized.StringCollection mvarTextureImageFileNames = new System.Collections.Specialized.StringCollection();
public System.Collections.Specialized.StringCollection TextureImageFileNames { get { return mvarTextureImageFileNames; } }
public object Clone()
{
PMDExtensionTextureGroup clone = new PMDExtensionTextureGroup();
clone.ArchiveFileName = (mvarName.Clone() as string);
foreach (string s in mvarTextureImageFileNames)
{
clone.TextureImageFileNames.Add(s.Clone() as string);
}
return clone;
}
private ModelMaterial mvarMaterial = null;
public ModelMaterial Material { get { return mvarMaterial; } set { mvarMaterial = value; } }
}
}

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("AniMiku plugin for Universal Editor")]
[assembly: AssemblyDescription("Provides data formats and object models to load AniMiku extended PMD model files.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Mike Becker's Software")]
[assembly: AssemblyProduct("Universal Editor Plugin Pack")]
[assembly: AssemblyCopyright("Copyright ©2012 Mike Becker's Software")]
[assembly: AssemblyTrademark("AniMiku is a trademark of Re:VB-P.")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("fe57a2f7-9093-45a5-acd5-1dbdbbe8a412")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{FEC4EAD0-8A6E-4029-A537-EBD9F420B227}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>UniversalEditor</RootNamespace>
<AssemblyName>UniversalEditor.Plugins.AniMiku</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>..\..\Output\Debug\Plugins\</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>..\..\Output\Release\Plugins\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="DataFormats\AniMiku\AnimatedTexture\AMTDataFormat.cs" />
<Compile Include="DataFormats\AniMiku\Concert\AniMikuINIDataFormat.cs" />
<Compile Include="DataFormats\AniMiku\ExtendedPMD\ExtendedPMDDataFormat.cs" />
<Compile Include="DataFormats\AniMiku\PMDExtension\PMDExtensionDataFormat.cs" />
<Compile Include="DataFormats\Multimedia3D\Motion\AniMiku\AniMikuMotionDataFormat.cs" />
<Compile Include="ObjectModels\AniMiku\PMDExtension\PMDExtensionTextureGroup.cs" />
<Compile Include="ObjectModels\AniMiku\PMDExtension\PMDExtensionObjectModel.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Neo\Neo\Neo.csproj">
<Project>{AF46D67F-5172-40E9-A0E5-7A25BDF874FD}</Project>
<Name>Neo</Name>
</ProjectReference>
<ProjectReference Include="..\..\Libraries\UniversalEditor.Core\UniversalEditor.Core.csproj">
<Project>{a92d520b-ffa3-4464-8cf6-474d18959e03}</Project>
<Name>UniversalEditor.Core</Name>
</ProjectReference>
<ProjectReference Include="..\UniversalEditor.Plugins.Concertroid\UniversalEditor.Plugins.Concertroid.csproj">
<Project>{d3bbda07-5088-454e-a16d-da24d8d88037}</Project>
<Name>UniversalEditor.Plugins.Concertroid</Name>
</ProjectReference>
<ProjectReference Include="..\UniversalEditor.Plugins.Multimedia3D\UniversalEditor.Plugins.Multimedia3D.csproj">
<Project>{4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}</Project>
<Name>UniversalEditor.Plugins.Multimedia3D</Name>
</ProjectReference>
<ProjectReference Include="..\UniversalEditor.Plugins.Multimedia\UniversalEditor.Plugins.Multimedia.csproj">
<Project>{BE4D0BA3-0888-42A5-9C09-FC308A4509D2}</Project>
<Name>UniversalEditor.Plugins.Multimedia</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>