/// <summary> /// Runs at the end of an element being processed, after all other calls for that element. /// Here we compile all the "_current" variables (geometry and vertices) onto glTF buffers. /// We do this at OnElementEnd because it signals no more meshes or materials are /// coming for this element. /// </summary> /// <param name="elementId"></param> public void OnElementEnd(ElementId elementId) { Debug.WriteLine(" OnElementEnd"); if (_skipElementFlag) { // Duplicate element, skip. _skipElementFlag = false; return; } if (_currentVertices.List.Count == 0) { return; } Element e = _doc.GetElement(elementId); // create a new mesh for the node (we're assuming 1 mesh per node w/ multiple primatives on mesh) glTFMesh newMesh = new glTFMesh(); newMesh.primitives = new List <glTFMeshPrimitive>(); Meshes.AddOrUpdateCurrent(e.UniqueId, newMesh); // add the index of this mesh to the current node. Nodes.CurrentItem.mesh = Meshes.CurrentIndex; // Add vertex data to _currentGeometry for each geometry/material pairing foreach (KeyValuePair <string, VertexLookupInt> kvp in _currentVertices.Dict) { string vertex_key = kvp.Key; foreach (KeyValuePair <PointInt, int> p in kvp.Value) { _currentGeometry.GetElement(vertex_key).vertices.Add(p.Key.X); _currentGeometry.GetElement(vertex_key).vertices.Add(p.Key.Y); _currentGeometry.GetElement(vertex_key).vertices.Add(p.Key.Z); } } // Convert _currentGeometry objects into glTFMeshPrimitives foreach (KeyValuePair <string, GeometryData> kvp in _currentGeometry.Dict) { glTFBinaryData elementBinary = AddGeometryMeta(kvp.Value, kvp.Key, elementId.IntegerValue); binaryFileData.Add(elementBinary); string material_key = kvp.Key.Split('_')[1]; glTFMeshPrimitive primitive = new glTFMeshPrimitive(); primitive.attributes.POSITION = elementBinary.vertexAccessorIndex; //primitive.attributes.NORMAL = elementBinary.normalsAccessorIndex; primitive.attributes._BATCHID = elementBinary.batchIdAccessorIndex; primitive.indices = elementBinary.indexAccessorIndex; primitive.material = Materials.GetIndexFromUUID(material_key); Meshes.CurrentItem.primitives.Add(primitive); } }