Skip to content

Commit

Permalink
Merge pull request #938 from Santarh/vrm10MToon1
Browse files Browse the repository at this point in the history
VRM1.0 で MToon の Import ができる
  • Loading branch information
ousttrue authored May 11, 2021
2 parents 2a154c9 + 2794638 commit c6bdc4f
Show file tree
Hide file tree
Showing 14 changed files with 445 additions and 162 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ public static (Vector2, Vector2) GetTextureOffsetAndScale(glTF_KHR_texture_trans
scale = new Vector2(textureTransform.scale[0], textureTransform.scale[1]);
}

// Coordinate Conversion: GL (top-left origin) to DX (bottom-left origin)
// UV Coordinate Conversion: glTF(top-left origin) to Unity(bottom-left origin)
// Formula: https://github.com/vrm-c/UniVRM/issues/930
offset.y = 1.0f - offset.y - scale.y;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,12 @@ public static (SubAssetKey, TextureImportParam Param) NormalTexture(GltfParser p
var (offset, scale) = GltfMaterialImporter.GetTextureOffsetAndScale(src.normalTexture);
return GltfTextureImporter.CreateNormal(parser, src.normalTexture.index, offset, scale);
}

public static (SubAssetKey, TextureImportParam Param) EmissiveTexture(GltfParser parser, glTFMaterial src)
{
var (offset, scale) = GltfMaterialImporter.GetTextureOffsetAndScale(src.emissiveTexture);
return GltfTextureImporter.CreateSRGB(parser, src.emissiveTexture.index, offset, scale);
}

