引擎接入反射功能

This commit is contained in:
ouczbs 2024-04-26 21:58:12 +08:00
parent faed6a2228
commit 9289182a1b
7 changed files with 154 additions and 137 deletions

View File

@ -1,74 +1,72 @@
#pragma once #pragma once
#include "svector.h" #include "svector.h"
#include <concepts> #include <concepts>
namespace refl { template<typename T>
template<typename T> class sarray {
class sarray { protected:
protected: const T* m_ptr;
const T* m_ptr; int m_count;
int m_count; public:
public: constexpr sarray(const T* ptr, int count) : m_ptr(ptr), m_count(count) {}
constexpr sarray(const T* ptr, int count) : m_ptr(ptr), m_count(count) {} constexpr sarray(const svector<T>& vec) : m_ptr(vec.front()), m_count(vec.size()) {}
constexpr sarray(const svector<T>& vec) : m_ptr(vec.front()), m_count(vec.size()) {} constexpr sarray() :m_ptr(nullptr), m_count(0) {}
constexpr sarray() :m_ptr(nullptr), m_count(0) {} constexpr sarray(std::initializer_list<T> list) : m_ptr(list.begin()), m_count(list.size()) {}
constexpr sarray(std::initializer_list<T> list) : m_ptr(list.begin()), m_count(list.size()) {} constexpr const T* front() const noexcept {
constexpr const T* front() const noexcept { return m_ptr;
return m_ptr; }
constexpr const T* back()const noexcept {
return m_ptr + m_count;
}
constexpr const T* at(int i) const noexcept {
if (i < m_count) {
return m_ptr + i;
} }
constexpr const T* back()const noexcept { return nullptr;
return m_ptr + m_count; }
} constexpr bool IsValid() const noexcept {
constexpr const T* at(int i) const noexcept { return m_count > 0;
if (i < m_count) { }
return m_ptr + i; constexpr bool empty() const noexcept {
} return m_count == 0;
return nullptr; }
} constexpr int size() const noexcept {
constexpr bool IsValid() const noexcept { return m_count;
return m_count > 0; }
} constexpr auto begin()const noexcept {
constexpr bool empty() const noexcept { return iterator{ m_ptr };
return m_count == 0; }
} constexpr auto end() const noexcept {
constexpr int size() const noexcept { return iterator{ m_ptr + m_count};
return m_count; }
} // Iterator class
constexpr auto begin()const noexcept { class iterator {
return iterator{ m_ptr }; private:
} const T* ptr;
constexpr auto end() const noexcept {
return iterator{ m_ptr + m_count};
}
// Iterator class
class iterator {
private:
const T* ptr;
public: public:
constexpr iterator(const T* p) : ptr(p) {} constexpr iterator(const T* p) : ptr(p) {}
// Overload ++ to move to next element // Overload ++ to move to next element
constexpr iterator& operator++() noexcept{ constexpr iterator& operator++() noexcept{
++ptr; ++ptr;
return *this; return *this;
} }
//这里其实是--it,而不是it-- //这里其实是--it,而不是it--
constexpr iterator& operator--(int) noexcept { constexpr iterator& operator--(int) noexcept {
--ptr; --ptr;
return *this; return *this;
} }
constexpr const T* operator->() const noexcept { constexpr const T* operator->() const noexcept {
return ptr; return ptr;
} }
// Overload * to dereference iterator // Overload * to dereference iterator
constexpr const T& operator*() const noexcept { constexpr const T& operator*() const noexcept {
return *ptr; return *ptr;
} }
// Overload != to compare iterators // Overload != to compare iterators
constexpr bool operator!=(const iterator& other) const noexcept { constexpr bool operator!=(const iterator& other) const noexcept {
return ptr != other.ptr; return ptr != other.ptr;
} }
}; };
}; };
}

View File

