blob: b94b82cfce76b767301cf601436314122a01cb9c [file] [log] [blame]
// 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_