summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
authortylermurphy534 <tylermurphy534@gmail.com>2022-09-26 20:57:53 -0400
committertylermurphy534 <tylermurphy534@gmail.com>2022-09-26 20:57:53 -0400
commit5a08c9c8e230fd952311f29bc02b22c7635d0178 (patch)
tree09bb647986461478ba8cc0671550d8488a6c434f /engine
parenttexture arrays (diff)
downloadminecraftvulkan-5a08c9c8e230fd952311f29bc02b22c7635d0178.tar.gz
minecraftvulkan-5a08c9c8e230fd952311f29bc02b22c7635d0178.tar.bz2
minecraftvulkan-5a08c9c8e230fd952311f29bc02b22c7635d0178.zip
vertex buffer is not a byte vector, multi texture loading
Diffstat (limited to 'engine')
-rw-r--r--engine/xe_engine.cpp8
-rw-r--r--engine/xe_engine.hpp4
-rw-r--r--engine/xe_image.cpp4
-rw-r--r--engine/xe_model.cpp26
-rw-r--r--engine/xe_model.hpp15
-rw-r--r--engine/xe_render_system.hpp12
-rw-r--r--engine/xe_vertex_array.cpp0
-rw-r--r--engine/xe_vertex_array.hpp0
8 files changed, 45 insertions, 24 deletions
diff --git a/engine/xe_engine.cpp b/engine/xe_engine.cpp
index b138942..2044c58 100644
--- a/engine/xe_engine.cpp
+++ b/engine/xe_engine.cpp
@@ -36,9 +36,9 @@ std::shared_ptr<Model> Engine::loadModelFromFile(const std::string &filename) {
return Model::createModelFromFile(xeDevice, filename);
}
-std::shared_ptr<Model> Engine::loadModelFromData(std::vector<float> vertexData, uint32_t vertexSize, std::vector<uint32_t> indices) {
+std::shared_ptr<Model> Engine::loadModelFromData(std::vector<unsigned char> vertexData, uint32_t vertexSize, std::vector<uint32_t> indices) {
Model::Builder builder{};
- builder.vertexData = vertexData;
+ builder.vertexData.data = vertexData;
builder.vertexSize = vertexSize;
if(indices.size() > 0) {
builder.indices = indices;
@@ -46,8 +46,8 @@ std::shared_ptr<Model> Engine::loadModelFromData(std::vector<float> vertexData,
return std::make_shared<Model>(xeDevice, builder);
}
-std::shared_ptr<Image> Engine::loadImageFromFile(const std::string &filename) {
- return std::make_shared<Image>(xeDevice, filename);
+Image* Engine::loadImageFromFile(const std::string &filename) {
+ return new Image(xeDevice, filename);
}
bool Engine::poll() {
diff --git a/engine/xe_engine.hpp b/engine/xe_engine.hpp
index dc534ea..83824e2 100644
--- a/engine/xe_engine.hpp
+++ b/engine/xe_engine.hpp
@@ -32,8 +32,8 @@ class Engine {
Device& getDevice() {return xeDevice;}
std::shared_ptr<Model> loadModelFromFile(const std::string &filename);
- std::shared_ptr<Model> loadModelFromData(std::vector<float> vertexData, uint32_t vertexSize, std::vector<uint32_t> indices);
- std::shared_ptr<Image> loadImageFromFile(const std::string &filename);
+ std::shared_ptr<Model> loadModelFromData(std::vector<unsigned char> vertexData, uint32_t vertexSize, std::vector<uint32_t> indices);
+ Image* loadImageFromFile(const std::string &filename);
bool beginFrame() { return xeRenderer.beginFrame(); }
void endFrame() { xeRenderer.endFrame(); }
diff --git a/engine/xe_image.cpp b/engine/xe_image.cpp
index 7be2b3b..2580384 100644
--- a/engine/xe_image.cpp
+++ b/engine/xe_image.cpp
@@ -221,8 +221,8 @@ void Image::createTextureSampler() {
VkSamplerCreateInfo samplerInfo{};
samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
- samplerInfo.magFilter = VK_FILTER_LINEAR;
- samplerInfo.minFilter = VK_FILTER_LINEAR;
+ samplerInfo.magFilter = VK_FILTER_NEAREST;
+ samplerInfo.minFilter = VK_FILTER_NEAREST;
samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
diff --git a/engine/xe_model.cpp b/engine/xe_model.cpp
index 6720c13..fd97f44 100644
--- a/engine/xe_model.cpp
+++ b/engine/xe_model.cpp
@@ -14,7 +14,7 @@
namespace xe {
Model::Model(Device &device, const Model::Builder &builder) : xeDevice{device} {
- createVertexBuffers(builder.vertexData, builder.vertexSize);
+ createVertexBuffers(builder.vertexData.data, builder.vertexSize);
createIndexBuffers(builder.indices);
}
@@ -26,10 +26,10 @@ std::unique_ptr<Model> Model::createModelFromFile(Device &device, const std::str
return std::make_unique<Model>(device, builder);
}
-void Model::createVertexBuffers(const std::vector<float> &vertexData, uint32_t vertexSize) {
- vertexCount = static_cast<uint32_t>(vertexData.size()) / (vertexSize / 4);
+void Model::createVertexBuffers(const std::vector<unsigned char> &vertexData, uint32_t vertexSize) {
+ vertexCount = static_cast<uint32_t>(vertexData.size()) / vertexSize;
assert(vertexCount >= 3 && "Vertex count must be atleast 3");
- VkDeviceSize bufferSize = vertexData.size() * 4;
+ VkDeviceSize bufferSize = vertexData.size();
Buffer stagingBuffer {
xeDevice,
@@ -113,7 +113,7 @@ void Model::Builder::loadModel(const std::string &filepath) {
throw std::runtime_error(warn + err);
}
- vertexData.clear();
+ vertexData.data.clear();
indices.clear();
vertexSize = 0;
@@ -123,22 +123,22 @@ void Model::Builder::loadModel(const std::string &filepath) {
for (const auto &index : shape.mesh.indices) {
if(index.vertex_index >= 0) {
- vertexData.push_back(attrib.vertices[3 * index.vertex_index + 0]);
- vertexData.push_back(attrib.vertices[3 * index.vertex_index + 1]);
- vertexData.push_back(attrib.vertices[3 * index.vertex_index + 2]);
+ vertexData.write<float>(attrib.vertices[3 * index.vertex_index + 0]);
+ vertexData.write<float>(attrib.vertices[3 * index.vertex_index + 1]);
+ vertexData.write<float>(attrib.vertices[3 * index.vertex_index + 2]);
vertex = true;
}
if(index.normal_index >= 0) {
- vertexData.push_back(attrib.normals[3 * index.normal_index + 0]);
- vertexData.push_back(attrib.normals[3 * index.normal_index + 1]);
- vertexData.push_back(attrib.normals[3 * index.normal_index + 2]);
+ vertexData.write<float>(attrib.normals[3 * index.normal_index + 0]);
+ vertexData.write<float>(attrib.normals[3 * index.normal_index + 1]);
+ vertexData.write<float>(attrib.normals[3 * index.normal_index + 2]);
normal = true;
}
if(index.texcoord_index >= 0) {
- vertexData.push_back(attrib.texcoords[2 * index.texcoord_index + 0]);
- vertexData.push_back(attrib.texcoords[2 * index.texcoord_index + 1]);
+ vertexData.write<float>(attrib.texcoords[2 * index.texcoord_index + 0]);
+ vertexData.write<float>(attrib.texcoords[2 * index.texcoord_index + 1]);
uvs = true;
}
diff --git a/engine/xe_model.hpp b/engine/xe_model.hpp
index 09c5913..41dccd5 100644
--- a/engine/xe_model.hpp
+++ b/engine/xe_model.hpp
@@ -14,8 +14,19 @@ namespace xe {
class Model {
public:
+ struct Data {
+ std::vector<unsigned char> data{};
+ template <typename T>
+ void write(T d) {
+ unsigned char const * p = reinterpret_cast<unsigned char const *>(&d);
+ for(std::size_t i = 0; i < sizeof(T); i++){
+ data.push_back(p[i]);
+ }
+ }
+ };
+
struct Builder {
- std::vector<float> vertexData{};
+ Model::Data vertexData{};
uint32_t vertexSize;
std::vector<uint32_t> indices{};
@@ -35,7 +46,7 @@ class Model {
void draw(VkCommandBuffer commandBuffer);
private:
- void createVertexBuffers(const std::vector<float> &vertexData, uint32_t vertexSize);
+ void createVertexBuffers(const std::vector<unsigned char> &vertexData, uint32_t vertexSize);
void createIndexBuffers(const std::vector<uint32_t> &indexData);
Device &xeDevice;
diff --git a/engine/xe_render_system.hpp b/engine/xe_render_system.hpp
index b82d6e7..e0915dd 100644
--- a/engine/xe_render_system.hpp
+++ b/engine/xe_render_system.hpp
@@ -24,7 +24,7 @@ class RenderSystem {
public:
Builder(Engine &xeEngine, std::string vert, std::string frag) : xeEngine{xeEngine}, vert{vert}, frag{frag} {}
- Builder& addVertexBinding(uint32_t binding, uint32_t dimension, uint32_t offset){
+ Builder& addVertexBindingf(uint32_t binding, uint32_t dimension, uint32_t offset){
if(dimension == 1)
attributeDescptions.push_back({binding, 0, VK_FORMAT_R32_SFLOAT, offset});
if(dimension == 2)
@@ -34,6 +34,16 @@ class RenderSystem {
return *this;
}
+ Builder& addVertexBindingi(uint32_t binding, uint32_t dimension, uint32_t offset){
+ if(dimension == 1)
+ attributeDescptions.push_back({binding, 0, VK_FORMAT_R32_SINT, offset});
+ if(dimension == 2)
+ attributeDescptions.push_back({binding, 0, VK_FORMAT_R32G32_SINT, offset});
+ if(dimension == 3)
+ attributeDescptions.push_back({binding, 0, VK_FORMAT_R32G32B32_SINT, offset});
+ return *this;
+ }
+
Builder& setVertexSize(uint32_t size) {
vertexSize = size;
return *this;
diff --git a/engine/xe_vertex_array.cpp b/engine/xe_vertex_array.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/engine/xe_vertex_array.cpp
diff --git a/engine/xe_vertex_array.hpp b/engine/xe_vertex_array.hpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/engine/xe_vertex_array.hpp