private IMeshImp RegisterNewMesh(Mesh mesh) { // Configure newly created MeshImp to reflect Mesh's properties on GPU (allocate buffers) var meshImp = _renderContextImp.CreateMeshImp(); // Begin Setup GPU Buffers / allocate GPU memory if (mesh.VerticesSet) { _renderContextImp.SetVertices(meshImp, mesh.Vertices); } if (mesh.UVsSet) { _renderContextImp.SetUVs(meshImp, mesh.UVs); } if (mesh.NormalsSet) { _renderContextImp.SetNormals(meshImp, mesh.Normals); } if (mesh.ColorsSet) { _renderContextImp.SetColors(meshImp, mesh.Colors); } if (mesh.BoneIndicesSet) { _renderContextImp.SetBoneIndices(meshImp, mesh.BoneIndices); } if (mesh.BoneWeightsSet) { _renderContextImp.SetBoneWeights(meshImp, mesh.BoneWeights); } if (mesh.TrianglesSet) { _renderContextImp.SetTriangles(meshImp, mesh.Triangles); } if (mesh.TangentsSet) { _renderContextImp.SetTangents(meshImp, mesh.Tangents); } if (mesh.BiTangentsSet) { _renderContextImp.SetBiTangents(meshImp, mesh.BiTangents); } // End Setup GPU Buffers // Setup handler to observe changes of the mesh data and dispose event (deallocation) mesh.MeshChanged += MeshChanged; meshImp.MeshType = (OpenGLPrimitiveType)mesh.MeshType; _identifierToMeshImpDictionary.Add(mesh.SessionUniqueIdentifier, meshImp); return(meshImp); }