From 4e089d42119414dae2b38be5ff0729967d5cc9bc Mon Sep 17 00:00:00 2001
From: Philip Trettner <Philip.Trettner@rwth-aachen.de>
Date: Sat, 15 Dec 2018 14:55:13 +0100
Subject: [PATCH] initial commit

---
 .clang-format                       |  54 +++++++++++++++
 CMakeLists.txt                      |  16 +++++
 README.md                           | 102 +++++++++++++++++++++++++++-
 src/tg/backend/glow/glow-backend.cc |   1 +
 src/tg/backend/lava/lava-backend.cc |   1 +
 src/tg/objects/Buffer.hh            |  15 ++++
 src/tg/objects/CommandBuffer.hh     |  13 ++++
 src/tg/objects/Device.cc            |  27 ++++++++
 src/tg/objects/Device.hh            |  51 ++++++++++++++
 src/tg/objects/Framebuffer.hh       |  13 ++++
 src/tg/objects/Image.hh             |  12 ++++
 src/tg/objects/Shader.hh            |  17 +++++
 src/tg/objects/Window.hh            |  23 +++++++
 src/tg/objects/fwd.hh               |  48 +++++++++++++
 src/tg/shader/context.hh            |  11 +++
 src/tg/shader/types.hh              |  31 +++++++++
 src/tg/typed-graphics.cc            |   0
 src/tg/typed-graphics.hh            |  14 ++++
 18 files changed, 448 insertions(+), 1 deletion(-)
 create mode 100644 .clang-format
 create mode 100644 CMakeLists.txt
 create mode 100644 src/tg/backend/glow/glow-backend.cc
 create mode 100644 src/tg/backend/lava/lava-backend.cc
 create mode 100644 src/tg/objects/Buffer.hh
 create mode 100644 src/tg/objects/CommandBuffer.hh
 create mode 100644 src/tg/objects/Device.cc
 create mode 100644 src/tg/objects/Device.hh
 create mode 100644 src/tg/objects/Framebuffer.hh
 create mode 100644 src/tg/objects/Image.hh
 create mode 100644 src/tg/objects/Shader.hh
 create mode 100644 src/tg/objects/Window.hh
 create mode 100644 src/tg/objects/fwd.hh
 create mode 100644 src/tg/shader/context.hh
 create mode 100644 src/tg/shader/types.hh
 create mode 100644 src/tg/typed-graphics.cc
 create mode 100644 src/tg/typed-graphics.hh

diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..d4b1133
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,54 @@
+# Style file for clang-format ( http://clang.llvm.org/docs/ClangFormatStyleOptions.html )
+
+# Style is based on google's c++ coding style.
+# see http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
+BasedOnStyle: Google
+#Language: Cpp
+Standard: Cpp11
+
+
+# 80 columns guideline
+ColumnLimit: 150
+PenaltyExcessCharacter: 1
+PenaltyBreakString: 50
+
+
+# Indentation and Braces
+IndentWidth: 4
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: All
+AlwaysBreakBeforeMultilineStrings: false
+AlwaysBreakTemplateDeclarations: true
+#BraceBreakingStyle: ???
+BreakBeforeBinaryOperators: true
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializersBeforeComma: false
+BreakBeforeBraces: Allman
+BinPackParameters: false
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
+Cpp11BracedListStyle: true
+IndentCaseLabels: false
+
+
+# Spaces
+DerivePointerAlignment: true
+DerivePointerBinding: true
+MaxEmptyLinesToKeep: 2
+SpaceAfterControlStatementKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles: false
+SpacesInCStyleCastParentheses: false
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+#SpacesInSquareBrackets: false
+UseTab: Never
+ConstructorInitializerIndentWidth: 2
+AccessModifierOffset: -4
+
+
+# Comments
+AlignTrailingComments: true
+CommentPragmas: '!Api.*'
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..60798c7
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,16 @@
+cmake_minimum_required(VERSION 3.8)
+project(TypedGraphics)
+
+# ===============================================
+# Create target
+
+file(GLOB_RECURSE SOURCES
+    "src/*.cc"
+    "src/*.hh"
+)
+
+source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES})
+
+add_library(typed-graphics ${SOURCES})
+
+target_include_directories(typed-graphics PUBLIC "src")
diff --git a/README.md b/README.md
index a2006c9..4dbd86a 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,103 @@
 # typed-graphics
 
