public SemanticResolver(FbxObject fbx) { _objectsNode = fbx.FindChild(FbxConstStrings.Objects()); var connectionsNode = fbx.FindChild(FbxConstStrings.Connections()); _deformerList = new(_objectsNode); _connResolver = new(connectionsNode); _modelList = new(_objectsNode); }
public DeformerList(FbxNode objectsNode) { using var buf = new UnsafeRawArray <int>(objectsNode.Children.Count, false); var count = objectsNode.FindChildIndexAll(FbxConstStrings.Deformer(), buf.AsSpan()); _dic = new BufferPooledDictionary <long, FbxNode>(count); foreach (var index in buf.AsSpan(0, count)) { var deformer = objectsNode.Children[index]; var id = deformer.Properties[0].AsInt64(); _dic.Add(id, deformer); } }
public ModelList(FbxNode objectsNode) { var meshDic = new BufferPooledDictionary <long, MeshModel>(); var limbDic = new BufferPooledDictionary <long, LimbNode>(); var nullDic = new BufferPooledDictionary <long, NullModel>(); try { using var indexBuf = new ValueTypeRentMemory <int>(objectsNode.Children.Count, false); var modelCount = objectsNode.FindChildIndexAll(FbxConstStrings.Model(), indexBuf.AsSpan()); foreach (var i in indexBuf.AsSpan(0, modelCount)) { var modelNode = objectsNode.Children[i]; var modelType = modelNode.Properties[2].AsString().ToModelType(); switch (modelType) { case ModelType.LimbNode: { var limb = new LimbNode(modelNode); limbDic.Add(limb.ID, limb); break; } case ModelType.Mesh: { var meshModel = new MeshModel(modelNode); meshDic.Add(meshModel.ID, meshModel); break; } case ModelType.Null: { var nullModel = new NullModel(modelNode); nullDic.Add(nullModel.ID, nullModel); break; } case ModelType.Unknown: default: break; } } _meshDic = meshDic; _limbDic = limbDic; _nullDic = nullDic; } catch { meshDic.Dispose(); limbDic.Dispose(); nullDic.Dispose(); throw; } }
public static bool IsMeshGeometry(this FbxNode node) { var props = node.Properties; var isMeshGeometry = (props.Length > 2) && props[2].TryAsString(out var type) && type.SequenceEqual(FbxConstStrings.Mesh()); return(isMeshGeometry); }