2025-04-27 01:57:25 +02:00
|
|
|
module;
|
|
|
|
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
#include <vulkan/vulkan.h>
|
2025-04-27 22:16:56 +02:00
|
|
|
#include <cstring>
|
|
|
|
|
#include <iostream>
|
2025-04-27 01:57:25 +02:00
|
|
|
|
|
|
|
|
export module Crafter.Graphics:Mesh;
|
2025-04-27 22:16:56 +02:00
|
|
|
import Crafter.Component;
|
2025-05-06 12:39:11 +02:00
|
|
|
import Crafter.Math;
|
2025-04-27 01:57:25 +02:00
|
|
|
import :VulkanBuffer;
|
|
|
|
|
|
|
|
|
|
namespace Crafter {
|
|
|
|
|
export template <typename VertexType>
|
2025-04-27 22:16:56 +02:00
|
|
|
class Mesh : public Component {
|
2025-04-27 01:57:25 +02:00
|
|
|
public:
|
2025-04-27 22:16:56 +02:00
|
|
|
std::uint32_t vertexCount;
|
|
|
|
|
std::uint32_t indexCount;
|
2025-04-27 01:57:25 +02:00
|
|
|
Buffer<VertexType> verticies;
|
|
|
|
|
Buffer<std::uint32_t> indicies;
|
2025-04-27 22:16:56 +02:00
|
|
|
Mesh(std::uint32_t vertexCount, std::uint32_t indexCount) : vertexCount(vertexCount), indexCount(indexCount), verticies(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, vertexCount), indicies(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, indexCount) {
|
2025-04-27 01:57:25 +02:00
|
|
|
|
|
|
|
|
}
|
2025-04-27 22:16:56 +02:00
|
|
|
static Mesh* FromAsset(const char* asset) {
|
|
|
|
|
std::uint32_t vertexCount = reinterpret_cast<const std::uint32_t*>(asset)[0];
|
|
|
|
|
std::uint32_t indexCount = reinterpret_cast<const std::uint32_t*>(asset)[1];
|
2025-04-27 23:20:52 +02:00
|
|
|
|
2025-04-27 22:16:56 +02:00
|
|
|
Mesh* mesh = new Mesh(vertexCount, (indexCount+ 63) & ~63);
|
|
|
|
|
const float* verticies = reinterpret_cast<const float*>(asset+sizeof(std::uint32_t)*2);
|
|
|
|
|
std::uint32_t counter = 0;
|
|
|
|
|
for(std::uint32_t i = 0; i < vertexCount*3; i+=3) {
|
|
|
|
|
mesh->verticies.value[counter].x = verticies[i];
|
|
|
|
|
mesh->verticies.value[counter].y = verticies[i+1];
|
|
|
|
|
mesh->verticies.value[counter].z = verticies[i+2];
|
|
|
|
|
mesh->verticies.value[counter].w = 1.0f;
|
|
|
|
|
counter++;
|
|
|
|
|
}
|
|
|
|
|
memcpy(mesh->indicies.value, asset+(sizeof(std::uint32_t)*2)+(vertexCount*sizeof(float)*3), indexCount*sizeof(std::uint32_t));
|
|
|
|
|
for(std::uint32_t i = indexCount; i < indexCount+(indexCount%64); i++) {
|
|
|
|
|
mesh->indicies.value[i] = 0;//pad indicies to nearest 64
|
|
|
|
|
}
|
|
|
|
|
return mesh;
|
|
|
|
|
}
|
2025-05-03 06:51:33 +02:00
|
|
|
static Mesh* FromAssetUV(const char* asset) {
|
|
|
|
|
std::uint32_t vertexCount = reinterpret_cast<const std::uint32_t*>(asset)[0];
|
|
|
|
|
std::uint32_t indexCount = reinterpret_cast<const std::uint32_t*>(asset)[1];
|
|
|
|
|
|
|
|
|
|
Mesh* mesh = new Mesh(vertexCount, (indexCount+ 63) & ~63);
|
|
|
|
|
const float* verticies = reinterpret_cast<const float*>(asset+sizeof(std::uint32_t)*2);
|
|
|
|
|
std::uint32_t counter = 0;
|
|
|
|
|
for(std::uint32_t i = 0; i < vertexCount*5; i+=5) {
|
|
|
|
|
mesh->verticies.value[counter].x = verticies[i];
|
|
|
|
|
mesh->verticies.value[counter].y = verticies[i+1];
|
|
|
|
|
mesh->verticies.value[counter].z = verticies[i+2];
|
|
|
|
|
mesh->verticies.value[counter].u = verticies[i+3];
|
|
|
|
|
mesh->verticies.value[counter].v = verticies[i+4];
|
|
|
|
|
mesh->verticies.value[counter].w = 1.0f;
|
|
|
|
|
counter++;
|
|
|
|
|
}
|
|
|
|
|
memcpy(mesh->indicies.value, asset+(sizeof(std::uint32_t)*2)+(vertexCount*sizeof(float)*5), indexCount*sizeof(std::uint32_t));
|
|
|
|
|
for(std::uint32_t i = indexCount; i < indexCount+(indexCount%64); i++) {
|
|
|
|
|
mesh->indicies.value[i] = 0;//pad indicies to nearest 64
|
|
|
|
|
}
|
|
|
|
|
return mesh;
|
|
|
|
|
}
|
2025-05-06 12:39:11 +02:00
|
|
|
|
|
|
|
|
static Mesh* FromHeightMapUV(float* heights, uint32_t sizeX, uint32_t sizeZ, float spacing) {
|
|
|
|
|
Mesh* mesh = new Mesh(sizeX*sizeZ, ((sizeX-1)*(sizeZ-1))*6);
|
|
|
|
|
for (float x = 0; x < sizeX; x++)
|
|
|
|
|
{
|
|
|
|
|
for (float z = 0; z < sizeZ; z++)
|
|
|
|
|
{
|
|
|
|
|
uint32_t xInt = static_cast<uint32_t>(x);
|
|
|
|
|
uint32_t zInt = static_cast<uint32_t>(z);
|
|
|
|
|
Vector<float, 3> pos((x * spacing) - ((sizeX*spacing) / 2.0f), heights[xInt * sizeX + zInt], (z * spacing) - ((sizeZ*spacing) / 2.0f));
|
|
|
|
|
Vector<float, 2> uv(x / sizeX, z / sizeZ);
|
|
|
|
|
VertexType vertex;
|
|
|
|
|
vertex.x = pos.x;
|
|
|
|
|
vertex.y = pos.y;
|
|
|
|
|
vertex.z = pos.z;
|
|
|
|
|
vertex.w = 1.0f;
|
|
|
|
|
vertex.u = uv.x;
|
|
|
|
|
vertex.v = uv.y;
|
|
|
|
|
mesh->verticies.value[xInt * sizeX + zInt] = vertex;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (uint32_t x = 0; x < sizeX - 1; x++)
|
|
|
|
|
{
|
|
|
|
|
for (uint32_t z = 0; z < sizeZ - 1; z++)
|
|
|
|
|
{
|
|
|
|
|
uint32_t topLeftIndex = x * sizeZ + z;
|
|
|
|
|
uint32_t topRightIndex = topLeftIndex + 1;
|
|
|
|
|
uint32_t bottomLeftIndex = topLeftIndex + sizeZ;
|
|
|
|
|
uint32_t bottomRightIndex = bottomLeftIndex + 1;
|
|
|
|
|
|
|
|
|
|
uint32_t index = (x * sizeX + z)*6;
|
|
|
|
|
|
|
|
|
|
mesh->indicies.value[index] = topRightIndex;
|
|
|
|
|
mesh->indicies.value[index + 1] = bottomLeftIndex;
|
|
|
|
|
mesh->indicies.value[index + 2] = topLeftIndex;
|
|
|
|
|
|
|
|
|
|
mesh->indicies.value[index + 3] = bottomRightIndex;
|
|
|
|
|
mesh->indicies.value[index + 4] = bottomLeftIndex;
|
|
|
|
|
mesh->indicies.value[index + 5] = topRightIndex;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return mesh;
|
|
|
|
|
}
|
2025-04-27 01:57:25 +02:00
|
|
|
};
|
|
|
|
|
}
|