private bool SetDracoGeometryInfo(Mesh rhinoMesh) { var dracoComp = DracoCompression.Compress( rhinoMesh, new DracoCompressionOptions() { VertexColorFormat = DracoColorFormat.RGBA, CompressionLevel = options.DracoCompressionLevel, IncludeNormals = ExportNormals(rhinoMesh), IncludeTextureCoordinates = ExportTextureCoordinates(rhinoMesh), IncludeVertexColors = ExportVertexColors(rhinoMesh), PositionQuantizationBits = options.DracoQuantizationBitsPosition, NormalQuantizationBits = options.DracoQuantizationBitsNormal, TextureCoordintateQuantizationBits = options.DracoQuantizationBitsTexture } ); currentGeometryInfo = AddDracoGeometry(dracoComp); return(currentGeometryInfo.Success); }
private void AddRhinoObjectDraco(ObjectExportData data) { var materialIndex = GetMaterial(data.RenderMaterial, data.Object); var primitives = new List <MeshPrimitive>(); // For each rhino mesh, create gl-buffers, gl-meshes, etc. foreach (var rhinoMesh in data.Meshes) { if (options.MapRhinoZToGltfY) { rhinoMesh.Transform(ZtoYUp); } rhinoMesh.TextureCoordinates.ReverseTextureCoordinates(1); var dracoComp = DracoCompression.Compress( rhinoMesh, new DracoCompressionOptions() { CompressionLevel = options.DracoCompressionLevel, IncludeNormals = true, IncludeTextureCoordinates = true, IncludeVertexColors = false, PositionQuantizationBits = options.DracoQuantizationBitsPosition, NormalQuantizationBits = options.DracoQuantizationBitsNormal, TextureCoordintateQuantizationBits = options.DracoQuantizationBitsTexture } ); DracoGeometryInfo dracoGeoInfo = AddDracoGeometry(dracoComp); var compMeshBufferView = new BufferView() { Buffer = dracoGeoInfo.bufferIndex, ByteOffset = dracoGeoInfo.byteOffset, ByteLength = dracoGeoInfo.byteLength, }; int compMeshBufferViewIdx = dummy.BufferViews.AddAndReturnIndex(compMeshBufferView); var vtxAccessor = new Accessor { Type = Accessor.TypeEnum.VEC3, ComponentType = Accessor.ComponentTypeEnum.FLOAT, Count = dracoGeoInfo.verticesNum, Min = dracoGeoInfo.verticesMin, Max = dracoGeoInfo.verticesMax, ByteOffset = 0, }; int vtxAccessorIdx = dummy.Accessors.AddAndReturnIndex(vtxAccessor); // // Accessor Triangles Vertex IDs var idsAccessor = new Accessor { Type = Accessor.TypeEnum.SCALAR, ComponentType = Accessor.ComponentTypeEnum.UNSIGNED_INT, Count = dracoGeoInfo.trianglesNum, Min = new float[] { dracoGeoInfo.trianglesMin }, Max = new float[] { dracoGeoInfo.trianglesMax }, ByteOffset = 0, }; int idsAccessorIdx = dummy.Accessors.AddAndReturnIndex(idsAccessor); // Accessor Normals var normalsAccessor = new Accessor { Type = Accessor.TypeEnum.VEC3, ComponentType = Accessor.ComponentTypeEnum.FLOAT, Count = dracoGeoInfo.normalsNum, Min = dracoGeoInfo.normalsMin, Max = dracoGeoInfo.normalsMax, ByteOffset = 0, }; int normalsAccessorIdx = dummy.Accessors.AddAndReturnIndex(normalsAccessor); var primitive = new MeshPrimitive() { Attributes = new Dictionary <string, int>() { { Constants.PositionAttributeTag, vtxAccessorIdx }, { Constants.NormalAttributeTag, normalsAccessorIdx }, }, Indices = idsAccessorIdx, Material = materialIndex, }; if (dracoGeoInfo.texCoordsNum > 0) { // Accessor TexCoords var texCoordsAccessor = new Accessor { Type = Accessor.TypeEnum.VEC2, ComponentType = Accessor.ComponentTypeEnum.FLOAT, Count = dracoGeoInfo.texCoordsNum, Min = dracoGeoInfo.texCoordsMin, Max = dracoGeoInfo.texCoordsMax, ByteOffset = 0, }; int texCoordsAccessorIdx = dummy.Accessors.AddAndReturnIndex(texCoordsAccessor); primitive.Attributes.Add(Constants.TexCoord0AttributeTag, texCoordsAccessorIdx); primitive.Extensions = new Dictionary <string, object>() { { Constants.DracoMeshCompressionExtensionTag, new { bufferView = compMeshBufferViewIdx, attributes = new { POSITION = 0, NORMAL = 1, TEXCOORD_0 = 2 } } } }; } else { primitive.Extensions = new Dictionary <string, object>() { { Constants.DracoMeshCompressionExtensionTag, new { bufferView = compMeshBufferViewIdx, attributes = new { POSITION = 0, NORMAL = 1, } } } }; } // Create mesh primitives.Add(primitive); } var mesh = new glTFLoader.Schema.Mesh() { Primitives = primitives.ToArray(), }; int meshIndex = dummy.Meshes.AddAndReturnIndex(mesh); var node = new Node() { Mesh = meshIndex, }; int nodeIndex = dummy.Nodes.AddAndReturnIndex(node); dummy.Scenes[dummy.Scene].Nodes.Add(nodeIndex); }