From 44d700870b670c1ba39adeb77ead313e3221b8e1 Mon Sep 17 00:00:00 2001 From: cam Date: Tue, 3 May 2022 13:48:05 +1000 Subject: [PATCH] support point cloud encoding --- Runtime/Scripts/Encoder/DracoEncoder.cs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Runtime/Scripts/Encoder/DracoEncoder.cs b/Runtime/Scripts/Encoder/DracoEncoder.cs index 95f7f94..6d17cfa 100644 --- a/Runtime/Scripts/Encoder/DracoEncoder.cs +++ b/Runtime/Scripts/Encoder/DracoEncoder.cs @@ -178,14 +178,12 @@ public static unsafe EncodeResult[] EncodeMesh( var submesh = mesh.GetSubMesh(submeshIndex); - if (submesh.topology != MeshTopology.Triangles) { - Debug.LogError("Only triangles are supported"); + if (submesh.topology != MeshTopology.Triangles && submesh.topology != MeshTopology.Points) { + Debug.LogError($"Mesh topology {submesh.topology} is not supported"); return null; } - var indices = mesh.GetIndices(submeshIndex); - var faceCount = indices.Length / 3; - var dracoEncoder = dracoEncoderCreate(mesh.vertexCount); + var dracoEncoder = submesh.topology == MeshTopology.Triangles ? dracoEncoderCreate(mesh.vertexCount) : dracoEncoderCreatePointCloud(mesh.vertexCount); var attributeIds = new Dictionary(); @@ -199,9 +197,13 @@ public static unsafe EncodeResult[] EncodeMesh( attributeIds[attribute] = dracoEncoderSetAttribute(dracoEncoder, (int) GetAttributeType(attribute), GetDataType(format), dimension, stride, baseAddr); } - var indicesData = (IntPtr) UnsafeUtility.PinGCArrayAndGetDataAddress(indices, out var gcHandle); - dracoEncoderSetIndices(dracoEncoder, DataType.DT_UINT32, (uint) indices.Length, indicesData); - UnsafeUtility.ReleaseGCObject(gcHandle); + if (submesh.topology == MeshTopology.Triangles) + { + var indices = mesh.GetIndices(submeshIndex); + var indicesData = (IntPtr)UnsafeUtility.PinGCArrayAndGetDataAddress(indices, out var gcHandle); + dracoEncoderSetIndices(dracoEncoder, DataType.DT_UINT32, (uint)indices.Length, indicesData); + UnsafeUtility.ReleaseGCObject(gcHandle); + } // For both encoding and decoding (0 = slow and best compression; 10 = fast) dracoEncoderSetCompressionSpeed(dracoEncoder, Mathf.Clamp(encodingSpeed,0,10), Mathf.Clamp(decodingSpeed,0,10)); @@ -327,6 +329,9 @@ static unsafe int GetAttributeSize(VertexAttributeFormat format) { [DllImport (DRACOENC_UNITY_LIB)] static extern IntPtr dracoEncoderCreate(int vertexCount); + [DllImport(DRACOENC_UNITY_LIB)] + static extern IntPtr dracoEncoderCreatePointCloud(int vertexCount); + [DllImport (DRACOENC_UNITY_LIB)] static extern void dracoEncoderRelease(IntPtr encoder);