Just a little thing I'm working on for Concertroid

This commit is contained in:
Michael Becker 2019-08-19 12:28:08 -04:00
parent b9965ccda9
commit cc85d50491
3 changed files with 324 additions and 0 deletions

View File

@ -0,0 +1,56 @@
using System;
using UniversalEditor.ObjectModels.Markup;
using UniversalEditor.ObjectModels.Multimedia3D.Model;
namespace UniversalEditor.TestProject
{
public static class ExtensionMethods
{
public static MarkupTagElement ToXML(this ModelVertex vertex, string name)
{
MarkupTagElement tagVertex = new MarkupTagElement();
tagVertex.FullName = name;
tagVertex.Elements.Add(vertex.Position.ToXML("cr:position"));
tagVertex.Elements.Add(vertex.Normal.ToXML("cr:normal"));
tagVertex.Elements.Add(vertex.Texture.ToXML("cr:texture"));
return tagVertex;
}
public static MarkupTagElement ToXML(this TextureVector2 texture, string name)
{
MarkupTagElement tag = new MarkupTagElement();
tag.FullName = name;
tag.Attributes.Add("u", texture.U.ToString());
tag.Attributes.Add("v", texture.V.ToString());
return tag;
}
public static MarkupTagElement ToXML(this PositionVector4 position, string name)
{
MarkupTagElement tag = new MarkupTagElement();
tag.FullName = name;
tag.Attributes.Add("x", position.X.ToString());
tag.Attributes.Add("y", position.Y.ToString());
tag.Attributes.Add("z", position.Z.ToString());
tag.Attributes.Add("w", position.W.ToString());
return tag;
}
public static MarkupTagElement ToXML(this PositionVector3 position, string name)
{
MarkupTagElement tag = new MarkupTagElement();
tag.FullName = name;
tag.Attributes.Add("x", position.X.ToString());
tag.Attributes.Add("y", position.Y.ToString());
tag.Attributes.Add("z", position.Z.ToString());
return tag;
}
public static MarkupTagElement ToXML(this PositionVector2 position, string name)
{
MarkupTagElement tag = new MarkupTagElement();
tag.FullName = name;
tag.Attributes.Add("x", position.X.ToString());
tag.Attributes.Add("y", position.Y.ToString());
return tag;
}
}
}

View File

