This commit is contained in:
ouczbs 2024-04-03 17:58:02 +08:00
parent cadadd934f
commit 6e9c97f36e
8 changed files with 194 additions and 5 deletions

View File

@ -0,0 +1,8 @@
package("USmallFlat")
set_kind("library", {headeronly = true})
set_urls("https://github.com/Ubpa/USmallFlat.git")
add_includedirs("include")
on_install(function (package)
os.cp("include", package:installdir())
end)

View File

@ -0,0 +1,7 @@
package("UTemplate")
set_kind("library", {headeronly = true})
set_urls("https://github.com/Ubpa/UTemplate.git")
add_includedirs("include")
on_install(function (package)
os.cp("include", package:installdir())
end)

View File

@ -0,0 +1,27 @@
#pragma once
#include "UTemplate/Type.hpp"
#include <variant>
#include <functional>
using Ubpa::Name;
using Ubpa::type_name;
namespace refl {
struct MemberField {
uint32_t offset;
};
struct MemberFuncField {
using Offsetor = std::function<void* (void*)>;
Offsetor func;
};
class UClass;
struct FieldPtr {
using Offsetor = std::function<void* (void*)>;
// raw offsetor
using Data = std::variant<
uint32_t, // forward_offset_value 0 BASIC
double // static_obj 2 STATIC
>;
Name name;
const UClass* type;
Data data;
};
}

View File

@ -0,0 +1,13 @@
#pragma once
#include <type_traits>
namespace refl {
template<typename T, typename = void>
struct TypeInfo;
template<typename T>
struct TypeInfo<T, std::void_t<typename T::UClass, decltype(T::UClass::BuildClass())>> {
using UClass = typename T::UClass;
//这里的特性怎么走不到呢
inline static UClass StaticClass = UClass::BuildClass();
};
}

View File

@ -0,0 +1,32 @@
#pragma once
#include "type.h"
#include "field.h"
namespace refl {
class UClass{
public:
Name name;
uint32_t size;
public:
void Var() {
}
public:
template<typename T>
constexpr static UClass BuildClass() {
return {type_name<T>().View(), sizeof(T)};
}
protected:
template<uint32_t offset, typename T,typename U>
FieldPtr MakeMemberField(T U::* ptr, Name name) {
FieldPtr::Data member = { offset };
return { name, &TypeInfo<T>::StaticClass, {member} };
}
};
template<typename T, typename>
struct TypeInfo {
using UClass = UClass;
//这里的语法我也看不懂呀,防警告的,显示声明为模板调用
inline constexpr static UClass StaticClass = UClass::template BuildClass<T>();
};
}

53
engine/3rdparty/zlib/test/refl/vertex.h vendored Normal file
View File

@ -0,0 +1,53 @@
#pragma once
#include <cstdint>
#include <tuple>
#include <vector>
using namespace std;
#define sizeof_field(_struct, _field) sizeof(((_struct*)0)->_field)
// 顶点最多关联4个骨骼
#define MAX_NUM_BONES_PER_VERTEX 4
struct Vector2 {
float x;
float y;
};
struct Vector3 {
float x;
float y;
float z;
};
struct Vertex {
struct UClass {
virtual void BindLayout() = 0;
};
};
struct PosVertex : public Vertex {
Vector3 Position = {};
struct UClass : public Vertex::UClass{
int MemCount = 1;
tuple<int, int> Position{sizeof_field(PosVertex, Position), offsetof(PosVertex, Position)};
virtual void BindLayout() {};
};
};
struct TexVertex : public Vertex {
Vector3 Position = {};
Vector3 Normal = {};
Vector2 TexCoords = {};
};
struct BoneVertex : public Vertex
{
Vector3 Position = {};
Vector2 TexCoords = {};
Vector3 Normal = {};
Vector3 Tangent = {};
// 骨骼蒙皮数据
float Weights[MAX_NUM_BONES_PER_VERTEX] = {};
uint32_t BoneIDs[MAX_NUM_BONES_PER_VERTEX] = {};
void AddBoneData(uint32_t boneID, float weight) {};
};

40
engine/3rdparty/zlib/test/refl_01.cpp vendored Normal file
View File

@ -0,0 +1,40 @@
#include <iostream>
#include <array>
#include "refl/uclass.h"
#include "vertex.h"
using namespace std;
using namespace refl;
struct vec3 {
using UClass = class vec3_UClass;
float x;
float y;
float z;
float norm() {
return x * y * z;
}
};
struct vec3_UClass : public UClass {
array<FieldPtr,3> FList;
constexpr static vec3_UClass BuildClass() {
vec3_UClass cls{};
cls.name = type_name<vec3>().View();
cls.size = sizeof(vec3);
//offsetof(vec3, x) 很坑,相当坑
cls.FList[0] = cls.MakeMemberField<offsetof(vec3, x)>(&vec3::x, "x");
cls.FList[1] = cls.MakeMemberField<offsetof(vec3, y)>(&vec3::y, "y");
cls.FList[2] = cls.MakeMemberField<offsetof(vec3, z)>(&vec3::z, "z");
return cls;
}
};
int main() {
using uclass = TypeInfo<vec3>::UClass;
auto& res = TypeInfo<int>::StaticClass;
auto& res2 = TypeInfo<float>::StaticClass;
auto& res3 = TypeInfo<vec3>::StaticClass;
auto t1 = res3.FList[0];
//using t2 = t1::UClass;
std::cout << sizeof(Name) << "Type2: " << typeid(vec3).name() << std::endl;
cout << "hello world\n";
}

View File

@ -1,6 +1,8 @@
set_languages("cxx20")
add_requires("UTemplate")
target("zlib")
set_kind("static")
add_packages("UTemplate", {public = true})
add_includedirs("include", {public = true})
add_files("src/**/*.cpp")
add_headerfiles("include/**/*.h")
@ -18,12 +20,19 @@ target("zlib_test")
-- add_deps("zlib")
-- add_files("test/02condition.cpp")
target("zlib_test03_semaphore")
set_kind("binary")
add_deps("zlib")
add_files("test/03semaphore.cpp")
-- target("zlib_test03_semaphore")
-- set_kind("binary")
-- add_deps("zlib")
-- add_files("test/03semaphore.cpp")
-- target("zlib_test04_promise")
-- set_kind("binary")
-- add_deps("zlib")
-- add_files("test/04promise.cpp")
-- add_files("test/04promise.cpp")
target("refl_zlib")
set_kind("binary")
add_deps("zlib")
add_includedirs("test/refl")
add_files("test/refl_01.cpp")
add_headerfiles("test/refl/*.h")