Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading.Tasks;
- using Xenko.Core.Mathematics;
- using Xenko.Engine;
- using Xenko.Graphics;
- using Xenko.Input;
- using Xenko.Rendering;
- using MeshExtensions;
- using Buffer = Xenko.Graphics.Buffer;
- namespace LoadMesh
- {
- public class LoadMeshScript : AsyncScript
- {
- [StructLayout(LayoutKind.Sequential, Pack = 4)]
- public struct MyVertex : IVertex
- {
- Vector3 Position;
- Vector3 Normal;
- public static readonly VertexDeclaration Layout =
- new VertexDeclaration(VertexElement.Position<Vector3>(), VertexElement.Normal<Vector3>());
- public void FlipWinding()
- {
- throw new NotImplementedException();
- }
- public VertexDeclaration GetLayout()
- {
- return Layout;
- }
- }
- public Model TargetModel;
- public override async Task Execute()
- {
- var processedTargetModel = false;
- var processedTargetUrl = false;
- while(Game.IsRunning)
- {
- await Script.NextFrame();
- // Modelから読み込む
- if (!processedTargetModel && Input.IsKeyPressed(Keys.M))
- {
- AddEntity(new Vector3(-5, 5, 0), Content.GetMeshData<MyVertex>(TargetModel));
- processedTargetModel = true;
- }
- // アセットURLから読み込む
- if (!processedTargetUrl && Input.IsKeyPressed(Keys.U))
- {
- if (Content.TryGetAssetUrl(TargetModel, out var url))
- {
- AddEntity(new Vector3(5, 5, 0), Content.GetMeshData<MyVertex>(url));
- }
- processedTargetUrl = true;
- }
- }
- }
- public void AddEntity(Vector3 position, VertexAndIndexExtensions.MeshData<MyVertex, int> meshData)
- {
- // 取得したmeshDataからModelを再現する(Skeletonは考慮されていない)
- if (meshData == null)
- {
- return;
- }
- var vertexBufferList = new List<Buffer>();
- var indexBufferList = new List<Buffer>();
- var is32Bit = meshData.IndexStride == sizeof(int);
- foreach (var vertices in meshData.Vertices)
- {
- vertexBufferList.Add(Buffer.Vertex.New(GraphicsDevice, vertices));
- }
- foreach (var indices in meshData.Indices)
- {
- indexBufferList.Add(Buffer.Index.New(GraphicsDevice, indices));
- }
- var newModel = new Model();
- foreach (var meshInfo in meshData.MeshInfos)
- {
- var vertexBufferBinginds = new VertexBufferBinding[meshInfo.VertexBufferInfos.Length];
- for (int i = 0; i < vertexBufferBinginds.Length; ++i)
- {
- vertexBufferBinginds[i] = new VertexBufferBinding(vertexBufferList[meshInfo.VertexBufferInfos[i].BufferIndex], MyVertex.Layout, meshInfo.VertexBufferInfos[i].Count, meshData.VertexStride, meshInfo.VertexBufferInfos[i].Offset);
- }
- var indexBufferBinding = new IndexBufferBinding(indexBufferList[meshInfo.IndexBufferInfo.BufferIndex], is32Bit, meshInfo.IndexBufferInfo.Count, meshInfo.IndexBufferInfo.Offset);
- var meshDraw = new MeshDraw
- {
- PrimitiveType = PrimitiveType.TriangleList,
- VertexBuffers = vertexBufferBinginds,
- IndexBuffer = indexBufferBinding,
- StartLocation = 0,
- DrawCount = meshInfo.IndexBufferInfo.Count,
- };
- newModel.Meshes.Add(new Mesh { Draw = meshDraw, });
- }
- var entity = new Entity(position);
- entity.Add(new ModelComponent(newModel));
- SceneSystem.SceneInstance.RootScene.Entities.Add(entity);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement