diff --git a/Assets/Extra/Test Materials.meta b/Assets/Extra/Test Materials.meta new file mode 100644 index 0000000..04f2842 --- /dev/null +++ b/Assets/Extra/Test Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 56f15216bd310954bb57d0900839c613 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Extra/Test Materials/Normals.mat b/Assets/Extra/Test Materials/Normals.mat new file mode 100644 index 0000000..7496300 --- /dev/null +++ b/Assets/Extra/Test Materials/Normals.mat @@ -0,0 +1,28 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Normals + m_Shader: {fileID: 4800000, guid: 75756b5b04ca7b5438e346a8f9f754ba, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: [] + m_Colors: [] + m_BuildTextureStacks: [] diff --git a/Assets/Extra/Test Materials/Normals.mat.meta b/Assets/Extra/Test Materials/Normals.mat.meta new file mode 100644 index 0000000..b5851b7 --- /dev/null +++ b/Assets/Extra/Test Materials/Normals.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 763d54739fbe63e4bbd1598690d1af38 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Extra/Test Materials/Normals.shader b/Assets/Extra/Test Materials/Normals.shader new file mode 100644 index 0000000..88de22e --- /dev/null +++ b/Assets/Extra/Test Materials/Normals.shader @@ -0,0 +1,49 @@ +Shader "Unlit/Normals" +{ + Properties + { + } + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + half3 normal : NORMAL; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + half3 normal : NORMAL; + }; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.normal = v.normal; + + return o; + } + + half4 frag (v2f i) : SV_Target + { + half4 color = 0; + color.rgb = i.normal * 0.5 + 0.5; + return color; + } + ENDCG + } + } +} diff --git a/Assets/Extra/Test Materials/Normals.shader.meta b/Assets/Extra/Test Materials/Normals.shader.meta new file mode 100644 index 0000000..f819ed1 --- /dev/null +++ b/Assets/Extra/Test Materials/Normals.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 75756b5b04ca7b5438e346a8f9f754ba +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Extra/Test Materials/UVs.shader b/Assets/Extra/Test Materials/UVs.shader new file mode 100644 index 0000000..a5c15c9 --- /dev/null +++ b/Assets/Extra/Test Materials/UVs.shader @@ -0,0 +1,47 @@ +Shader "Unlit/UVs" +{ + Properties + { + } + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + float2 colors : TEXCOORD0; + }; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.colors = v.uv; + + return o; + } + + half4 frag (v2f i) : SV_Target + { + return half4(i.colors.x, i.colors.y, 0, 0); + } + ENDCG + } + } +} diff --git a/Assets/Extra/Test Materials/UVs.shader.meta b/Assets/Extra/Test Materials/UVs.shader.meta new file mode 100644 index 0000000..ab78e04 --- /dev/null +++ b/Assets/Extra/Test Materials/UVs.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: f6778d5072232804689f36bb771a2122 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Extra/Test Materials/Uvs.mat b/Assets/Extra/Test Materials/Uvs.mat new file mode 100644 index 0000000..e20006f --- /dev/null +++ b/Assets/Extra/Test Materials/Uvs.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Uvs + m_Shader: {fileID: 4800000, guid: f6778d5072232804689f36bb771a2122, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Extra/Test Materials/Uvs.mat.meta b/Assets/Extra/Test Materials/Uvs.mat.meta new file mode 100644 index 0000000..bf39cd8 --- /dev/null +++ b/Assets/Extra/Test Materials/Uvs.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6fe0ba5d1c59c7548be17ef9fb8e2e40 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Extra/Test Materials/VertexColors.mat b/Assets/Extra/Test Materials/VertexColors.mat new file mode 100644 index 0000000..f41fdc9 --- /dev/null +++ b/Assets/Extra/Test Materials/VertexColors.mat @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: VertexColors + m_Shader: {fileID: 4800000, guid: 3b849de517d871d46874414758a096f2, type: 3} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _Shininess: 0.078125 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _SpecColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/Extra/Test Materials/VertexColors.mat.meta b/Assets/Extra/Test Materials/VertexColors.mat.meta new file mode 100644 index 0000000..93148f6 --- /dev/null +++ b/Assets/Extra/Test Materials/VertexColors.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c84690dfb148c6e4f8343f76b3cad987 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Extra/Test Materials/VertexColors.shader b/Assets/Extra/Test Materials/VertexColors.shader new file mode 100644 index 0000000..b6c9314 --- /dev/null +++ b/Assets/Extra/Test Materials/VertexColors.shader @@ -0,0 +1,47 @@ +Shader "Unlit/VertexColors" +{ + Properties + { + } + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + half4 color : COLOR0; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + half4 color : COLOR0; + }; + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.color = v.color; + + return o; + } + + half4 frag (v2f i) : SV_Target + { + return i.color; + } + ENDCG + } + } +} diff --git a/Assets/Extra/Test Materials/VertexColors.shader.meta b/Assets/Extra/Test Materials/VertexColors.shader.meta new file mode 100644 index 0000000..02649ea --- /dev/null +++ b/Assets/Extra/Test Materials/VertexColors.shader.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 3b849de517d871d46874414758a096f2 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + preprocessorOverride: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Speckle Connector/ConverterUnity.Geometry.cs b/Assets/Speckle Connector/ConverterUnity.Geometry.cs index 4682c0b..9e2dfd0 100644 --- a/Assets/Speckle Connector/ConverterUnity.Geometry.cs +++ b/Assets/Speckle Connector/ConverterUnity.Geometry.cs @@ -16,7 +16,15 @@ namespace Objects.Converter.Unity { public partial class ConverterUnity { + #region helper methods + + private static readonly int EmissionColor = Shader.PropertyToID("_EmissionColor"); + private static readonly int Metallic = Shader.PropertyToID("_Metallic"); + private static readonly int Glossiness = Shader.PropertyToID("_Glossiness"); + + private static Color ToUnityColor(SColor color) => new Color(color.R / 255f, color.G / 255f, color.B / 255f, color.A / 255f); + /// /// /// @@ -312,7 +320,7 @@ namespace Objects.Converter.Unity var go = new GameObject { name = speckleMesh.speckle_type }; var mesh = new UnityEngine.Mesh { name = speckleMesh.speckle_type }; - if (verts.Length >= 65535) + if (verts.Length >= UInt16.MaxValue) mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; @@ -365,13 +373,17 @@ namespace Objects.Converter.Unity //Set vertex colors if (speckleMesh.colors.Count == speckleMesh.VerticesCount) { - static Color ToUnityColor(SColor color) => new Color(color.R, color.G, color.B, color.A); var colors = speckleMesh.colors.Select(c => ToUnityColor(SColor.FromArgb(c))).ToList(); mesh.SetColors(colors); } + else if (speckleMesh.colors.Count != 0) + { + Debug.LogWarning($"{typeof(Mesh)} {speckleMesh.id} has invalid number of vertex {nameof(Mesh.colors)}. Expected 0 or {speckleMesh.VerticesCount}, got {speckleMesh.colors.Count}"); + } // BUG: causing some funky issues with meshes - // mesh.RecalculateNormals( ); + mesh.RecalculateNormals(); + mesh.RecalculateTangents(); mesh.Optimize(); // Setting mesh to filter once all mesh modifying is done go.SafeMeshSet(mesh, true); @@ -450,10 +462,16 @@ namespace Objects.Converter.Unity } var c = renderMaterial.diffuse.ToUnityColor(); - mat.color = new Color(c.r, c.g, c.b, Convert.ToSingle(renderMaterial.opacity)); - mat.name = renderMaterial.name == null ? "material-"+ Guid.NewGuid().ToString().Substring(0,8) : renderMaterial.name; - + mat.color = new Color(c.r, c.g, c.b, (float)renderMaterial.opacity); + mat.name = renderMaterial.name ?? "material-"+ Guid.NewGuid().ToString().Substring(0,8); + + mat.SetFloat(Metallic, (float)renderMaterial.metalness); + mat.SetFloat(Glossiness, 1 - (float)renderMaterial.roughness); + if (renderMaterial.emissive != SColor.Black.ToArgb()) mat.EnableKeyword ("_EMISSION"); + mat.SetColor(EmissionColor, ToUnityColor(SColor.FromArgb(renderMaterial.emissive))); + + #if UNITY_EDITOR if (StreamManager.GenerateMaterials) { @@ -463,8 +481,7 @@ namespace Objects.Converter.Unity if (AssetDatabase.LoadAllAssetsAtPath("Assets/Resources/Materials/Speckle Generated/" + mat.name + ".mat").Length == 0) AssetDatabase.CreateAsset(mat, "Assets/Resources/Materials/Speckle Generated/" + mat.name + ".mat"); } #endif - - + return mat; } // 3. if not renderMaterial was passed, the default shader will be used