|  | // Copyright 2016 The Fuchsia Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef SRC_UI_LIB_ESCHER_SHAPE_MESH_H_ | 
|  | #define SRC_UI_LIB_ESCHER_SHAPE_MESH_H_ | 
|  |  | 
|  | #include <map> | 
|  |  | 
|  | #include "src/ui/lib/escher/forward_declarations.h" | 
|  | #include "src/ui/lib/escher/geometry/bounding_box.h" | 
|  | #include "src/ui/lib/escher/resources/resource.h" | 
|  | #include "src/ui/lib/escher/shape/mesh_spec.h" | 
|  |  | 
|  | namespace escher { | 
|  |  | 
|  | // Immutable container for vertex indices and attribute data required to render | 
|  | // a triangle mesh. | 
|  | class Mesh : public Resource { | 
|  | public: | 
|  | static const ResourceTypeInfo kTypeInfo; | 
|  | const ResourceTypeInfo& type_info() const override { return kTypeInfo; } | 
|  |  | 
|  | Mesh(ResourceRecycler* resource_recycler, MeshSpec spec, BoundingBox bounding_box, | 
|  | uint32_t num_vertices, uint32_t num_indices, BufferPtr primary_attribute_buffer, | 
|  | BufferPtr index_buffer, vk::DeviceSize primary_attribute_buffer_offset = 0, | 
|  | vk::DeviceSize index_buffer_offset = 0); | 
|  |  | 
|  | Mesh(ResourceRecycler* resource_recycler, MeshSpec spec, BoundingBox bounding_box, | 
|  | uint32_t num_indices, BufferPtr index_buffer, vk::DeviceSize index_buffer_offset, | 
|  | uint32_t num_vertices, BufferPtr attribute_buffer0, vk::DeviceSize attribute_buffer0_offset, | 
|  | BufferPtr attribute_buffer1 = nullptr, vk::DeviceSize attribute_buffer1_offset = 0, | 
|  | BufferPtr attribute_buffer2 = nullptr, vk::DeviceSize attribute_buffer2_offset = 0, | 
|  | BufferPtr attribute_buffer3 = nullptr, vk::DeviceSize attribute_buffer3_offset = 0); | 
|  |  | 
|  | ~Mesh() override; | 
|  |  | 
|  | const MeshSpec& spec() const { return spec_; } | 
|  | const BoundingBox& bounding_box() const { return bounding_box_; } | 
|  |  | 
|  | // Number of indices in the mesh's index buffer, equal to the number of | 
|  | // triangles divided by 3. | 
|  | uint32_t num_indices() const { return num_indices_; } | 
|  |  | 
|  | // Number of distinct vertices that are present in the mesh. | 
|  | uint32_t num_vertices() const { return num_vertices_; } | 
|  |  | 
|  | const BufferPtr& index_buffer() const { return index_buffer_; } | 
|  | vk::Buffer vk_index_buffer() const { return vk_index_buffer_; } | 
|  | vk::DeviceSize index_buffer_offset() const { return index_buffer_offset_; } | 
|  |  | 
|  | struct AttributeBuffer { | 
|  | vk::Buffer vk_buffer; | 
|  | BufferPtr buffer; | 
|  | vk::DeviceSize offset; | 
|  | uint32_t stride; | 
|  |  | 
|  | explicit operator bool() const { return buffer.get() != nullptr; } | 
|  | }; | 
|  | using AttributeBufferArray = std::array<AttributeBuffer, VulkanLimits::kNumVertexBuffers>; | 
|  |  | 
|  | const AttributeBuffer& attribute_buffer(size_t buffer_index) const { | 
|  | return attribute_buffers_[buffer_index]; | 
|  | } | 
|  |  | 
|  | const AttributeBufferArray& attribute_buffers() const { return attribute_buffers_; } | 
|  |  | 
|  | private: | 
|  | Mesh(ResourceRecycler* resource_recycler, MeshSpec spec, BoundingBox bounding_box, | 
|  | uint32_t num_vertices, uint32_t num_indices, | 
|  | std::array<AttributeBuffer, VulkanLimits::kNumVertexBuffers> attribute_buffers, | 
|  | BufferPtr index_buffer, vk::DeviceSize index_buffer_offset); | 
|  |  | 
|  | const MeshSpec spec_; | 
|  | const BoundingBox bounding_box_; | 
|  | const uint32_t num_vertices_; | 
|  | const uint32_t num_indices_; | 
|  | AttributeBufferArray attribute_buffers_; | 
|  | const vk::Buffer vk_index_buffer_; | 
|  | const BufferPtr index_buffer_; | 
|  | const vk::DeviceSize index_buffer_offset_; | 
|  |  | 
|  | FXL_DISALLOW_COPY_AND_ASSIGN(Mesh); | 
|  | }; | 
|  |  | 
|  | typedef fxl::RefPtr<Mesh> MeshPtr; | 
|  |  | 
|  | }  // namespace escher | 
|  |  | 
|  | #endif  // SRC_UI_LIB_ESCHER_SHAPE_MESH_H_ |