private Submesh3D ImportSubmesh(Submesh meshAttribute, FbxImporter.Node node) { var sm = new Submesh3D(); sm.Mesh = new Mesh { VertexBuffers = new[] { new VertexBuffer <Mesh3D.Vertex> { Data = meshAttribute.Vertices, }, }, IndexBuffer = new IndexBuffer { Data = meshAttribute.Indices.Select(index => checked ((ushort)index)).ToArray() }, Attributes = new[] { new[] { ShaderPrograms.Attributes.Pos1, ShaderPrograms.Attributes.Color1, ShaderPrograms.Attributes.UV1, ShaderPrograms.Attributes.BlendIndices, ShaderPrograms.Attributes.BlendWeights, ShaderPrograms.Attributes.Normal } } }; sm.Material = meshAttribute.MaterialIndex != -1 ? node.Materials[meshAttribute.MaterialIndex].ToLime(path) : Material.Default; if (meshAttribute.Bones.Length > 0) { foreach (var bone in meshAttribute.Bones) { sm.BoneNames.Add(bone.Name); sm.BoneBindPoses.Add(bone.Offset); } } return(sm); }
private Lime.Node ImportNodes(FbxImporter.Node root, Lime.Node parent = null) { Node3D node = null; if (root == null) { return(null); } switch (root.Attribute.Type) { case NodeAttribute.FbxNodeType.MESH: var meshAttribute = root.Attribute as MeshAttribute; var mesh = new Mesh3D { Id = root.Name }; foreach (var submesh in meshAttribute.Submeshes) { mesh.Submeshes.Add(ImportSubmesh(submesh, root)); } if (platform == TargetPlatform.Unity) { mesh.CullMode = CullMode.CullCounterClockwise; } node = mesh; if (mesh.Submeshes.Count != 0) { mesh.SetLocalTransform(root.LocalTranform); mesh.RecalcBounds(); mesh.RecalcCenter(); } break; case NodeAttribute.FbxNodeType.CAMERA: var cam = root.Attribute as CameraAttribute; node = new Camera3D { Id = root.Name, FieldOfView = cam.FieldOfView * Mathf.DegToRad, AspectRatio = cam.AspectRatio, NearClipPlane = cam.NearClipPlane, FarClipPlane = cam.FarClipPlane, }; node.SetLocalTransform(CorrectCameraTransform(root.LocalTranform)); break; default: node = new Node3D { Id = root.Name }; node.SetLocalTransform(root.LocalTranform); break; } if (node != null) { if (parent != null) { parent.Nodes.Add(node); } foreach (var child in root.Children) { ImportNodes(child, node); } } return(node); }