mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-09-11 21:38:56 -05:00
MigrateMeta
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user