Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.10 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using Xenko.Core.Mathematics;
  8. using Xenko.Engine;
  9. using Xenko.Graphics;
  10. using Xenko.Input;
  11. using Xenko.Rendering;
  12. using MeshExtensions;
  13. using Buffer = Xenko.Graphics.Buffer;
  14.  
  15. namespace LoadMesh
  16. {
  17. public class LoadMeshScript : AsyncScript
  18. {
  19. [StructLayout(LayoutKind.Sequential, Pack = 4)]
  20. public struct MyVertex : IVertex
  21. {
  22. Vector3 Position;
  23. Vector3 Normal;
  24.  
  25. public static readonly VertexDeclaration Layout =
  26. new VertexDeclaration(VertexElement.Position<Vector3>(), VertexElement.Normal<Vector3>());
  27.  
  28. public void FlipWinding()
  29. {
  30. throw new NotImplementedException();
  31. }
  32.  
  33. public VertexDeclaration GetLayout()
  34. {
  35. return Layout;
  36. }
  37. }
  38.  
  39. public Model TargetModel;
  40.  
  41. public override async Task Execute()
  42. {
  43. var processedTargetModel = false;
  44. var processedTargetUrl = false;
  45.  
  46. while(Game.IsRunning)
  47. {
  48. await Script.NextFrame();
  49.  
  50. // Modelから読み込む
  51. if (!processedTargetModel && Input.IsKeyPressed(Keys.M))
  52. {
  53. AddEntity(new Vector3(-5, 5, 0), Content.GetMeshData<MyVertex>(TargetModel));
  54. processedTargetModel = true;
  55. }
  56.  
  57. // アセットURLから読み込む
  58. if (!processedTargetUrl && Input.IsKeyPressed(Keys.U))
  59. {
  60. if (Content.TryGetAssetUrl(TargetModel, out var url))
  61. {
  62. AddEntity(new Vector3(5, 5, 0), Content.GetMeshData<MyVertex>(url));
  63. }
  64. processedTargetUrl = true;
  65. }
  66. }
  67. }
  68.  
  69. public void AddEntity(Vector3 position, VertexAndIndexExtensions.MeshData<MyVertex, int> meshData)
  70. {
  71. // 取得したmeshDataからModelを再現する(Skeletonは考慮されていない)
  72.  
  73. if (meshData == null)
  74. {
  75. return;
  76. }
  77.  
  78. var vertexBufferList = new List<Buffer>();
  79. var indexBufferList = new List<Buffer>();
  80. var is32Bit = meshData.IndexStride == sizeof(int);
  81.  
  82. foreach (var vertices in meshData.Vertices)
  83. {
  84. vertexBufferList.Add(Buffer.Vertex.New(GraphicsDevice, vertices));
  85. }
  86. foreach (var indices in meshData.Indices)
  87. {
  88. indexBufferList.Add(Buffer.Index.New(GraphicsDevice, indices));
  89. }
  90.  
  91. var newModel = new Model();
  92.  
  93. foreach (var meshInfo in meshData.MeshInfos)
  94. {
  95. var vertexBufferBinginds = new VertexBufferBinding[meshInfo.VertexBufferInfos.Length];
  96. for (int i = 0; i < vertexBufferBinginds.Length; ++i)
  97. {
  98. vertexBufferBinginds[i] = new VertexBufferBinding(vertexBufferList[meshInfo.VertexBufferInfos[i].BufferIndex], MyVertex.Layout, meshInfo.VertexBufferInfos[i].Count, meshData.VertexStride, meshInfo.VertexBufferInfos[i].Offset);
  99. }
  100.  
  101. var indexBufferBinding = new IndexBufferBinding(indexBufferList[meshInfo.IndexBufferInfo.BufferIndex], is32Bit, meshInfo.IndexBufferInfo.Count, meshInfo.IndexBufferInfo.Offset);
  102.  
  103. var meshDraw = new MeshDraw
  104. {
  105. PrimitiveType = PrimitiveType.TriangleList,
  106. VertexBuffers = vertexBufferBinginds,
  107. IndexBuffer = indexBufferBinding,
  108. StartLocation = 0,
  109. DrawCount = meshInfo.IndexBufferInfo.Count,
  110. };
  111.  
  112. newModel.Meshes.Add(new Mesh { Draw = meshDraw, });
  113. }
  114.  
  115. var entity = new Entity(position);
  116. entity.Add(new ModelComponent(newModel));
  117.  
  118. SceneSystem.SceneInstance.RootScene.Entities.Add(entity);
  119. }
  120. }
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement