blob: f700a7d369917d87002443ca5fc78499d9cc691f [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.
#pragma once
#include <map>
#include "lib/escher/forward_declarations.h"
#include "lib/escher/geometry/bounding_box.h"
#include "lib/escher/resources/waitable_resource.h"
#include "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 WaitableResource {
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 vertex_buffer,
BufferPtr index_buffer,
vk::DeviceSize vertex_buffer_offset = 0,
vk::DeviceSize index_buffer_offset = 0);
~Mesh() override;
const MeshSpec& spec() const { return spec_; }
const BoundingBox& bounding_box() const { return bounding_box_; }
uint32_t num_vertices() const { return num_vertices_; }
uint32_t num_indices() const { return num_indices_; }
vk::Buffer vk_vertex_buffer() const { return vk_vertex_buffer_; }
vk::Buffer vk_index_buffer() const { return vk_index_buffer_; }
const BufferPtr& vertex_buffer() const { return vertex_buffer_; }
const BufferPtr& index_buffer() const { return index_buffer_; }
vk::DeviceSize vertex_buffer_offset() const { return vertex_buffer_offset_; }
vk::DeviceSize index_buffer_offset() const { return index_buffer_offset_; }
private:
const MeshSpec spec_;
const BoundingBox bounding_box_;
const uint32_t num_vertices_;
const uint32_t num_indices_;
const vk::Buffer vk_vertex_buffer_;
const vk::Buffer vk_index_buffer_;
const BufferPtr vertex_buffer_;
const BufferPtr index_buffer_;
const vk::DeviceSize vertex_buffer_offset_;
const vk::DeviceSize index_buffer_offset_;
FXL_DISALLOW_COPY_AND_ASSIGN(Mesh);
};
typedef fxl::RefPtr<Mesh> MeshPtr;
} // namespace escher