module; #include #include #include #include #define GLM_FORCE_RADIANS #define GLM_FORCE_DEPTH_ZERO_TO_ONE #define GLM_ENABLE_EXPERIMENTAL #include #include #include #include export module Crafter.Graphics:MeshShader; import Crafter.Component; import :Mesh; import :Camera; import :VulkanElement; namespace Crafter { export template class MeshShader { public: glm::mat4 transform; ComponentRefOwning> mesh; ComponentRefOwning camera; Buffer mvp; MeshShader(Mesh* mesh, Camera* camera) : mvp(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT), mesh(mesh), camera(camera) { } void SetGroupSize(VulkanElement* element) { element->sizeX = (mesh.component->indexCount/3)/64; element->sizeY = 1; element->sizeZ = 1; } void WriteDescriptors(VulkanElement* element) { element->WriteDescriptor(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &mvp.descriptor); element->WriteDescriptor(0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, &mesh.component->verticies.descriptor); element->WriteDescriptor(0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2, &mesh.component->indicies.descriptor); } void Update() { mvp.value[0] = camera.component->projectionView*transform; } }; }