Program Listing for File Model.cpp

Program Listing for File Model.cpp#

Return to documentation for file (Src/GraphicsEngineVulkan/scene/Model.cpp)

module;

#include "common/Utilities.hpp"
#include <cstdint>
#include <glm/ext/matrix_float4x4.hpp>
#include <utility>
#include <vector>
#include <vulkan/vulkan.hpp>

module kataglyphis.vulkan.model;

import kataglyphis.vulkan.device;
import kataglyphis.vulkan.obj_material;
import kataglyphis.vulkan.texture;
import kataglyphis.vulkan.mesh;
import kataglyphis.vulkan.vertex;

using namespace Kataglyphis;

Model::Model() = default;

Model::Model(VulkanDevice *device) : device(device) {}

void Model::cleanUp()
{
    for (Texture &texture : modelTextures) { texture.cleanUp(); }

    for (vk::Sampler texture_sampler : modelTextureSamplers) {
        device->getLogicalDevice().destroySampler(texture_sampler);
    }

    mesh.cleanUp();
}

void Model::add_new_mesh(VulkanDevice *vulkan_device,
  vk::Queue transfer_queue,
  vk::CommandPool command_pool,
  std::vector<Vertex> &vertices,
  std::vector<unsigned int> &indices,
  std::vector<unsigned int> &materialIndex,
  std::vector<ObjMaterial> &materials)
{
    this->mesh = Mesh(vulkan_device, transfer_queue, command_pool, vertices, indices, materialIndex, materials);
}

void Model::set_model(glm::mat4 new_model) { this->model = new_model; }

void Model::addTexture(Texture &&newTexture)
{
    modelTextures.emplace_back(std::move(newTexture));
    addSampler(modelTextures.back());
}

auto Model::getPrimitiveCount() -> uint32_t
{
    /*uint32_t number_of_indices = 0;

      for (Mesh mesh : meshes) {

          number_of_indices += mesh.get_index_count();

      }

      return number_of_indices / 3;*/
    return mesh.getIndexCount() / 3;
}

Model::~Model() = default;

void Model::addSampler(const Texture &newTexture)
{
    vk::PhysicalDeviceFeatures physical_device_features = device->getPhysicalDevice().getFeatures();

    vk::SamplerCreateInfo sampler_create_info{};
    sampler_create_info.magFilter = vk::Filter::eLinear;
    sampler_create_info.minFilter = vk::Filter::eLinear;
    sampler_create_info.addressModeU = vk::SamplerAddressMode::eRepeat;
    sampler_create_info.addressModeV = vk::SamplerAddressMode::eRepeat;
    sampler_create_info.addressModeW = vk::SamplerAddressMode::eRepeat;
    sampler_create_info.borderColor = vk::BorderColor::eFloatOpaqueBlack;
    sampler_create_info.unnormalizedCoordinates = VK_FALSE;
    sampler_create_info.mipmapMode = vk::SamplerMipmapMode::eLinear;
    sampler_create_info.mipLodBias = 0.0F;
    sampler_create_info.minLod = 0.0F;
    sampler_create_info.maxLod = static_cast<float>(newTexture.getMipLevel());
    sampler_create_info.anisotropyEnable = physical_device_features.samplerAnisotropy;
    sampler_create_info.maxAnisotropy = (physical_device_features.samplerAnisotropy != 0u) ? 16.0F : 1.0F;

    vk::ResultValue<vk::Sampler> sampler_result = device->getLogicalDevice().createSampler(sampler_create_info);
    vk::Sampler newSampler = sampler_result.value;

    modelTextureSamplers.push_back(newSampler);
}