public SimpleObject(string name, IServiceProvider services, PositionTexCoordNormalVertex[] vertices, short[] indices, string effectAsset, string diffuseMapAsset) : base(name) { if (services == null) throw new ArgumentNullException("services"); if (vertices == null) throw new ArgumentNullException("vertices"); if (indices == null) throw new ArgumentNullException("indices"); batchesRO = new BatchReadOnlyCollection(batches); // Services var resourceManager = (ResourceManager)services.GetService(typeof(ResourceManager)); var renderer = (Renderer)services.GetService(typeof(Renderer)); // Load effect & textures effect = resourceManager.Load<Effect>(effectAsset, false); diffuseMapView = new ShaderResourceView(renderer.Device, resourceManager.Load<Texture2D>(diffuseMapAsset)); effect.SetVariableByName("DiffuseMap", diffuseMapView, true); // Create batch CreateBatch(vertices, indices, renderer); // Calculate boundary CalculateBoundary(vertices); }
private void CreateBatch(PositionTexCoordNormalVertex[] vertices, short[] indices, Renderer renderer) { Debug.Assert(vertices != null && indices != null); int vertexBufferSize = PositionTexCoordNormalVertex.SizeInBytes * vertices.Length; var verticesData = new DataStream(vertexBufferSize, true, true); verticesData.WriteRange(vertices); verticesData.Seek(0, SeekOrigin.Begin); var vertexBuffer = new Buffer(renderer.Device, verticesData, vertexBufferSize, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None); verticesData.Close(); int indexBufferSize = sizeof(short) * indices.Length; var indicesData = new DataStream(indexBufferSize, true, true); indicesData.WriteRange(indices); indicesData.Seek(0, SeekOrigin.Begin); var indexBuffer = new Buffer(renderer.Device, indicesData, indexBufferSize, ResourceUsage.Default, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None); indicesData.Close(); // Create batch var vertexBufferBinding = new VertexBufferBinding(vertexBuffer, PositionTexCoordNormalVertex.SizeInBytes, 0); var inputLayout = new InputLayout(renderer.Device, PositionTexCoordNormalVertex.InputElements, effect.GetTechniqueByIndex(0).GetPassByIndex(0).Description.Signature); batch = new DrawIndexedBatch(renderer.Device, effect, new[] { vertexBufferBinding }, inputLayout, indexBuffer, Format.R16_UInt, indices.Length, 0, 0); batches.Add(batch); }
private void CalculateBoundary(PositionTexCoordNormalVertex[] vertices) { var positions = new Vector3[vertices.Length]; for (int i = 0; i < vertices.Length; ++i) positions[i] = new Vector3(vertices[i].Position.X, vertices[i].Position.Y, vertices[i].Position.Z); LocalBoundary = BoundingBox.FromPoints(positions); }