public static bool TryCreateParam(GltfParser parser, int i, out MaterialImportParam param)
{
Expand Down Expand Up @@ -159,8 +165,7 @@ public static bool TryCreateParam(GltfParser parser, int i, out MaterialImportPa

if (src.emissiveTexture != null && src.emissiveTexture.index != -1)
{
var (offset, scale) = GltfMaterialImporter.GetTextureOffsetAndScale(src.emissiveTexture);
var (key, textureParam) = GltfTextureImporter.CreateSRGB(parser, src.emissiveTexture.index, offset, scale);
var (key, textureParam) = EmissiveTexture(parser, src);
param.TextureSlots.Add("_EmissionMap", textureParam);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,7 @@ public static class GltfTextureEnumerator
// emission
if (m.emissiveTexture != null)
{
var (offset, scale) = GltfMaterialImporter.GetTextureOffsetAndScale(m.emissiveTexture);
yield return GltfTextureImporter.CreateSRGB(parser, m.emissiveTexture.index, offset, scale);
yield return GltfPBRMaterial.EmissiveTexture(parser, m);
}

// normal
Expand Down
2 changes: 1 addition & 1 deletion Assets/VRM/Runtime/IO/VRMMaterialImporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public bool TryCreateParam(GltfParser parser, int i, out MaterialImportParam par
var name = parser.GLTF.materials[i].name;
param = new MaterialImportParam(name, vrmMaterial.shader);

param.Actions.Add(material => material.renderQueue = vrmMaterial.renderQueue);
param.RenderQueue = vrmMaterial.renderQueue;

foreach (var kv in vrmMaterial.floatProperties)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,237 @@
using System;
using System.Collections.Generic;
using UniGLTF;
using UniGLTF.Extensions.VRMC_materials_mtoon;
using UnityEngine;
using ColorSpace = UniGLTF.ColorSpace;
using OutlineWidthMode = UniGLTF.Extensions.VRMC_materials_mtoon.OutlineWidthMode;

namespace UniVRM10
{
/// <summary>
/// Convert MToon parameters from glTF specification to Unity implementation.
/// </summary>
public static class Vrm10MToonMaterialParameterImporter
{
public static IEnumerable<(string key, Color value)> TryGetAllColors(glTFMaterial material, VRMC_materials_mtoon mToon)
{
const ColorSpace gltfColorSpace = ColorSpace.Linear;

var baseColor = material?.pbrMetallicRoughness?.baseColorFactor?.ToColor4(gltfColorSpace, ColorSpace.sRGB);
if (baseColor.HasValue)
{
yield return (MToon.Utils.PropColor, baseColor.Value);
}

var emissionColor = material?.emissiveFactor?.ToColor3(gltfColorSpace, ColorSpace.Linear);
if (emissionColor.HasValue)
{
yield return (MToon.Utils.PropEmissionColor, emissionColor.Value);
}

var shadeColor = mToon?.ShadeColorFactor?.ToColor3(gltfColorSpace, ColorSpace.sRGB);
if (shadeColor.HasValue)
{
yield return (MToon.Utils.PropShadeColor, shadeColor.Value);
}

var rimColor = mToon?.ParametricRimColorFactor?.ToColor3(gltfColorSpace, ColorSpace.Linear);
if (rimColor.HasValue)
{
yield return (MToon.Utils.PropRimColor, rimColor.Value);
}

var outlineColor = mToon?.OutlineColorFactor?.ToColor3(gltfColorSpace, ColorSpace.sRGB);
if (outlineColor.HasValue)
{
yield return (MToon.Utils.PropOutlineColor, outlineColor.Value);
}
}

public static IEnumerable<(string key, float value)> TryGetAllFloats(glTFMaterial material, VRMC_materials_mtoon mToon)
{
var renderMode = GetMToonRenderMode(material, mToon);
{
yield return (MToon.Utils.PropBlendMode, (float) renderMode);
}

var cullMode = GetMToonCullMode(material, mToon);
{
yield return (MToon.Utils.PropCullMode, (float) cullMode);
}

var outlineMode = GetMToonOutlineWidthMode(material, mToon);
{
yield return (MToon.Utils.PropOutlineWidthMode, (float) outlineMode);

// In case of VRM 1.0 MToon, outline color mode is always MixedLighting.
yield return (MToon.Utils.PropOutlineColorMode, (float) MToon.OutlineColorMode.MixedLighting);
}

var cutoff = material?.alphaCutoff;
if (cutoff.HasValue)
{
yield return (MToon.Utils.PropCutoff, cutoff.Value);
}

var normalScale = material?.normalTexture?.scale;
if (normalScale.HasValue)
{
yield return ("_BumpScale", normalScale.Value);
}

var shadingShift = mToon?.ShadingShiftFactor;
if (shadingShift.HasValue)
{
yield return (MToon.Utils.PropShadeShift, shadingShift.Value);
}

var shadingToony = mToon?.ShadingToonyFactor;
if (shadingToony.HasValue)
{
yield return (MToon.Utils.PropShadeToony, shadingToony.Value);
}

var giIntensity = mToon?.GiIntensityFactor;
if (giIntensity.HasValue)
{
yield return (MToon.Utils.PropIndirectLightIntensity, giIntensity.Value);
}

var rimLightMix = mToon?.RimLightingMixFactor;
if (rimLightMix.HasValue)
{
yield return (MToon.Utils.PropRimLightingMix, rimLightMix.Value);
}

var rimFresnelPower = mToon?.ParametricRimFresnelPowerFactor;
if (rimFresnelPower.HasValue)
{
yield return (MToon.Utils.PropRimFresnelPower, rimFresnelPower.Value);
}

var rimLift = mToon?.ParametricRimLiftFactor;
if (rimLift.HasValue)
{
yield return (MToon.Utils.PropRimLift, rimLift.Value);
}

// Unit conversion.
// Because Unity implemented MToon uses centimeter unit in width parameter.
var outlineWidth = mToon?.OutlineWidthFactor;
if (outlineWidth.HasValue)
{
const float meterToCentimeter = 100f;

yield return (MToon.Utils.PropOutlineWidth, outlineWidth.Value * meterToCentimeter);
}

var outlineLightMix = mToon?.OutlineLightingMixFactor;
if (outlineLightMix.HasValue)
{
yield return (MToon.Utils.PropOutlineLightingMix, outlineLightMix.Value);
}

var uvAnimSpeedScrollX = mToon?.UvAnimationScrollXSpeedFactor;
if (uvAnimSpeedScrollX.HasValue)
{
yield return (MToon.Utils.PropUvAnimScrollX, uvAnimSpeedScrollX.Value);
}

// UV coords conversion.
// glTF (top-left origin) to Unity (bottom-left origin)
var uvAnimSpeedScrollY = mToon?.UvAnimationScrollYSpeedFactor;
if (uvAnimSpeedScrollY.HasValue)
{
const float invertY = -1f;

yield return (MToon.Utils.PropUvAnimScrollY, uvAnimSpeedScrollY.Value * invertY);
}

var uvAnimSpeedRotation = mToon?.UvAnimationRotationSpeedFactor;
if (uvAnimSpeedRotation.HasValue)
{
yield return (MToon.Utils.PropUvAnimRotation, uvAnimSpeedRotation.Value);
}
}

public static IEnumerable<(string key, Vector4 value)> TryGetAllFloatArrays(glTFMaterial material, VRMC_materials_mtoon mToon)
{
yield break;
}

public static int? TryGetRenderQueue(glTFMaterial material, VRMC_materials_mtoon mToon)
{
var renderQueueOffset = mToon?.RenderQueueOffsetNumber;
if (renderQueueOffset.HasValue)
{
var renderMode = GetMToonRenderMode(material, mToon);
return MToon.Utils.GetRenderQueueRequirement(renderMode).DefaultValue +
renderQueueOffset.Value;
}
return default;
}


private static MToon.RenderMode GetMToonRenderMode(glTFMaterial material, VRMC_materials_mtoon mToon)
{
switch (material?.alphaMode)
{
case "OPAQUE":
return MToon.RenderMode.Opaque;
case "MASK":
return MToon.RenderMode.Cutout;
case "BLEND":
var mToonZWrite = mToon?.TransparentWithZWrite;
if (mToonZWrite.HasValue)
{
if (mToonZWrite.Value)
{
return MToon.RenderMode.TransparentWithZWrite;
}
else
{
return MToon.RenderMode.Transparent;
}
}
else
{
// Invalid
return MToon.RenderMode.Transparent;
}
default:
// Invalid
return MToon.RenderMode.Opaque;
}
}

private static MToon.CullMode GetMToonCullMode(glTFMaterial material, VRMC_materials_mtoon mToon)
{
var doubleSided = material?.doubleSided;
if (doubleSided.HasValue && doubleSided.Value)
{
return MToon.CullMode.Off;
}
else
{
return MToon.CullMode.Back;
}
}

private static MToon.OutlineWidthMode GetMToonOutlineWidthMode(glTFMaterial material, VRMC_materials_mtoon mToon)
{
switch (mToon.OutlineWidthMode)
{
case OutlineWidthMode.none:
return MToon.OutlineWidthMode.None;
case OutlineWidthMode.worldCoordinates:
return MToon.OutlineWidthMode.WorldCoordinates;
case OutlineWidthMode.screenCoordinates:
return MToon.OutlineWidthMode.ScreenCoordinates;
default:
// Invalid
return MToon.OutlineWidthMode.None;
}
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit c6bdc4f

Please sign in to comment.