diff --git a/Assets/Speckle Connector/ConverterUnity.Geometry.cs b/Assets/Speckle Connector/ConverterUnity.Geometry.cs index 22a6663..3553cbf 100644 --- a/Assets/Speckle Connector/ConverterUnity.Geometry.cs +++ b/Assets/Speckle Connector/ConverterUnity.Geometry.cs @@ -211,21 +211,26 @@ namespace Objects.Converter.Unity return go; } + public GameObject MeshToNative(Base speckleMeshObject) { if (!(speckleMeshObject["displayMesh"] is Mesh)) return null; - return MeshToNative(speckleMeshObject["displayMesh"] as Mesh, speckleMeshObject.GetMembers()); + return MeshToNative(speckleMeshObject["displayMesh"] as Mesh, + speckleMeshObject["renderMaterial"] as RenderMaterial, speckleMeshObject.GetMembers()); } - + /// /// Converts a Speckle mesh to a GameObject with a mesh renderer /// - /// + /// Mesh to convert + /// If provided will override the renderMaterial on the mesh itself + /// If provided will override the properties on the mesh itself /// - public GameObject MeshToNative(Mesh speckleMesh, Dictionary properties = null) + public GameObject MeshToNative(Mesh speckleMesh, RenderMaterial renderMaterial = null, + Dictionary properties = null) { if (speckleMesh.vertices.Count == 0 || speckleMesh.faces.Count == 0) { @@ -255,9 +260,9 @@ namespace Objects.Converter.Unity tris.Add(speckleMesh.faces[i + 3]); tris.Add(speckleMesh.faces[i + 2]); - tris.Add(speckleMesh.faces[i + 3]); tris.Add(speckleMesh.faces[i + 1]); tris.Add(speckleMesh.faces[i + 4]); + tris.Add(speckleMesh.faces[i + 3]); i += 5; } @@ -270,31 +275,8 @@ namespace Objects.Converter.Unity var mesh = go.AddComponent().mesh; var meshRenderer = go.AddComponent(); - //todo support more complex materials - var shader = Shader.Find("Standard"); - var mat = new Material(shader); - - var speckleMaterial = speckleMesh["renderMaterial"]; - if (speckleMaterial != null && speckleMaterial is RenderMaterial rm) - { - // 1. match shader by name, if any - shader = Shader.Find(rm.name); - if (shader != null) - { - mat = new Material(shader); - } - else - { - // 2. re-create material by setting diffuse color and transparency on standard shaders - shader = Shader.Find("Transparent/Diffuse"); - mat = new Material(shader); - var c = rm.diffuse.ToUnityColor(); - mat.color = new Color(c.r, c.g, c.b, Convert.ToSingle(rm.opacity)); - } - } - - // 3. if not renderMaterial was passed, the default shader will be used - meshRenderer.material = mat; + var speckleMaterial = renderMaterial ?? (RenderMaterial)speckleMesh["renderMaterial"]; + meshRenderer.material = GetMaterial(speckleMaterial); if (verts.Count >= 65535) @@ -321,9 +303,12 @@ namespace Objects.Converter.Unity mesh.vertices = verts.ToArray(); mesh.triangles = tris.ToArray(); + + mesh.Optimize(); mesh.RecalculateNormals(); mesh.RecalculateTangents(); + //generate uvs doesn't work as intended. Leaving out for now //GenerateUVs (ref mesh); @@ -350,6 +335,40 @@ namespace Objects.Converter.Unity #endregion + private Material GetMaterial(RenderMaterial renderMaterial) + { + //todo support more complex materials + var shader = Shader.Find("Standard"); + Material mat = new Material(shader); + + //if a renderMaterial is passed use that, otherwise try get it from the mesh itself + + if (renderMaterial != null) + { + // 1. match shader by name, if any + shader = Shader.Find(renderMaterial.name); + if (shader != null) + { + return new Material(shader); + } + + // 2. re-create material by setting diffuse color and transparency on standard shaders + if (renderMaterial.opacity < 1) + { + shader = Shader.Find("Transparent/Diffuse"); + mat = new Material(shader); + } + + var c = renderMaterial.diffuse.ToUnityColor(); + mat.color = new Color(c.r, c.g, c.b, Convert.ToSingle(renderMaterial.opacity)); + + return mat; + } + + // 3. if not renderMaterial was passed, the default shader will be used + return mat; + } + private void AttachSpeckleProperties(GameObject go, Dictionary properties) { var sd = go.AddComponent(); diff --git a/Assets/SpeckleExamples.cs b/Assets/SpeckleExamples.cs index 823dd31..07f4e01 100644 --- a/Assets/SpeckleExamples.cs +++ b/Assets/SpeckleExamples.cs @@ -218,13 +218,12 @@ namespace Speckle.ConnectorUnity { AddComponents(child.gameObject); } - else { - child.gameObject.AddComponent(); - - //Add extra Components - //var rigidbody = child.gameObject.AddComponent(); - //rigidbody.mass = 10; - } + + child.gameObject.AddComponent(); + + //Add extra Components + //var rigidbody = child.gameObject.AddComponent(); + //rigidbody.mass = 10; } } }