@ -1,20 +1,279 @@
using System;
using System.Collections.Generic;
using System.Text;
using UniversalEditor.Accessors;
using UniversalEditor.DataFormats.Markup.XML;
using UniversalEditor.DataFormats.Package.OpenPackagingConvention;
using UniversalEditor.ObjectModels.FileSystem;
using UniversalEditor.ObjectModels.Markup;
using UniversalEditor.ObjectModels.Multimedia3D.Model;
using UniversalEditor.ObjectModels.Package;
namespace UniversalEditor.TestProject
{
class MainClass
{
class OPCModelDataFormat : OPCDataFormat
{
private static DataFormatReference _dfr = null;
protected override DataFormatReference MakeReferenceInternal()
{
if (_dfr == null)
{
_dfr = new DataFormatReference(this.GetType());
_dfr.Capabilities.Add(typeof(ModelObjectModel), DataFormatCapabilities.All);
}
return _dfr;
}
protected override void BeforeLoadInternal(Stack<ObjectModel> objectModels)
{
base.BeforeLoadInternal(objectModels);
objectModels.Push(new PackageObjectModel());
}
protected override void AfterLoadInternal(Stack<ObjectModel> objectModels)
{
base.AfterLoadInternal(objectModels);
PackageObjectModel package = (objectModels.Pop() as PackageObjectModel);
ModelObjectModel model = (objectModels.Pop() as ModelObjectModel);
}
protected override void BeforeSaveInternal(Stack<ObjectModel> objectModels)
{
ModelObjectModel model = (objectModels.Pop() as ModelObjectModel);
PackageObjectModel package = new PackageObjectModel();
MarkupObjectModel momDocument = CreateDocument(model);
File file = package.FileSystem.AddFile("model/document.xml");
file.SetObjectModel<MarkupObjectModel>(new XMLDataFormat(), momDocument);
objectModels.Push(package);
base.BeforeSaveInternal(objectModels);
}
private MarkupObjectModel CreateDocument(ModelObjectModel model)
{
MarkupObjectModel momDocument = new MarkupObjectModel();
MarkupTagElement tagModel = new MarkupTagElement();
tagModel.FullName = "cr:model";
tagModel.Attributes.Add("xmlns:cr", "urn:net.alcetech.schemas.Concertroid.OPC.Model");
MarkupTagElement tagSettings = new MarkupTagElement();
tagSettings.FullName = "cr:settings";
MarkupTagElement tagSettingIgnoreEdgeFlag = new MarkupTagElement();
tagSettingIgnoreEdgeFlag.FullName = "cr:setting";
tagSettingIgnoreEdgeFlag.Attributes.Add("name", "ignoreEdgeFlag");
tagSettingIgnoreEdgeFlag.Attributes.Add("value", model.IgnoreEdgeFlag ? "true" : "false");
tagModel.Elements.Add(tagSettings);
MarkupTagElement tagBones = new MarkupTagElement();
tagBones.FullName = "cr:bones";
foreach (ModelBone bone in model.Bones)
{
MarkupTagElement tagBone = new MarkupTagElement();
tagBone.FullName = "cr:bone";
tagBone.Attributes.Add("id", "b" + model.Bones.IndexOf(bone).ToString());
MarkupTagElement tagAngleLimit = new MarkupTagElement();
tagAngleLimit.FullName = "cr:angleLimit";
tagAngleLimit.Attributes.Add("enabled", bone.AngleLimit.Enabled ? "true" : "false");
tagAngleLimit.Elements.Add(bone.AngleLimit.Lower.ToXML("cr:lower"));
tagAngleLimit.Elements.Add(bone.AngleLimit.Upper.ToXML("cr:upper"));
tagBone.Elements.Add(tagAngleLimit);
tagBone.Attributes.Add("type", BoneTypeToXML(bone.BoneType));
tagBone.Attributes.Add("childId", "b" + model.Bones.IndexOf(bone.ChildBone).ToString());
tagBone.Attributes.Add("ikNumber", bone.IKNumber.ToString());
tagBone.Attributes.Add("name", bone.Name);
tagBone.Attributes.Add("parentId", "b" + model.Bones.IndexOf(bone.ParentBone).ToString());
tagBone.Elements.Add(bone.Position.ToXML("cr:position"));
tagBone.Elements.Add(bone.Rotation.ToXML("cr:rotation"));
tagBone.Elements.Add(bone.Vector3Offset.ToXML("cr:offset"));
tagBones.Elements.Add(tagBone);
}
tagModel.Elements.Add(tagBones);
MarkupTagElement tagExpressions = new MarkupTagElement();
tagExpressions.FullName = "cr:expressions";
foreach (ushort u in model.Expressions)
{
MarkupTagElement tagExpression = new MarkupTagElement();
tagExpression.FullName = "cr:expression";
tagExpression.Attributes.Add("value", u.ToString());
tagExpressions.Elements.Add(tagExpression);
}
tagModel.Elements.Add(tagExpressions);
MarkupTagElement tagJoints = new MarkupTagElement();
tagJoints.FullName = "cr:joints";
foreach (ModelJoint joint in model.Joints)
{
MarkupTagElement tagJoint = new MarkupTagElement();
tagJoint.FullName = "cr:joint";
MarkupTagElement tagLimits = new MarkupTagElement();
tagLimits.FullName = "cr:limits";
tagLimits.Elements.Add(joint.LimitAngleHigh.ToXML("cr:angleHigh"));
tagLimits.Elements.Add(joint.LimitAngleLow.ToXML("cr:angleLow"));
tagLimits.Elements.Add(joint.LimitMoveHigh.ToXML("cr:moveHigh"));
tagLimits.Elements.Add(joint.LimitMoveLow.ToXML("cr:moveLow"));
tagJoint.Elements.Add(tagLimits);
tagJoint.Attributes.Add("name", joint.Name);
tagJoint.Elements.Add(joint.Position.ToXML("cr:position"));
tagJoint.Elements.Add(joint.Rotation.ToXML("cr:rotation"));
MarkupTagElement tagSpringConstraint = new MarkupTagElement();
tagSpringConstraint.FullName = "cr:springConstraint";
tagSpringConstraint.Elements.Add(joint.SpringConstraintMovementStiffness.ToXML("cr:movementStiffness"));
tagSpringConstraint.Elements.Add(joint.SpringConstraintRotationStiffness.ToXML("cr:rotationStiffness"));
tagJoint.Elements.Add(tagSpringConstraint);
tagJoints.Elements.Add(tagJoint);
}
tagModel.Elements.Add(tagJoints);
MarkupTagElement tagIKHandles = new MarkupTagElement();
tagIKHandles.FullName = "cr:ikHandles";
foreach (ModelIK ik in model.IK)
{
MarkupTagElement tagIKHandle = new MarkupTagElement();
tagIKHandle.FullName = "cr:ikHandle";
tagIKHandle.Attributes.Add("effectedBoneId", model.Bones.IndexOf(ik.EffBone).ToString());
tagIKHandle.Attributes.Add("index", ik.Index.ToString());
tagIKHandle.Attributes.Add("limitOnce", ik.LimitOnce.ToString());
tagIKHandle.Attributes.Add("loopCount", ik.LoopCount.ToString());
tagIKHandle.Attributes.Add("targetBoneId", model.Bones.IndexOf(ik.TargetBone).ToString());
MarkupTagElement tagBoneList = new MarkupTagElement();
tagBoneList.FullName = "cr:boneList";
foreach (ModelBone bone in ik.BoneList)
{
MarkupTagElement tagBone = new MarkupTagElement();
tagBone.FullName = "cr:boneReference";
tagBone.Attributes.Add("boneId", model.Bones.IndexOf(bone).ToString());
tagBoneList.Elements.Add(tagBone);
}
tagIKHandle.Elements.Add(tagBoneList);
}
tagModel.Elements.Add(tagIKHandles);
MarkupTagElement tagSurfaces = new MarkupTagElement();
tagSurfaces.FullName = "cr:surfaces";
foreach (ModelSurface surf in model.Surfaces)
{
MarkupTagElement tagSurface = new MarkupTagElement();
tagSurface.FullName = "cr:surface";
MarkupTagElement tagTriangles = new MarkupTagElement();
tagTriangles.FullName = "cr:triangles";
foreach (ModelTriangle tri in surf.Triangles)
{
MarkupTagElement tagTriangle = new MarkupTagElement();
tagTriangle.FullName = "cr:triangle";
tagTriangle.Elements.Add(tri.Vertex1.ToXML("cr:vertex"));
tagTriangle.Elements.Add(tri.Vertex2.ToXML("cr:vertex"));
tagTriangle.Elements.Add(tri.Vertex3.ToXML("cr:vertex"));
tagTriangles.Elements.Add(tagTriangle);
}
tagSurface.Elements.Add(tagTriangles);
MarkupTagElement tagVertices = new MarkupTagElement();
tagVertices.FullName = "cr:vertices";
foreach (ModelVertex vtx in surf.Vertices)
{
tagVertices.Elements.Add(vtx.ToXML("cr:vertex"));
}
tagSurface.Elements.Add(tagVertices);
tagSurfaces.Elements.Add(tagSurface);
}
tagModel.Elements.Add(tagSurfaces);
MarkupTagElement tagRigidBodies = new MarkupTagElement();
tagRigidBodies.FullName = "cr:rigidBodies";
foreach (ModelRigidBody rb in model.RigidBodies)
{
MarkupTagElement tagRigidBody = new MarkupTagElement();
tagRigidBody.FullName = "cr:rigidBody";
tagRigidBody.Attributes.Add("boneId", "b" + model.Bones.IndexOf(rb.Bone).ToString());
tagRigidBody.Elements.Add(rb.BoxSize.ToXML("cr:boxSize"));
tagRigidBody.Attributes.Add("boxType", rb.BoxType.ToString());
tagRigidBody.Attributes.Add("friction", rb.Friction.ToString());
tagRigidBody.Attributes.Add("groupId", rb.GroupID.ToString());
tagRigidBody.Attributes.Add("itype", rb.IType.ToString());
tagRigidBody.Attributes.Add("mass", rb.Mass.ToString());
tagRigidBody.Attributes.Add("mode", rb.Mode.ToString());
tagRigidBody.Attributes.Add("name", rb.Name);
tagRigidBody.Elements.Add(rb.Position.ToXML("cr:position"));
tagRigidBody.Attributes.Add("positionDamping", rb.PositionDamping.ToString());
tagRigidBody.Attributes.Add("restitution", rb.Restitution.ToString());
tagRigidBody.Elements.Add(rb.Rotation.ToXML("cr:rotation"));
tagRigidBody.Attributes.Add("rotationDamping", rb.RotationDamping.ToString());
tagRigidBodies.Elements.Add(tagRigidBody);
}
tagModel.Elements.Add(tagRigidBodies);
momDocument.Elements.Add(tagModel);
return momDocument;
}
private string BoneTypeToXML(ModelBoneType boneType)
{
switch (boneType)
{
case ModelBoneType.Blank: return "blank";
case ModelBoneType.Hidden: return "hidden";
case ModelBoneType.IKConnect: return "inverseKinematicsConnect";
case ModelBoneType.IKInfluencedRotation: return "inverseKinematicsInfluencedRotation";
case ModelBoneType.InfluencedRotation: return "influencedRotation";
case ModelBoneType.InverseKinematics: return "inverseKinematics";
case ModelBoneType.Revolution: return "revolution";
case ModelBoneType.Rotate: return "rotate";
case ModelBoneType.RotateMove: return "rotateMove";
case ModelBoneType.Twist: return "twist";
case ModelBoneType.Unknown: return "unknown";
}
return String.Empty;
}
}
public static void Main (string [] args)
{
/*
string fileName = "/tmp/UETest/test.opc";
PackageObjectModel om = new PackageObjectModel ();
OPCDataFormat df = new OPCDataFormat ();
Document.Save (om, df, new FileAccessor (fileName, true, true));
*/
DateTime start = DateTime.Now;
ModelObjectModel model = new ModelObjectModel();
UniversalEditor.DataFormats.Multimedia3D.Model.PolygonMovieMaker.PMDModelDataFormat pmd = new DataFormats.Multimedia3D.Model.PolygonMovieMaker.PMDModelDataFormat();
Document.Load(model, pmd, new FileAccessor("/home/beckermj/Documents/UE Tests/Open Packaging Convention/Concertroid Model Data OPC (.pmdx)/test.pmdx_source/model/kio_miku_20111121.pmd"));
Document.Save(model, new OPCModelDataFormat(), new FileAccessor("/home/beckermj/Documents/UE Tests/Open Packaging Convention/Concertroid Model Data OPC (.pmdx)/kio_miku.pmdx", true, true));
DateTime end = DateTime.Now;
Console.WriteLine("Took " + (end - start).ToString() + " with buffer size " + MemoryAccessor.DefaultBufferAllocationSize);
}
}
}

View File

@ -32,6 +32,7 @@
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ExtensionMethods.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Plugins\UniversalEditor.Plugins.Microsoft\UniversalEditor.Plugins.Microsoft.csproj">
@ -50,6 +51,14 @@
<Project>{76FD1306-9CA4-428F-993B-B7E4EEEACBF3}</Project>
<Name>UniversalEditor.Plugins.FileSystem</Name>
</ProjectReference>
<ProjectReference Include="..\..\Plugins\UniversalEditor.Plugins.Multimedia\UniversalEditor.Plugins.Multimedia.csproj">
<Project>{BE4D0BA3-0888-42A5-9C09-FC308A4509D2}</Project>
<Name>UniversalEditor.Plugins.Multimedia</Name>
</ProjectReference>
<ProjectReference Include="..\..\Plugins\UniversalEditor.Plugins.Multimedia3D\UniversalEditor.Plugins.Multimedia3D.csproj">
<Project>{4FD9DB1D-76AA-48D1-8446-95376C4A2BC2}</Project>
<Name>UniversalEditor.Plugins.Multimedia3D</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>