MigrateMeta

This commit is contained in:
ousttrue
2021-01-21 14:29:04 +09:00
parent 24ff0d3fd1
commit 7a9714fff5
3 changed files with 208 additions and 100 deletions

View File

@@ -29,14 +29,15 @@ namespace UniVRM10
var dst = EditorUtility.SaveFilePanel(
"Save vrm1 file",
s_lastPath,
$"{path.FileName}_vrm1",
$"{path.FileNameWithoutExtension}_vrm1",
"vrm");
if (string.IsNullOrEmpty(dst))
{
return;
}
s_lastPath = Path.GetDirectoryName(dst);
// write result
File.WriteAllBytes(dst, vrm1Bytes);
// immediately import for GUI update

View File

@@ -127,6 +127,105 @@ namespace UniVRM10
return humanoid;
}
///
/// 互換性の無いところ
///
/// * きつくなる方向は許す
/// * 緩くなる方向は不許可(throw)
///
// "meta": {
// "title": "Alicia Solid",
// "version": "1.10",
// "author": "© DWANGO Co., Ltd.",
// "contactInformation": "https://3d.nicovideo.jp/alicia/",
// "reference": "",
// "texture": 7,
// "allowedUserName": "Everyone",
// "violentUssageName": "Disallow",
// "sexualUssageName": "Disallow",
// "commercialUssageName": "Allow",
// "otherPermissionUrl": "https://3d.nicovideo.jp/alicia/rule.html",
// "licenseName": "Other",
// "otherLicenseUrl": "https://3d.nicovideo.jp/alicia/rule.html"
// },
static UniGLTF.Extensions.VRMC_vrm.Meta MigrateMeta(ListTreeNode<JsonValue> vrm0)
{
var meta = new UniGLTF.Extensions.VRMC_vrm.Meta
{
AllowPoliticalOrReligiousUsage = false,
AllowExcessivelySexualUsage = false,
AllowExcessivelyViolentUsage = false,
AllowRedistribution = false,
AvatarPermission = AvatarPermissionType.onlyAuthor,
CommercialUsage = CommercialUsageType.personalNonProfit,
CreditNotation = CreditNotationType.required,
Modification = ModificationType.prohibited,
};
foreach (var kv in vrm0.ObjectItems())
{
var key = kv.Key.GetString();
switch (key)
{
case "title": meta.Name = kv.Value.GetString(); break;
case "version": meta.Version = kv.Value.GetString(); break;
case "author": meta.Authors = new List<string>() { kv.Value.GetString() }; break;
case "contactInformation": meta.ContactInformation = kv.Value.GetString(); break;
case "reference": meta.References = new List<string>() { kv.Value.GetString() }; break;
case "texture": meta.ThumbnailImage = kv.Value.GetInt32(); break;
case "allowedUserName":
{
var allowdUserType = kv.Value.GetString();
switch (allowdUserType)
{
case "Everyone": meta.AvatarPermission = AvatarPermissionType.everyone; break;
default: throw new NotImplementedException($"allowedUser: {allowdUserType}");
}
}
break;
case "violentUssageName": meta.AllowExcessivelyViolentUsage = kv.Value.GetString().ToLower() == "allow"; break;
case "sexualUssageName": meta.AllowExcessivelySexualUsage = kv.Value.GetString().ToLower() == "allow"; break;
case "commercialUssageName":
{
var commercialUssageType = kv.Value.GetString();
switch (commercialUssageType)
{
case "Allow": meta.CommercialUsage = CommercialUsageType.personalProfit; break;
default: meta.CommercialUsage = CommercialUsageType.personalNonProfit; break;
}
}
break;
case "otherPermissionUrl":
{
// TODO
// var url = kv.Value.GetString();
// if (!String.IsNullOrWhiteSpace(url))
// {
// throw new NotImplementedException("otherPermissionUrl not allowd");
// }
}
break;
case "otherLicenseUrl": meta.OtherLicenseUrl = kv.Value.GetString(); break;
case "licenseName":
{
// TODO
// CreditNotation = CreditNotationType.required,
}
break;
default:
throw new NotImplementedException(key);
}
}
return meta;
}
public static byte[] Migrate(byte[] src)
{
var glb = UniGLTF.Glb.Parse(src);
@@ -145,6 +244,10 @@ namespace UniVRM10
{
var vrm1 = new VRMC_vrm();
var vrm0 = json["extensions"]["VRM"];
// meta
vrm1.Meta = MigrateMeta(vrm0["meta"]);
// humanoid
vrm1.Humanoid = MigrateHumanoid(vrm0["humanoid"]);
var f = new JsonFormatter();

View File

@@ -184,127 +184,131 @@ namespace UniVRM10
// firstPerson
{
// VRMFirstPerson
controller.FirstPerson.Renderers = model.Vrm.FirstPerson.Annotations.Select(x =>
new UniVRM10.RendererFirstPersonFlags()
{
Renderer = asset.Map.Renderers[x.Node],
FirstPersonFlag = x.FirstPersonFlag
}
).ToList();
if (model.Vrm.FirstPerson != null)
{
controller.FirstPerson.Renderers = model.Vrm.FirstPerson.Annotations.Select(x =>
new UniVRM10.RendererFirstPersonFlags()
{
Renderer = asset.Map.Renderers[x.Node],
FirstPersonFlag = x.FirstPersonFlag
}
).ToList();
}
// VRMLookAtApplyer
controller.LookAt.OffsetFromHead = model.Vrm.LookAt.OffsetFromHeadBone.ToUnityVector3();
if (model.Vrm.LookAt.LookAtType == VrmLib.LookAtType.Expression)
if (model.Vrm.LookAt != null)
{
var lookAtApplyer = controller;
lookAtApplyer.LookAt.LookAtType = VRM10ControllerLookAt.LookAtTypes.Expression;
lookAtApplyer.LookAt.HorizontalOuter = new UniVRM10.CurveMapper(
model.Vrm.LookAt.HorizontalOuter.InputMaxValue,
model.Vrm.LookAt.HorizontalOuter.OutputScaling);
lookAtApplyer.LookAt.VerticalUp = new UniVRM10.CurveMapper(
model.Vrm.LookAt.VerticalUp.InputMaxValue,
model.Vrm.LookAt.VerticalUp.OutputScaling);
lookAtApplyer.LookAt.VerticalDown = new UniVRM10.CurveMapper(
model.Vrm.LookAt.VerticalDown.InputMaxValue,
model.Vrm.LookAt.VerticalDown.OutputScaling);
}
else if (model.Vrm.LookAt.LookAtType == VrmLib.LookAtType.Bone)
{
var lookAtBoneApplyer = controller;
lookAtBoneApplyer.LookAt.HorizontalInner = new UniVRM10.CurveMapper(
model.Vrm.LookAt.HorizontalInner.InputMaxValue,
model.Vrm.LookAt.HorizontalInner.OutputScaling);
lookAtBoneApplyer.LookAt.HorizontalOuter = new UniVRM10.CurveMapper(
model.Vrm.LookAt.HorizontalOuter.InputMaxValue,
model.Vrm.LookAt.HorizontalOuter.OutputScaling);
lookAtBoneApplyer.LookAt.VerticalUp = new UniVRM10.CurveMapper(
model.Vrm.LookAt.VerticalUp.InputMaxValue,
model.Vrm.LookAt.VerticalUp.OutputScaling);
lookAtBoneApplyer.LookAt.VerticalDown = new UniVRM10.CurveMapper(
model.Vrm.LookAt.VerticalDown.InputMaxValue,
model.Vrm.LookAt.VerticalDown.OutputScaling);
}
else
{
throw new NotImplementedException();
controller.LookAt.OffsetFromHead = model.Vrm.LookAt.OffsetFromHeadBone.ToUnityVector3();
if (model.Vrm.LookAt.LookAtType == VrmLib.LookAtType.Expression)
{
var lookAtApplyer = controller;
lookAtApplyer.LookAt.LookAtType = VRM10ControllerLookAt.LookAtTypes.Expression;
lookAtApplyer.LookAt.HorizontalOuter = new UniVRM10.CurveMapper(
model.Vrm.LookAt.HorizontalOuter.InputMaxValue,
model.Vrm.LookAt.HorizontalOuter.OutputScaling);
lookAtApplyer.LookAt.VerticalUp = new UniVRM10.CurveMapper(
model.Vrm.LookAt.VerticalUp.InputMaxValue,
model.Vrm.LookAt.VerticalUp.OutputScaling);
lookAtApplyer.LookAt.VerticalDown = new UniVRM10.CurveMapper(
model.Vrm.LookAt.VerticalDown.InputMaxValue,
model.Vrm.LookAt.VerticalDown.OutputScaling);
}
else if (model.Vrm.LookAt.LookAtType == VrmLib.LookAtType.Bone)
{
var lookAtBoneApplyer = controller;
lookAtBoneApplyer.LookAt.HorizontalInner = new UniVRM10.CurveMapper(
model.Vrm.LookAt.HorizontalInner.InputMaxValue,
model.Vrm.LookAt.HorizontalInner.OutputScaling);
lookAtBoneApplyer.LookAt.HorizontalOuter = new UniVRM10.CurveMapper(
model.Vrm.LookAt.HorizontalOuter.InputMaxValue,
model.Vrm.LookAt.HorizontalOuter.OutputScaling);
lookAtBoneApplyer.LookAt.VerticalUp = new UniVRM10.CurveMapper(
model.Vrm.LookAt.VerticalUp.InputMaxValue,
model.Vrm.LookAt.VerticalUp.OutputScaling);
lookAtBoneApplyer.LookAt.VerticalDown = new UniVRM10.CurveMapper(
model.Vrm.LookAt.VerticalDown.InputMaxValue,
model.Vrm.LookAt.VerticalDown.OutputScaling);
}
else
{
throw new NotImplementedException();
}
}
}
// springBone
if (model.Vrm.SpringBone != null)
{
if (model.Vrm.SpringBone != null)
foreach (var vrmSpring in model.Vrm.SpringBone.Springs)
{
foreach (var vrmSpring in model.Vrm.SpringBone.Springs)
// create a spring
var springBone = new UniVRM10.VRM10SpringBone();
springBone.m_comment = vrmSpring.Comment;
if (vrmSpring.Origin != null && asset.Map.Nodes.TryGetValue(vrmSpring.Origin, out GameObject origin))
{
// create a spring
var springBone = new UniVRM10.VRM10SpringBone();
springBone.m_comment = vrmSpring.Comment;
if (vrmSpring.Origin != null && asset.Map.Nodes.TryGetValue(vrmSpring.Origin, out GameObject origin))
springBone.m_center = origin.transform;
}
controller.SpringBone.Springs.Add(springBone);
// create colliders for the spring
foreach (var vrmSpringBoneCollider in vrmSpring.Colliders)
{
var go = asset.Map.Nodes[vrmSpringBoneCollider.Node];
var springBoneColliderGroup = go.GetComponent<UniVRM10.VRM10SpringBoneColliderGroup>();
if (springBoneColliderGroup != null)
{
springBone.m_center = origin.transform;
// already setup
}
controller.SpringBone.Springs.Add(springBone);
// create colliders for the spring
foreach (var vrmSpringBoneCollider in vrmSpring.Colliders)
else
{
var go = asset.Map.Nodes[vrmSpringBoneCollider.Node];
var springBoneColliderGroup = go.GetComponent<UniVRM10.VRM10SpringBoneColliderGroup>();
if (springBoneColliderGroup != null)
{
// already setup
}
else
{
// new collider
springBoneColliderGroup = go.AddComponent<UniVRM10.VRM10SpringBoneColliderGroup>();
// new collider
springBoneColliderGroup = go.AddComponent<UniVRM10.VRM10SpringBoneColliderGroup>();
// add collider shapes
springBoneColliderGroup.Colliders.Clear();
foreach (var x in vrmSpringBoneCollider.Colliders)
// add collider shapes
springBoneColliderGroup.Colliders.Clear();
foreach (var x in vrmSpringBoneCollider.Colliders)
{
switch (x.ColliderType)
{
switch (x.ColliderType)
{
case VrmLib.VrmSpringBoneColliderTypes.Sphere:
springBoneColliderGroup.Colliders.Add(new UniVRM10.VRM10SpringBoneCollider()
{
ColliderType = VRM10SpringBoneColliderTypes.Sphere,
Offset = x.Offset.ToUnityVector3(),
Radius = x.Radius
});
break;
case VrmLib.VrmSpringBoneColliderTypes.Sphere:
springBoneColliderGroup.Colliders.Add(new UniVRM10.VRM10SpringBoneCollider()
{
ColliderType = VRM10SpringBoneColliderTypes.Sphere,
Offset = x.Offset.ToUnityVector3(),
Radius = x.Radius
});
break;
case VrmLib.VrmSpringBoneColliderTypes.Capsule:
springBoneColliderGroup.Colliders.Add(new UniVRM10.VRM10SpringBoneCollider()
{
ColliderType = VRM10SpringBoneColliderTypes.Capsule,
Offset = x.Offset.ToUnityVector3(),
Radius = x.Radius,
Tail = x.CapsuleTail.ToUnityVector3(),
});
break;
case VrmLib.VrmSpringBoneColliderTypes.Capsule:
springBoneColliderGroup.Colliders.Add(new UniVRM10.VRM10SpringBoneCollider()
{
ColliderType = VRM10SpringBoneColliderTypes.Capsule,
Offset = x.Offset.ToUnityVector3(),
Radius = x.Radius,
Tail = x.CapsuleTail.ToUnityVector3(),
});
break;
default:
throw new NotImplementedException();
}
default:
throw new NotImplementedException();
}
}
springBone.ColliderGroups.Add(springBoneColliderGroup);
}
springBone.ColliderGroups.Add(springBoneColliderGroup);
}
// create joint for the spring
foreach (var vrmJoint in vrmSpring.Joints)
{
var joint = new VRM10SpringBone.VRM10SpringJoint();
// create joint for the spring
foreach (var vrmJoint in vrmSpring.Joints)
{
var joint = new VRM10SpringBone.VRM10SpringJoint();
joint.m_stiffnessForce = vrmJoint.Stiffness;
joint.m_gravityPower = vrmJoint.GravityPower;
joint.m_gravityDir = vrmJoint.GravityDir.ToUnityVector3();
joint.m_dragForce = vrmJoint.DragForce;
joint.m_hitRadius = vrmJoint.HitRadius;
joint.m_stiffnessForce = vrmJoint.Stiffness;
joint.m_gravityPower = vrmJoint.GravityPower;
joint.m_gravityDir = vrmJoint.GravityDir.ToUnityVector3();
joint.m_dragForce = vrmJoint.DragForce;
joint.m_hitRadius = vrmJoint.HitRadius;
springBone.Joints.Add(joint);
}
springBone.Joints.Add(joint);
}
}
}