@ -1,73 +1,71 @@
#pragma once #pragma once
#include <array> #include <array>
#include <concepts> #include <concepts>
namespace refl { template<typename T>
template<typename T> class svector {
class svector { protected:
protected: T* m_ptr;
T* m_ptr; int m_count;
int m_count; int m_capicty;
int m_capicty; public:
public: constexpr svector() :m_ptr(nullptr), m_count(0), m_capicty(0){}
constexpr svector() :m_ptr(nullptr), m_count(0), m_capicty(0){} constexpr svector(T* ptr, int size, int count) : m_ptr(ptr), m_capicty(size), m_count(count){}
constexpr svector(T* ptr, int size, int count) : m_ptr(ptr), m_capicty(size), m_count(count){} constexpr T* front()const noexcept {
constexpr T* front()const noexcept { return m_ptr;
return m_ptr; }
constexpr T* back()const noexcept {
return m_ptr + m_count;
}
constexpr void push_back(const T& t) {
if (m_count < m_capicty) {
*(m_ptr + m_count) = t;
m_count++;
} }
constexpr T* back()const noexcept { }
return m_ptr + m_count; constexpr bool IsValid() const noexcept {
} return m_count > 0;
constexpr void push_back(const T& t) { }
if (m_count < m_capicty) { constexpr bool empty() const noexcept {
*(m_ptr + m_count) = t; return m_count == 0;
m_count++; }
} constexpr int size() const noexcept {
} return m_count;
constexpr bool IsValid() const noexcept { }
return m_count > 0; constexpr auto begin()const noexcept {
} return iterator{ m_ptr };
constexpr bool empty() const noexcept { }
return m_count == 0; constexpr auto end() const noexcept {
} return iterator{ m_ptr + m_count };
constexpr int size() const noexcept { }
return m_count; // Iterator class
} class iterator {
constexpr auto begin()const noexcept { private:
return iterator{ m_ptr }; const T* ptr;
}
constexpr auto end() const noexcept {
return iterator{ m_ptr + m_count };
}
// Iterator class
class iterator {
private:
const T* ptr;
public: public:
constexpr iterator(const T* p) : ptr(p) {} constexpr iterator(const T* p) : ptr(p) {}
// Overload ++ to move to next element // Overload ++ to move to next element
constexpr iterator& operator++() noexcept { constexpr iterator& operator++() noexcept {
++ptr; ++ptr;
return *this; return *this;
} }
//这里其实是--it,而不是it-- //这里其实是--it,而不是it--
constexpr iterator& operator--(int) noexcept { constexpr iterator& operator--(int) noexcept {
--ptr; --ptr;
return *this; return *this;
} }
constexpr const T* operator->() const noexcept { constexpr const T* operator->() const noexcept {
return ptr; return ptr;
} }
// Overload * to dereference iterator // Overload * to dereference iterator
constexpr const T& operator*() const noexcept { constexpr const T& operator*() const noexcept {
return *ptr; return *ptr;
} }
// Overload != to compare iterators // Overload != to compare iterators
constexpr bool operator!=(const iterator& other) const noexcept { constexpr bool operator!=(const iterator& other) const noexcept {
return ptr != other.ptr; return ptr != other.ptr;
} }
}; };
}; };
}

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
#include "zstd/parray.h" #include "zstd/parray.h"
#include "asset_render.h" #include "asset_render.h"
#include "../wrapper/vertex.h" #include "../meta/vertex.h"
namespace engineapi { namespace engineapi {
using zstd::parray; using zstd::parray;
class Texture; class Texture;

View File

@ -1,31 +1,49 @@
#pragma once #pragma once
#include "math/vector3.h" #include "math/vector3.h"
#include "math/vector2.h" #include "math/vector2.h"
#include "refl/refl.h"
// 顶点最多关联4个骨骼 // 顶点最多关联4个骨骼
#define MAX_NUM_BONES_PER_VERTEX 4 #define MAX_NUM_BONES_PER_VERTEX 4
namespace engineapi { namespace engineapi {
struct Vertex { struct Vertex {
//virtual Vector3& GetPosition() = 0;
}; };
struct PosVertex_Meta;
struct PosVertex : public Vertex{ struct PosVertex : public Vertex{
using MyMeta = PosVertex_Meta;
__cppast(Meta = {})
Vector3 Position = {}; Vector3 Position = {};
}; };
struct TexVertex_Meta;
struct TexVertex : public Vertex { struct TexVertex : public Vertex {
using MyMeta = TexVertex_Meta;
__cppast(Meta = {})
Vector3 Position = {}; Vector3 Position = {};
__cppast(Meta = {})
Vector3 Normal = {}; Vector3 Normal = {};
__cppast(Meta = {})
Vector2 TexCoords = {}; Vector2 TexCoords = {};
}; };
struct BoneVertex_Meta;
struct BoneVertex : public Vertex struct BoneVertex : public Vertex
{ {
using MyMeta = BoneVertex_Meta;
__cppast(Meta = {})
Vector3 Position = {}; Vector3 Position = {};
__cppast(Meta = {})
Vector2 TexCoords = {}; Vector2 TexCoords = {};
__cppast(Meta = {})
Vector3 Normal = {}; Vector3 Normal = {};
__cppast(Meta = {})
Vector3 Tangent = {}; Vector3 Tangent = {};
// 骨骼蒙皮数据 // 骨骼蒙皮数据
__cppast(Meta = {})
float Weights[MAX_NUM_BONES_PER_VERTEX] = {}; float Weights[MAX_NUM_BONES_PER_VERTEX] = {};
__cppast(Meta = {})
uint32_t BoneIDs[MAX_NUM_BONES_PER_VERTEX] = {}; uint32_t BoneIDs[MAX_NUM_BONES_PER_VERTEX] = {};
void AddBoneData(uint32_t boneID, float weight); void AddBoneData(uint32_t boneID, float weight);
}; };
}; };
#include "meta_vertex_gen.inl"

View File

@ -299,7 +299,7 @@ namespace vulkanapi {
pipelineInfo.pRasterizationState = &rasterizationInfo; pipelineInfo.pRasterizationState = &rasterizationInfo;
pipelineInfo.pMultisampleState = &multisampleInfo; pipelineInfo.pMultisampleState = &multisampleInfo;
pipelineInfo.pColorBlendState = &colorBlending; pipelineInfo.pColorBlendState = &colorBlending;
pipelineInfo.pDepthStencilState = nullptr; &depthStencilInfo; pipelineInfo.pDepthStencilState = nullptr; //&depthStencilInfo;
pipelineInfo.layout = pipelineLayout; pipelineInfo.layout = pipelineLayout;
pipelineInfo.renderPass = PassList[RENDER_FORWARD_RENDERING]->Ptr(); pipelineInfo.renderPass = PassList[RENDER_FORWARD_RENDERING]->Ptr();
pipelineInfo.subpass = 0; pipelineInfo.subpass = 0;

View File

@ -5,6 +5,9 @@ target("zengine")
set_kind("binary") set_kind("binary")
set_rundir(".") set_rundir(".")
add_rules("volk.env", "glsl.env") add_rules("volk.env", "glsl.env")
add_rules("c++.codegen",{
files = {"src/engine/render/meta/*.h"}
})
add_deps("zlib","zlog") add_deps("zlib","zlog")
add_defines("VULKAN_API") add_defines("VULKAN_API")
add_packages("vulkansdk","tinyobjloader","assimp","nlohmann_json") add_packages("vulkansdk","tinyobjloader","assimp","nlohmann_json")