示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
 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);
 }