From c998fcb4324e0e123057a88b688ae9f749b16d0d Mon Sep 17 00:00:00 2001
From: Trevor Hollmann <thollmann@uni-koblenz.de>
Date: Sun, 16 May 2021 10:55:05 +0200
Subject: [PATCH] [#26] Add first draft of Asset Loader API.

This commit adds the header for the asset loader module containing a
first draft of what the API for loading single meshes will look like.

Nothing is set in stone, all is up for discussion.
---
 config/Sources.cmake                  |  3 +
 include/asset_loader/asset_loader.hpp | 90 +++++++++++++++++++++++++++
 src/asset_loader/main.cpp             |  1 +
 3 files changed, 94 insertions(+)
 create mode 100644 include/asset_loader/asset_loader.hpp
 create mode 100644 src/asset_loader/main.cpp

diff --git a/config/Sources.cmake b/config/Sources.cmake
index 80fa3a09..53d0bea7 100644
--- a/config/Sources.cmake
+++ b/config/Sources.cmake
@@ -12,4 +12,7 @@ set(vkcv_sources
 
 		${vkcv_include}/vkcv/Window.hpp
 		${vkcv_source}/vkcv/Window.cpp
+
+		${vkcv_include}/asset_loader/asset_loader.hpp
+		${vkcv_source}/asset_loader/main.cpp
 )
diff --git a/include/asset_loader/asset_loader.hpp b/include/asset_loader/asset_loader.hpp
new file mode 100644
index 00000000..66e1b19a
--- /dev/null
+++ b/include/asset_loader/asset_loader.hpp
@@ -0,0 +1,90 @@
+#pragma once
+/**
+ * @authors Trevor Hollmann
+ * @file include/asset_loader/asset_loader.h
+ * @brief Interface of the asset loader module for the vkcv framework.
+ */
+
+#include <string>
+#include <vector>
+#include <cstdint>
+
+
+/* LOADING MESHES
+ * The description of meshes is a hierarchy of structures with the Mesh at the
+ * top.
+ *
+ * Each Mesh has an array of one or more vertex groups (called "primitives" in
+ * glFW parlance) and an array of zero or more Materials.
+ *
+ * Each vertex group describes a part of the meshes vertices by defining how
+ * they should be rendered (as points, lines, triangles), how many indices and
+ * vertices there are, how the content of the vertex buffer is to be
+ * interpreted and which material from the Meshes materials array should be
+ * used for the surface of the vertices.
+ * As a bonus there is also the axis aligned bounding box of the vertices.
+ *
+ * The vertex buffer is presented as a single block of binary data with a given
+ * length in bytes.
+ * The layout of the vertex buffer is described by an array of VertexAttribute
+ * structs that define the type of attribute, the offset, length and stride in
+ * bytes and number and type of components of the attribute.
+ * These values can directly be given to vulkan when describing the content of
+ * vertex buffers. */
+
+namespace asset {
+
+
+/* With these enums, 0 is reserved to signal uninitialized or invalid data. */
+enum PrimitiveMode { POINTS=1, LINES, TRIANGLES };
+enum PrimitiveType { POSITION=1, NORMAL, TEXCOORD_0 };
+
+typedef struct {
+	// TODO not yet needed for the first (unlit) triangle
+} Material;
+
+typedef struct {
+	PrimitiveType type;		// POSITION, NORMAL, ...
+	uint32_t offset;		// offset in bytes
+	uint32_t length;		// length of ... in bytes
+	uint32_t stride;		// stride in bytes
+	uint16_t componentType;		// eg. 5126 for float
+	uint8_t  componentCount;	// eg. 3 for vec3
+} VertexAttribute;
+
+typedef struct {
+	enum PrimitiveMode mode;	// draw as points, lines or triangle?
+	size_t numIndices, numVertices;
+	uint32_t *indices;		// array of indices for indexed rendering
+	struct {
+		void *data;		// the binary data of the buffer
+		size_t byteLength;	// the length of the entire buffer in bytes
+		std::vector<VertexAttribute> attributes;
+	} vertexBuffer;
+	struct { float x, y, z; } min;	// bounding box lower left
+	struct { float x, y, z; } max;	// bounding box upper right
+	uint8_t materialIndex;		// index to one of the meshes materials
+} VertexGroup;
+
+/* TODO This is just an initial draft of how a mesh loaded from a glTF file may
+ * be presented to other modules of the vkcv framework. */
+typedef struct {
+	std::string name;
+	std::vector<VertexGroup> vertexGroups;
+	std::vector<Material> materials;
+} Mesh;
+
+
+/**
+ * In its first iteration the asset loader module will only allow loading
+ * single meshes, one per glTF file.
+ * It will later be extended to allow loading entire scenes from glTF files.
+ *
+ * @param path must be the path to a glTF file containing a single mesh.
+ * @param mesh is a reference to a Mesh struct that will be filled with the
+ * 	content of the glTF file being loaded.
+ * */
+int loadMesh(const std::string &path, Mesh &mesh);
+
+
+}
diff --git a/src/asset_loader/main.cpp b/src/asset_loader/main.cpp
new file mode 100644
index 00000000..1e871e13
--- /dev/null
+++ b/src/asset_loader/main.cpp
@@ -0,0 +1 @@
+#include "asset_loader/asset_loader.hpp"
-- 
GitLab