-Graphics library with strongly typed interfaces.
\ No newline at end of file
+Graphics library with strongly typed interfaces.
+
+
+## Usage / Example
+
+
+```
+#include <tg/typed-graphics.hh>
+
+// TODO
+```
+
+
+## Dependencies
+
+`typed-graphics` expects dependencies as CMake targets.
+
+### Required
+
+* ???
+
+### Backend Dependencies
+
+* `lava` Vulkan library
+* `glow` OpenGL library
+
+### Optional
+
+* `typed-math` math library
+* `glm` math library
+* `polymesh` mesh library
+* `imgui` UI library
+* `aion` profiling library
+
+
+## CMake Usage
+
+```
+cmake_minimum_required(VERSION 3.8)
+project(MyProject)
+
+
+# ===============================================
+# Global settings
+
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+set(BUILD_SHARED_LIBS ON) # required by some dependencies
+
+
+# ===============================================
+# Dependencies
+
+# math library
+add_subdirectory(extern/typed-math)
+
+# graphics library
+add_subdirectory(extern/typed-graphics)
+
+# mesh library
+add_subdirectory(extern/polymesh)
+
+
+# ===============================================
+# Create target
+
+file(GLOB_RECURSE SOURCES
+    "src/*.cc"
+    "src/*.hh"
+)
+
+source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES})
+
+add_executable(MyProject ${SOURCES})
+
+target_include_directories(MyProject PUBLIC "src")
+
+target_link_libraries(MyProject PUBLIC
+    typed-math
+    typed-graphics
+    polymesh
+)
+
+
+# ===============================================
+# Compile flags
+
+if (MSVC)
+    target_compile_options(MyProject PUBLIC 
+        /MP
+    )
+else()
+    target_compile_options(MyProject PUBLIC 
+        -Wall
+        -Wno-unused-variable
+    )
+endif()
+
+```
diff --git a/src/tg/backend/glow/glow-backend.cc b/src/tg/backend/glow/glow-backend.cc
new file mode 100644
index 0000000..0ffdd02
--- /dev/null
+++ b/src/tg/backend/glow/glow-backend.cc
@@ -0,0 +1 @@
+// TODO
\ No newline at end of file
diff --git a/src/tg/backend/lava/lava-backend.cc b/src/tg/backend/lava/lava-backend.cc
new file mode 100644
index 0000000..0ffdd02
--- /dev/null
+++ b/src/tg/backend/lava/lava-backend.cc
@@ -0,0 +1 @@
+// TODO
\ No newline at end of file
diff --git a/src/tg/objects/Buffer.hh b/src/tg/objects/Buffer.hh
new file mode 100644
index 0000000..4cffc03
--- /dev/null
+++ b/src/tg/objects/Buffer.hh
@@ -0,0 +1,15 @@
+#pragma once
+
+#include <vector>
+
+#include "fwd.hh"
+
+namespace tg
+{
+template <class DataT>
+class Buffer
+{
+    using data_t = DataT;
+};
+
+} // namespace tg
diff --git a/src/tg/objects/CommandBuffer.hh b/src/tg/objects/CommandBuffer.hh
new file mode 100644
index 0000000..4e3a73a
--- /dev/null
+++ b/src/tg/objects/CommandBuffer.hh
@@ -0,0 +1,13 @@
+#pragma once
+
+namespace tg
+{
+class CommandBuffer
+{
+    // TODO
+public:
+    struct Recorder {
+        // TODO
+    };
+};
+} // namespace tg
diff --git a/src/tg/objects/Device.cc b/src/tg/objects/Device.cc
new file mode 100644
index 0000000..8f9c338
--- /dev/null
+++ b/src/tg/objects/Device.cc
@@ -0,0 +1,27 @@
+#include "Device.hh"
+
+#include "Window.hh"
+
+namespace tg
+{
+SharedWindow Device::createWindow(int w, int h)
+{
+    // TODO
+    (void)w;
+    (void)h;
+    return std::make_shared<Window>();
+}
+
+SharedCommandBuffer Device::createCommandBuffer()
+{
+    // TODO
+    return std::make_shared<CommandBuffer>();
+}
+
+SharedDevice Device::create()
+{
+    // TODO
+    return std::make_shared<Device>();
+}
+
+} // namespace tg
diff --git a/src/tg/objects/Device.hh b/src/tg/objects/Device.hh
new file mode 100644
index 0000000..15fd5fb
--- /dev/null
+++ b/src/tg/objects/Device.hh
@@ -0,0 +1,51 @@
+#pragma once
+
+#include <functional>
+#include <vector>
+
+#include "CommandBuffer.hh"
+#include "fwd.hh"
+
+#include <tg/shader/context.hh>
+
+namespace tg
+{
+class Device
+{
+    // TODO
+
+public:
+    SharedWindow createWindow(int w, int h);
+
+    template <class DataT>
+    SharedBuffer<DataT> createBuffer(std::vector<DataT> const& data)
+    {
+        auto buffer = std::make_shared<Buffer<DataT>>();
+        // TODO: upload
+        (void)data;
+        return buffer;
+    }
+
+    template <class VertexT, class FragmentT, class FunT>
+    SharedShader<VertexT, FragmentT> createShader(FunT&& fun)
+    {
+        auto shader = std::make_shared<Shader<VertexT, FragmentT>>();
+        // std::function<FragmentT(shader::context & ctx, VertexT v)> f = fun;
+        // TODO: create shader from function
+        // TODO: properly use shader types
+        (void)fun;
+        return shader;
+    }
+
+    SharedCommandBuffer createCommandBuffer();
+
+    CommandBuffer::Recorder submitGraphicsCommandBuffer()
+    {
+        // TODO
+        return {};
+    }
+
+public:
+    static SharedDevice create();
+};
+} // namespace tg
diff --git a/src/tg/objects/Framebuffer.hh b/src/tg/objects/Framebuffer.hh
new file mode 100644
index 0000000..e8f29d2
--- /dev/null
+++ b/src/tg/objects/Framebuffer.hh
@@ -0,0 +1,13 @@
+#pragma once
+
+#include <memory>
+
+namespace tg
+{
+template <class FragmentT>
+class Framebuffer
+{
+    using fragment_t = FragmentT;
+};
+
+} // namespace tg
diff --git a/src/tg/objects/Image.hh b/src/tg/objects/Image.hh
new file mode 100644
index 0000000..75167e6
--- /dev/null
+++ b/src/tg/objects/Image.hh
@@ -0,0 +1,12 @@
+#pragma once
+
+#include <memory>
+
+namespace tg
+{
+template <int D, class DataT>
+struct Image
+{
+    using data_t = DataT;
+};
+} // namespace tg
diff --git a/src/tg/objects/Shader.hh b/src/tg/objects/Shader.hh
new file mode 100644
index 0000000..8114e9b
--- /dev/null
+++ b/src/tg/objects/Shader.hh
@@ -0,0 +1,17 @@
+#pragma once
+
+#include <functional>
+
+#include "fwd.hh"
+
+#include <tg/shader/context.hh>
+
+namespace tg
+{
+template <class VertexT, class FragmentT>
+struct Shader
+{
+    using vertex_t = VertexT;
+    using fragment_t = FragmentT;
+};
+} // namespace tg
diff --git a/src/tg/objects/Window.hh b/src/tg/objects/Window.hh
new file mode 100644
index 0000000..e6c5e72
--- /dev/null
+++ b/src/tg/objects/Window.hh
@@ -0,0 +1,23 @@
+#pragma once
+
+#include "fwd.hh"
+
+namespace tg
+{
+class Window
+{
+public:
+    struct Frame
+    {
+        // TODO: RAII
+
+        operator bool() const
+        {
+            // TODO
+            return true;
+        }
+    };
+
+    Frame startFrame() { return {}; }
+};
+} // namespace tg
diff --git a/src/tg/objects/fwd.hh b/src/tg/objects/fwd.hh
new file mode 100644
index 0000000..d9a7dd9
--- /dev/null
+++ b/src/tg/objects/fwd.hh
@@ -0,0 +1,48 @@
+#pragma once
+
+#include <memory>
+
+// TODO: maybe better management?
+namespace tg
+{
+class Device;
+using SharedDevice = std::shared_ptr<Device>;
+
+class Window;
+using SharedWindow = std::shared_ptr<Window>;
+
+class CommandBuffer;
+using SharedCommandBuffer = std::shared_ptr<CommandBuffer>;
+
+template <class FragmentT>
+class Framebuffer;
+template <class FragmentT>
+using SharedFramebuffer = std::shared_ptr<Framebuffer<FragmentT>>;
+
+template <class VertexT, class FragmentT>
+struct Shader;
+template <class VertexT, class FragmentT>
+using SharedShader = std::shared_ptr<Shader<VertexT, FragmentT>>;
+
+template <int D, class DataT>
+struct Image;
+template <class DataT>
+using Image1D = Image<1, DataT>;
+template <class DataT>
+using Image2D = Image<2, DataT>;
+template <class DataT>
+using Image3D = Image<3, DataT>;
+template <int D, class DataT>
+using SharedImage = std::shared_ptr<Image<D, DataT>>;
+template <class DataT>
+using SharedImage1D = std::shared_ptr<Image1D<DataT>>;
+template <class DataT>
+using SharedImage2D = std::shared_ptr<Image2D<DataT>>;
+template <class DataT>
+using SharedImage3D = std::shared_ptr<Image3D<DataT>>;
+
+template <class DataT>
+class Buffer;
+template <class DataT>
+using SharedBuffer = std::shared_ptr<Buffer<DataT>>;
+} // namespace tg
diff --git a/src/tg/shader/context.hh b/src/tg/shader/context.hh
new file mode 100644
index 0000000..f2df04c
--- /dev/null
+++ b/src/tg/shader/context.hh
@@ -0,0 +1,11 @@
+#pragma once
+
+#include "types.hh"
+
+namespace tg::shader
+{
+struct context
+{
+    vec4 ndc_position;
+};
+} // namespace tg::shader
diff --git a/src/tg/shader/types.hh b/src/tg/shader/types.hh
new file mode 100644
index 0000000..c7278a9
--- /dev/null
+++ b/src/tg/shader/types.hh
@@ -0,0 +1,31 @@
+#pragma once
+
+namespace tg::shader
+{
+// TODO: properly
+
+
+struct vec2;
+struct vec3;
+struct vec4;
+struct f8vec3;
+
+struct vec2
+{
+};
+struct vec3
+{
+    vec3() = default;
+    vec3(f8vec3 const&) {}
+};
+struct vec4
+{
+    vec4() = default;
+    vec4(vec3 const&, float) {}
+};
+
+struct f8vec3
+{
+    f8vec3(vec3 const&) {}
+};
+} // namespace tg::shader
diff --git a/src/tg/typed-graphics.cc b/src/tg/typed-graphics.cc
new file mode 100644
index 0000000..e69de29
diff --git a/src/tg/typed-graphics.hh b/src/tg/typed-graphics.hh
new file mode 100644
index 0000000..fd04b2a
--- /dev/null
+++ b/src/tg/typed-graphics.hh
@@ -0,0 +1,14 @@
+#pragma once
+
+// Objects
+#include "objects/Buffer.hh"
+#include "objects/CommandBuffer.hh"
+#include "objects/Device.hh"
+#include "objects/Framebuffer.hh"
+#include "objects/Image.hh"
+#include "objects/Shader.hh"
+#include "objects/Window.hh"
+
+// Shader
+#include "shader/context.hh"
+#include "shader/types.hh"
-- 
GitLab