Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

glTFTexture.source type to int? #1765

Merged
merged 3 commits into from Sep 5, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions Assets/UniGLTF/Runtime/UniGLTF/Format/GltfSerializer.g.cs
Expand Up @@ -475,9 +475,9 @@ public static void Serialize_gltf_textures_ITEM(JsonFormatter f, glTFTexture val
f.Value(value.sampler);
}

if(value.source>=0){
if(value.source.HasValue){
f.Key("source");
f.Value(value.source);
f.Value(value.source.Value);
}

if(value.extensions!=null){
Expand Down
3 changes: 1 addition & 2 deletions Assets/UniGLTF/Runtime/UniGLTF/Format/glTFTexture.cs
Expand Up @@ -58,8 +58,7 @@ public class glTFTexture
[JsonSchema(Minimum = 0)]
public int sampler;

[JsonSchema(Minimum = 0)]
public int source;
public int? source;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nullable


// empty schemas
public glTFExtension extensions;
Expand Down
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using VRMShaders;
using ColorSpace = VRMShaders.ColorSpace;
Expand Down Expand Up @@ -70,13 +71,15 @@ public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor m
var vectors = new Dictionary<string, Vector4>();
var actions = new List<Action<Material>>();

var standardTexDesc = default(TextureDescriptor);
TextureDescriptor? standardTexDesc = default;
if (src.pbrMetallicRoughness != null || src.occlusionTexture != null)
{
if (src.pbrMetallicRoughness.metallicRoughnessTexture != null || src.occlusionTexture != null)
{
SubAssetKey key;
(key, standardTexDesc) = GltfPbrTextureImporter.StandardTexture(data, src);
if (GltfPbrTextureImporter.TryStandardTexture(data, src, out var key, out var desc))
{
standardTexDesc = desc;
}
}

if (src.pbrMetallicRoughness.baseColorFactor != null &&
Expand All @@ -90,15 +93,18 @@ public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor m
if (src.pbrMetallicRoughness.baseColorTexture != null &&
src.pbrMetallicRoughness.baseColorTexture.index != -1)
{
var (key, textureParam) = GltfPbrTextureImporter.BaseColorTexture(data, src);
textureSlots.Add("_MainTex", textureParam);
if (GltfPbrTextureImporter.TryBaseColorTexture(data, src, out var key, out var desc))
{
textureSlots.Add("_MainTex", desc);
}
}

if (src.pbrMetallicRoughness.metallicRoughnessTexture != null &&
src.pbrMetallicRoughness.metallicRoughnessTexture.index != -1)
src.pbrMetallicRoughness.metallicRoughnessTexture.index != -1 &&
standardTexDesc.HasValue)
{
actions.Add(material => material.EnableKeyword("_METALLICGLOSSMAP"));
textureSlots.Add("_MetallicGlossMap", standardTexDesc);
textureSlots.Add("_MetallicGlossMap", standardTexDesc.Value);
// Set 1.0f as hard-coded. See: https://github.com/dwango/UniVRM/issues/212.
floatValues.Add("_Metallic", 1.0f);
floatValues.Add("_GlossMapScale", 1.0f);
Expand All @@ -113,14 +119,16 @@ public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor m
if (src.normalTexture != null && src.normalTexture.index != -1)
{
actions.Add(material => material.EnableKeyword("_NORMALMAP"));
var (_, textureParam) = GltfPbrTextureImporter.NormalTexture(data, src);
textureSlots.Add("_BumpMap", textureParam);
floatValues.Add("_BumpScale", src.normalTexture.scale);
if (GltfPbrTextureImporter.TryNormalTexture(data, src, out var key, out var desc))
{
textureSlots.Add("_BumpMap", desc);
floatValues.Add("_BumpScale", src.normalTexture.scale);
}
}

if (src.occlusionTexture != null && src.occlusionTexture.index != -1)
if (src.occlusionTexture != null && src.occlusionTexture.index != -1 && standardTexDesc.HasValue)
{
textureSlots.Add("_OcclusionMap", standardTexDesc);
textureSlots.Add("_OcclusionMap", standardTexDesc.Value);
floatValues.Add("_OcclusionStrength", src.occlusionTexture.strength);
}

Expand Down Expand Up @@ -152,8 +160,10 @@ out UniGLTF.Extensions.VRMC_materials_hdr_emissiveMultiplier.

if (src.emissiveTexture != null && src.emissiveTexture.index != -1)
{
var (key, textureParam) = GltfPbrTextureImporter.EmissiveTexture(data, src);
textureSlots.Add("_EmissionMap", textureParam);
if (GltfPbrTextureImporter.TryEmissiveTexture(data, src, out var key, out var desc))
{
textureSlots.Add("_EmissionMap", desc);
}
}
}

Expand Down
Expand Up @@ -42,11 +42,11 @@ public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor m
// texture
if (src.pbrMetallicRoughness.baseColorTexture != null)
{
var (offset, scale) =
GltfTextureImporter.GetTextureOffsetAndScale(src.pbrMetallicRoughness.baseColorTexture);
var (key, textureParam) = GltfTextureImporter.CreateSrgb(data,
src.pbrMetallicRoughness.baseColorTexture.index, offset, scale);
textureSlots.Add("_MainTex", textureParam);
var (offset, scale) = GltfTextureImporter.GetTextureOffsetAndScale(src.pbrMetallicRoughness.baseColorTexture);
if (GltfTextureImporter.TryCreateSrgb(data, src.pbrMetallicRoughness.baseColorTexture.index, offset, scale, out var key, out var desc))
{
textureSlots.Add("_MainTex", desc);
}
}

matDesc = new MaterialDescriptor(
Expand Down
Expand Up @@ -42,13 +42,19 @@ public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor m
var actions = new List<Action<Material>>();
var src = data.GLTF.materials[i];

var standardTexDesc = default(TextureDescriptor);
TextureDescriptor? standardTexDesc = default;
if (src.pbrMetallicRoughness != null || src.occlusionTexture != null)
{
if (src.pbrMetallicRoughness.metallicRoughnessTexture != null || src.occlusionTexture != null)
{
SubAssetKey key;
(key, standardTexDesc) = GltfPbrTextureImporter.StandardTexture(data, src);
if (GltfPbrTextureImporter.TryStandardTexture(data, src, out var key, out var desc))
{
if (string.IsNullOrEmpty(desc.UnityObjectName))
{
throw new ArgumentNullException();
}
standardTexDesc = desc;
}
}

if (src.pbrMetallicRoughness.baseColorFactor != null && src.pbrMetallicRoughness.baseColorFactor.Length == 4)
Expand All @@ -61,15 +67,17 @@ public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor m

if (src.pbrMetallicRoughness.baseColorTexture != null && src.pbrMetallicRoughness.baseColorTexture.index != -1)
{
var (key, textureParam) = GltfPbrTextureImporter.BaseColorTexture(data, src);
// from _MainTex !
textureSlots.Add("_BaseMap", textureParam);
if (GltfPbrTextureImporter.TryBaseColorTexture(data, src, out var key, out var desc))
{
// from _MainTex !
textureSlots.Add("_BaseMap", desc);
}
}

if (src.pbrMetallicRoughness.metallicRoughnessTexture != null && src.pbrMetallicRoughness.metallicRoughnessTexture.index != -1)
if (src.pbrMetallicRoughness.metallicRoughnessTexture != null && src.pbrMetallicRoughness.metallicRoughnessTexture.index != -1 && standardTexDesc.HasValue)
{
actions.Add(material => material.EnableKeyword("_METALLICGLOSSMAP"));
textureSlots.Add("_MetallicGlossMap", standardTexDesc);
textureSlots.Add("_MetallicGlossMap", standardTexDesc.Value);
// Set 1.0f as hard-coded. See: https://github.com/dwango/UniVRM/issues/212.
floatValues.Add("_Metallic", 1.0f);
floatValues.Add("_GlossMapScale", 1.0f);
Expand All @@ -87,14 +95,16 @@ public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor m
if (src.normalTexture != null && src.normalTexture.index != -1)
{
actions.Add(material => material.EnableKeyword("_NORMALMAP"));
var (key, textureParam) = GltfPbrTextureImporter.NormalTexture(data, src);
textureSlots.Add("_BumpMap", textureParam);
floatValues.Add("_BumpScale", src.normalTexture.scale);
if (GltfPbrTextureImporter.TryNormalTexture(data, src, out var key, out var desc))
{
textureSlots.Add("_BumpMap", desc);
floatValues.Add("_BumpScale", src.normalTexture.scale);
}
}

if (src.occlusionTexture != null && src.occlusionTexture.index != -1)
if (src.occlusionTexture != null && src.occlusionTexture.index != -1 && standardTexDesc.HasValue)
{
textureSlots.Add("_OcclusionMap", standardTexDesc);
textureSlots.Add("_OcclusionMap", standardTexDesc.Value);
floatValues.Add("_OcclusionStrength", src.occlusionTexture.strength);
}

Expand Down Expand Up @@ -125,8 +135,10 @@ public static bool TryCreateParam(GltfData data, int i, out MaterialDescriptor m

if (src.emissiveTexture != null && src.emissiveTexture.index != -1)
{
var (key, textureParam) = GltfPbrTextureImporter.EmissiveTexture(data, src);
textureSlots.Add("_EmissionMap", textureParam);
if (GltfPbrTextureImporter.TryEmissiveTexture(data, src, out var key, out var desc))
{
textureSlots.Add("_EmissionMap", desc);
}
}
}

Expand Down
21 changes: 12 additions & 9 deletions Assets/UniGLTF/Runtime/UniGLTF/IO/Parser/GlbLowLevelParser.cs
Expand Up @@ -172,16 +172,19 @@ private static void FixTextureNameUnique(glTF GLTF)
for (var textureIdx = 0; textureIdx < GLTF.textures.Count; ++textureIdx)
{
var gltfTexture = GLTF.textures[textureIdx];
var gltfImage = GLTF.images[gltfTexture.source];
if (!string.IsNullOrEmpty(gltfImage.uri) && !gltfImage.uri.StartsWith("data:"))
if (gltfTexture.source.HasValidIndex())
{
// from image uri
gltfTexture.name = Path.GetFileNameWithoutExtension(gltfImage.uri);
}
if (string.IsNullOrEmpty(gltfTexture.name))
{
// use image name
gltfTexture.name = gltfImage.name;
var gltfImage = GLTF.images[gltfTexture.source.Value];
if (!string.IsNullOrEmpty(gltfImage.uri) && !gltfImage.uri.StartsWith("data:"))
{
// from image uri
gltfTexture.name = Path.GetFileNameWithoutExtension(gltfImage.uri);
}
if (string.IsNullOrEmpty(gltfTexture.name))
{
// use image name
gltfTexture.name = gltfImage.name;
}
}
if (string.IsNullOrEmpty(gltfTexture.name))
{
Expand Down
Expand Up @@ -15,7 +15,10 @@ public static IEnumerable<(SubAssetKey, TextureDescriptor)> EnumerateAllTextures
// base color
if (m.pbrMetallicRoughness?.baseColorTexture != null)
{
yield return BaseColorTexture(data, m);
if (TryBaseColorTexture(data, m, out var key, out var desc))
{
yield return (key, desc);
}
}

// metallic roughness
Expand All @@ -28,13 +31,19 @@ public static IEnumerable<(SubAssetKey, TextureDescriptor)> EnumerateAllTextures
// emission
if (m.emissiveTexture != null)
{
yield return EmissiveTexture(data, m);
if (TryEmissiveTexture(data, m, out var key, out var desc))
{
yield return (key, desc);
}
}

// normal
if (m.normalTexture != null)
{
yield return NormalTexture(data, m);
if (TryNormalTexture(data, m, out var key, out var desc))
{
yield return (key, desc);
}
}

// occlusion
Expand All @@ -47,17 +56,20 @@ public static IEnumerable<(SubAssetKey, TextureDescriptor)> EnumerateAllTextures
// metallicSmooth and occlusion
if (metallicRoughnessTexture.HasValue || occlusionTexture.HasValue)
{
yield return StandardTexture(data, m);
if (TryStandardTexture(data, m, out var key, out var desc))
{
yield return (key, desc);
}
}
}

public static (SubAssetKey, TextureDescriptor) BaseColorTexture(GltfData data, glTFMaterial src)
public static bool TryBaseColorTexture(GltfData data, glTFMaterial src, out SubAssetKey key, out TextureDescriptor desc)
{
var (offset, scale) = GltfTextureImporter.GetTextureOffsetAndScale(src.pbrMetallicRoughness.baseColorTexture);
return GltfTextureImporter.CreateSrgb(data, src.pbrMetallicRoughness.baseColorTexture.index, offset, scale);
return GltfTextureImporter.TryCreateSrgb(data, src.pbrMetallicRoughness.baseColorTexture.index, offset, scale, out key, out desc);
}

public static (SubAssetKey, TextureDescriptor) StandardTexture(GltfData data, glTFMaterial src)
public static bool TryStandardTexture(GltfData data, glTFMaterial src, out SubAssetKey key, out TextureDescriptor desc)
{
var metallicFactor = 1.0f;
var roughnessFactor = 1.0f;
Expand All @@ -67,25 +79,24 @@ public static (SubAssetKey, TextureDescriptor) StandardTexture(GltfData data, gl
roughnessFactor = src.pbrMetallicRoughness.roughnessFactor;
}
var (offset, scale) = GltfTextureImporter.GetTextureOffsetAndScale(src.pbrMetallicRoughness.metallicRoughnessTexture);
return GltfTextureImporter.CreateStandard(data,
return GltfTextureImporter.TryCreateStandard(data,
src.pbrMetallicRoughness?.metallicRoughnessTexture?.index,
src.occlusionTexture?.index,
offset, scale,
metallicFactor,
roughnessFactor);
roughnessFactor, out key, out desc);
}

public static (SubAssetKey, TextureDescriptor) NormalTexture(GltfData data, glTFMaterial src)
public static bool TryNormalTexture(GltfData data, glTFMaterial src, out SubAssetKey key, out TextureDescriptor desc)
{
var (offset, scale) = GltfTextureImporter.GetTextureOffsetAndScale(src.normalTexture);
return GltfTextureImporter.CreateNormal(data, src.normalTexture.index, offset, scale);
return GltfTextureImporter.TryCreateNormal(data, src.normalTexture.index, offset, scale, out key, out desc);
}

public static (SubAssetKey, TextureDescriptor) EmissiveTexture(GltfData data, glTFMaterial src)
public static bool TryEmissiveTexture(GltfData data, glTFMaterial src, out SubAssetKey key, out TextureDescriptor desc)
{
var (offset, scale) = GltfTextureImporter.GetTextureOffsetAndScale(src.emissiveTexture);
return GltfTextureImporter.CreateSrgb(data, src.emissiveTexture.index, offset, scale);
return GltfTextureImporter.TryCreateSrgb(data, src.emissiveTexture.index, offset, scale, out key, out desc);
}

}
}