update ytl lib
This commit is contained in:
parent
c6e986bb69
commit
378e0c12a7
3
engine/3rdparty/xmake.lua
vendored
3
engine/3rdparty/xmake.lua
vendored
@ -4,4 +4,5 @@ add_requires("spdlog")
|
|||||||
add_requires("tinyobjloader")
|
add_requires("tinyobjloader")
|
||||||
add_requires("vulkansdk")
|
add_requires("vulkansdk")
|
||||||
add_requires("assimp")
|
add_requires("assimp")
|
||||||
add_requires("nlohmann_json")
|
add_requires("nlohmann_json")
|
||||||
|
add_requires("ylt")
|
||||||
58
engine/3rdparty/ylt/test/struct_pack.cpp
vendored
Normal file
58
engine/3rdparty/ylt/test/struct_pack.cpp
vendored
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#include <ylt/struct_pack.hpp>
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
using namespace struct_pack;
|
||||||
|
using UniversalVectorType = detail::UniversalVectorType;
|
||||||
|
using UniversalType = detail::UniversalType;
|
||||||
|
using UniversalOptionalType = detail::UniversalOptionalType;
|
||||||
|
using UniversalIntegralType = detail::UniversalIntegralType;
|
||||||
|
using UniversalNullptrType = detail::UniversalNullptrType;
|
||||||
|
using UniversalCompatibleType = detail::UniversalCompatibleType;
|
||||||
|
struct person {
|
||||||
|
int64_t id;
|
||||||
|
std::string name;
|
||||||
|
int age;
|
||||||
|
double salary;
|
||||||
|
};
|
||||||
|
template <typename T, typename construct_param_t, typename = void, typename... Args>
|
||||||
|
struct is_constructable_impl : std::false_type {};
|
||||||
|
|
||||||
|
template <typename T, typename construct_param_t, typename... Args>
|
||||||
|
struct is_constructable_impl < T, construct_param_t,
|
||||||
|
std::void_t<
|
||||||
|
decltype(T{ {Args{}}..., {construct_param_t{}} }) > , Args... >
|
||||||
|
: std::true_type {};
|
||||||
|
|
||||||
|
template <typename T, typename construct_param_t, typename... Args>
|
||||||
|
bool is_constructable = is_constructable_impl<T, construct_param_t, void, Args...>::value;
|
||||||
|
|
||||||
|
template <typename T, typename... Args>
|
||||||
|
std::size_t members_count_impl() {
|
||||||
|
if (is_constructable<T, UniversalVectorType, Args...>) {
|
||||||
|
cout << "is_constructable UniversalVectorType \n";
|
||||||
|
//return members_count_impl<T, Args..., UniversalVectorType>();
|
||||||
|
}
|
||||||
|
else if (is_constructable<T, UniversalType, Args...>) {
|
||||||
|
cout << "is_constructable UniversalType \n";
|
||||||
|
//return members_count_impl<T, UniversalType, Args...>();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return sizeof...(Args);
|
||||||
|
}
|
||||||
|
return sizeof...(Args);
|
||||||
|
}
|
||||||
|
int main() {
|
||||||
|
person person1{ .id = 1, .name = "hello struct pack", .age = 20, .salary = 1024.42 };
|
||||||
|
|
||||||
|
using type = remove_cvref_t<decltype(person1)>;
|
||||||
|
using type2 = remove_cvref_t<type>;
|
||||||
|
auto Count = members_count<type>;
|
||||||
|
int isc = members_count_impl<type2>();
|
||||||
|
int c2 = detail::members_count<type>();
|
||||||
|
// 1行代码序列化
|
||||||
|
vector<char> buffer = serialize(person1);
|
||||||
|
|
||||||
|
// 只反序列化person的第2个字段
|
||||||
|
auto name = get_field<person, 1>(buffer.data(), buffer.size());
|
||||||
|
cout << "hello " << name.value() << "Count == " << Count << c2;
|
||||||
|
}
|
||||||
12
engine/3rdparty/ylt/xmake.lua
vendored
Normal file
12
engine/3rdparty/ylt/xmake.lua
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package("ylt")
|
||||||
|
set_kind("library", {headeronly = true})
|
||||||
|
set_urls("https://github.com/alibaba/yalantinglibs.git")
|
||||||
|
add_includedirs("include")
|
||||||
|
on_install(function (package)
|
||||||
|
os.cp("include", package:installdir())
|
||||||
|
end)
|
||||||
|
|
||||||
|
target("ylt_struct_pack")
|
||||||
|
set_kind("binary")
|
||||||
|
add_packages("ylt")
|
||||||
|
add_files("test/struct_pack.cpp")
|
||||||
50
engine/3rdparty/zlib/include/zstd/parray.h
vendored
Normal file
50
engine/3rdparty/zlib/include/zstd/parray.h
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <concepts>
|
||||||
|
namespace zstd {
|
||||||
|
template<typename T>
|
||||||
|
class parray {
|
||||||
|
protected:
|
||||||
|
uint32_t m_size;
|
||||||
|
uint32_t m_head{0};
|
||||||
|
uint32_t m_tsize;
|
||||||
|
char* m_buf;
|
||||||
|
public:
|
||||||
|
~parray() {
|
||||||
|
if (m_buf) {
|
||||||
|
free(m_buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parray(uint32_t size = 1, uint32_t tsize = sizeof(T)) : m_buf((char*)malloc(tsize * size)), m_size(size) , m_tsize(tsize){}
|
||||||
|
parray(parray& other) noexcept{
|
||||||
|
m_size = other.m_size;
|
||||||
|
m_head = other.m_head;
|
||||||
|
m_tsize = other.m_tsize;
|
||||||
|
m_buf = other.m_buf;
|
||||||
|
other.m_buf = nullptr;
|
||||||
|
}
|
||||||
|
uint32_t size() {
|
||||||
|
return m_head;
|
||||||
|
}
|
||||||
|
uint32_t data_size() {
|
||||||
|
return m_tsize * m_head;
|
||||||
|
}
|
||||||
|
void* data() {
|
||||||
|
return m_buf;
|
||||||
|
}
|
||||||
|
template<typename S>
|
||||||
|
requires std::is_base_of<T, S>::value
|
||||||
|
void push_back(S& s) {
|
||||||
|
if (m_head >= m_size) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*(S*)(m_buf + m_head * m_tsize) = s;
|
||||||
|
m_head++;
|
||||||
|
};
|
||||||
|
T* at(int i) {
|
||||||
|
if (i >= m_head) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return (T*)(m_buf + i * m_tsize);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
59
engine/3rdparty/zlib/include/zstd/pool_static.h
vendored
59
engine/3rdparty/zlib/include/zstd/pool_static.h
vendored
@ -1,59 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <concepts>
|
|
||||||
namespace zstd {
|
|
||||||
template<size_t T>
|
|
||||||
struct static_buffer {
|
|
||||||
char data[T];
|
|
||||||
};
|
|
||||||
template<std::move_constructible T, size_t T_capacity = 1>
|
|
||||||
class channel_static {
|
|
||||||
static_assert(T_capacity != 0);
|
|
||||||
protected:
|
|
||||||
int m_tail;
|
|
||||||
int m_head;
|
|
||||||
static_buffer<sizeof(T)> m_buf[T_capacity];
|
|
||||||
std::mutex m_mtx;
|
|
||||||
std::condition_variable m_cv;
|
|
||||||
public:
|
|
||||||
~channel_static() {
|
|
||||||
reset();
|
|
||||||
}
|
|
||||||
channel_static() : m_tail(0), m_head(0), m_buf() {}
|
|
||||||
int head() {
|
|
||||||
return m_head;
|
|
||||||
}
|
|
||||||
int tail() {
|
|
||||||
return m_tail;
|
|
||||||
}
|
|
||||||
int count() {
|
|
||||||
return m_head - m_tail;
|
|
||||||
}
|
|
||||||
void reset() {
|
|
||||||
for (int i = m_tail; i < m_head; i++) {
|
|
||||||
std::destroy_at((T*)(m_buf + m_tail % T_capacity));
|
|
||||||
}
|
|
||||||
m_tail = 0;
|
|
||||||
m_head = 0;
|
|
||||||
}
|
|
||||||
template<typename... Args>
|
|
||||||
void release(Args... args) {
|
|
||||||
std::unique_lock<std::mutex> lck(m_mtx);
|
|
||||||
while (m_head >= m_tail + T_capacity) {
|
|
||||||
m_cv.wait(lck);
|
|
||||||
}
|
|
||||||
std::construct_at((T*)(m_buf + m_head % T_capacity), std::forward<Args>(args)...);
|
|
||||||
if (m_head++ == m_tail)
|
|
||||||
m_cv.notify_one();
|
|
||||||
};
|
|
||||||
T acquire() {
|
|
||||||
std::unique_lock<std::mutex> lck(m_mtx);
|
|
||||||
while (m_tail >= m_head) {
|
|
||||||
m_cv.wait(lck);
|
|
||||||
}
|
|
||||||
int tail = m_tail % T_capacity;
|
|
||||||
if (m_tail++ == m_head - T_capacity)
|
|
||||||
m_cv.notify_one();
|
|
||||||
return std::move(*(T*)(m_buf + tail));
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@ -1,8 +1,6 @@
|
|||||||
#include "asset_struct.h"
|
#include "asset_struct.h"
|
||||||
|
|
||||||
namespace engineapi {
|
namespace engineapi {
|
||||||
void Vertex::AddBoneData(uint32_t boneID, float weight)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,27 +2,12 @@
|
|||||||
#include "../asset.h"
|
#include "../asset.h"
|
||||||
#include "math/math.h"
|
#include "math/math.h"
|
||||||
#include "asset_enum.h"
|
#include "asset_enum.h"
|
||||||
// 顶点最多关联4个骨骼
|
|
||||||
#define MAX_NUM_BONES_PER_VERTEX 4
|
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
using std::vector;
|
using std::vector;
|
||||||
|
|
||||||
namespace engineapi
|
namespace engineapi
|
||||||
{
|
{
|
||||||
struct 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);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct BoneNode
|
struct BoneNode
|
||||||
{
|
{
|
||||||
string name;
|
string name;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
#include "mesh.h"
|
#include "mesh.h"
|
||||||
#include "render/renderapi.h"
|
#include "render/renderapi.h"
|
||||||
namespace engineapi {
|
namespace engineapi {
|
||||||
Mesh::Mesh(string name, uint32_t flags, vector<Vertex>& vertices, vector<uint32_t>& indices)
|
Mesh::Mesh(string name, uint32_t flags, parray<Vertex>& vertices, vector<uint32_t>& indices)
|
||||||
:Asset(name, flags)
|
:Asset(name, flags)
|
||||||
,mVertices(vertices)
|
,mVertices(vertices)
|
||||||
,mIndices(indices)
|
,mIndices(indices)
|
||||||
|
|||||||
@ -1,23 +1,25 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include "zstd/parray.h"
|
||||||
#include "asset_render.h"
|
#include "asset_render.h"
|
||||||
#include "../wrapper/vertex.h"
|
#include "../wrapper/vertex.h"
|
||||||
namespace engineapi {
|
namespace engineapi {
|
||||||
|
using zstd::parray;
|
||||||
class Texture;
|
class Texture;
|
||||||
class Material;
|
class Material;
|
||||||
class Mesh : public Asset {
|
class Mesh : public Asset {
|
||||||
protected:
|
protected:
|
||||||
uint32_t VAO = 0;
|
uint32_t VAO = 0;
|
||||||
vector<Vertex> mVertices;
|
parray<Vertex> mVertices;
|
||||||
vector<uint32_t> mIndices;
|
vector<uint32_t> mIndices;
|
||||||
public:
|
public:
|
||||||
Mesh(string name, uint32_t flags, vector<Vertex>& vertices, vector<uint32_t>& indices);
|
Mesh(string name, uint32_t flags, parray<Vertex>& vertices, vector<uint32_t>& indices);
|
||||||
void BeginLoad()override;
|
void BeginLoad()override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
uint32_t& GetVAO() {
|
uint32_t& GetVAO() {
|
||||||
return VAO;
|
return VAO;
|
||||||
}
|
}
|
||||||
vector<Vertex>& GetVertices() {
|
parray<Vertex>& GetVertices() {
|
||||||
return mVertices;
|
return mVertices;
|
||||||
}
|
}
|
||||||
vector<uint32_t>& GetIndices() {
|
vector<uint32_t>& GetIndices() {
|
||||||
|
|||||||
@ -45,12 +45,15 @@ namespace engineapi {
|
|||||||
}
|
}
|
||||||
Mesh* Model::ProcessMesh(const aiMesh* mesh) {
|
Mesh* Model::ProcessMesh(const aiMesh* mesh) {
|
||||||
// data to fill
|
// data to fill
|
||||||
vector<Vertex> vertices;
|
parray<Vertex> vertices(mesh->mNumVertices, sizeof(BoneVertex));
|
||||||
|
parray<Vertex> vertices2(mesh->mNumVertices, sizeof(BoneVertex));
|
||||||
|
BoneVertex vertex2;
|
||||||
|
vertices2.push_back(vertex2);
|
||||||
vector<uint32_t> indices;
|
vector<uint32_t> indices;
|
||||||
// Walk through each of the mesh's vertices
|
// Walk through each of the mesh's vertices
|
||||||
for (unsigned int i = 0; i < mesh->mNumVertices; i++)
|
for (unsigned int i = 0; i < mesh->mNumVertices; i++)
|
||||||
{
|
{
|
||||||
Vertex vertex;
|
BoneVertex vertex;
|
||||||
Vector3 vector; // we declare a placeholder vector since assimp uses its own vector class that doesn't directly convert to Vector3 class so we transfer the data to this placeholder Vector3 first.
|
Vector3 vector; // we declare a placeholder vector since assimp uses its own vector class that doesn't directly convert to Vector3 class so we transfer the data to this placeholder Vector3 first.
|
||||||
|
|
||||||
// positions
|
// positions
|
||||||
@ -92,7 +95,6 @@ namespace engineapi {
|
|||||||
{
|
{
|
||||||
vertex.Tangent = Vector3(0.0f, 0.0f, 0.0f);
|
vertex.Tangent = Vector3(0.0f, 0.0f, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
vertices.push_back(vertex);
|
vertices.push_back(vertex);
|
||||||
}
|
}
|
||||||
// now wak through each of the mesh's faces (a face is a mesh its triangle) and retrieve the corresponding vertex indices.
|
// now wak through each of the mesh's faces (a face is a mesh its triangle) and retrieve the corresponding vertex indices.
|
||||||
|
|||||||
@ -0,0 +1,8 @@
|
|||||||
|
#include "vertex.h"
|
||||||
|
|
||||||
|
namespace engineapi {
|
||||||
|
void BoneVertex::AddBoneData(uint32_t boneID, float weight)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -1,8 +1,31 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "math/vector3.h"
|
#include "math/vector3.h"
|
||||||
|
#include "math/vector2.h"
|
||||||
|
// 顶点最多关联4个骨骼
|
||||||
|
#define MAX_NUM_BONES_PER_VERTEX 4
|
||||||
|
|
||||||
namespace engineapi {
|
namespace engineapi {
|
||||||
struct VertexBase{
|
struct Vertex {
|
||||||
virtual Vector3& GetPosition() = 0;
|
//virtual Vector3& GetPosition() = 0;
|
||||||
|
};
|
||||||
|
struct PosVertex : public Vertex{
|
||||||
|
Vector3 Position = {};
|
||||||
|
};
|
||||||
|
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);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -67,7 +67,7 @@ namespace vulkanapi {
|
|||||||
meshBuffer->vertexCount = Vertices.size();
|
meshBuffer->vertexCount = Vertices.size();
|
||||||
|
|
||||||
// ----------------------------------------------- Vertex Buffer -----------------------------------------------
|
// ----------------------------------------------- Vertex Buffer -----------------------------------------------
|
||||||
VkDeviceSize vertexBufferSize = sizeof(Vertex) * Vertices.size();
|
VkDeviceSize vertexBufferSize = Vertices.data_size();
|
||||||
VmaAllocationCreateInfo vertexVmaStagingInfo = {};
|
VmaAllocationCreateInfo vertexVmaStagingInfo = {};
|
||||||
VmaAllocation vertexVmaStagingAlloc;
|
VmaAllocation vertexVmaStagingAlloc;
|
||||||
VkBuffer vertexStagingBuffer = Buffer::CreateStageBuffer(vertexVmaStagingInfo, vertexVmaStagingAlloc, vertexBufferSize);
|
VkBuffer vertexStagingBuffer = Buffer::CreateStageBuffer(vertexVmaStagingInfo, vertexVmaStagingAlloc, vertexBufferSize);
|
||||||
@ -173,27 +173,27 @@ namespace vulkanapi {
|
|||||||
attributeDescriptions[0].binding = 0;
|
attributeDescriptions[0].binding = 0;
|
||||||
attributeDescriptions[0].location = 0;
|
attributeDescriptions[0].location = 0;
|
||||||
attributeDescriptions[0].format = VK_FORMAT_R32G32B32_SFLOAT;
|
attributeDescriptions[0].format = VK_FORMAT_R32G32B32_SFLOAT;
|
||||||
attributeDescriptions[0].offset = offsetof(Vertex, Position);
|
attributeDescriptions[0].offset = offsetof(BoneVertex, Position);
|
||||||
attributeDescriptions[1].binding = 0;
|
attributeDescriptions[1].binding = 0;
|
||||||
attributeDescriptions[1].location = 1;
|
attributeDescriptions[1].location = 1;
|
||||||
attributeDescriptions[1].format = VK_FORMAT_R32G32_SFLOAT;
|
attributeDescriptions[1].format = VK_FORMAT_R32G32_SFLOAT;
|
||||||
attributeDescriptions[1].offset = offsetof(Vertex, TexCoords);
|
attributeDescriptions[1].offset = offsetof(BoneVertex, TexCoords);
|
||||||
attributeDescriptions[2].binding = 0;
|
attributeDescriptions[2].binding = 0;
|
||||||
attributeDescriptions[2].location = 2;
|
attributeDescriptions[2].location = 2;
|
||||||
attributeDescriptions[2].format = VK_FORMAT_R32G32B32_SFLOAT;
|
attributeDescriptions[2].format = VK_FORMAT_R32G32B32_SFLOAT;
|
||||||
attributeDescriptions[2].offset = offsetof(Vertex, Normal);
|
attributeDescriptions[2].offset = offsetof(BoneVertex, Normal);
|
||||||
attributeDescriptions[3].binding = 0;
|
attributeDescriptions[3].binding = 0;
|
||||||
attributeDescriptions[3].location = 3;
|
attributeDescriptions[3].location = 3;
|
||||||
attributeDescriptions[3].format = VK_FORMAT_R32G32B32_SFLOAT;
|
attributeDescriptions[3].format = VK_FORMAT_R32G32B32_SFLOAT;
|
||||||
attributeDescriptions[3].offset = offsetof(Vertex, Tangent);
|
attributeDescriptions[3].offset = offsetof(BoneVertex, Tangent);
|
||||||
attributeDescriptions[4].binding = 0;
|
attributeDescriptions[4].binding = 0;
|
||||||
attributeDescriptions[4].location = 4;
|
attributeDescriptions[4].location = 4;
|
||||||
attributeDescriptions[4].format = VK_FORMAT_R32G32B32A32_SFLOAT;
|
attributeDescriptions[4].format = VK_FORMAT_R32G32B32A32_SFLOAT;
|
||||||
attributeDescriptions[4].offset = offsetof(Vertex, Weights);
|
attributeDescriptions[4].offset = offsetof(BoneVertex, Weights);
|
||||||
attributeDescriptions[5].binding = 0;
|
attributeDescriptions[5].binding = 0;
|
||||||
attributeDescriptions[5].location = 5;
|
attributeDescriptions[5].location = 5;
|
||||||
attributeDescriptions[5].format = VK_FORMAT_R32G32B32A32_UINT;
|
attributeDescriptions[5].format = VK_FORMAT_R32G32B32A32_UINT;
|
||||||
attributeDescriptions[5].offset = offsetof(Vertex, BoneIDs);
|
attributeDescriptions[5].offset = offsetof(BoneVertex, BoneIDs);
|
||||||
VkPipelineVertexInputStateCreateInfo vertexInputInfo = {};
|
VkPipelineVertexInputStateCreateInfo vertexInputInfo = {};
|
||||||
vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
|
vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
|
||||||
vertexInputInfo.pVertexBindingDescriptions = &bindingDescription;
|
vertexInputInfo.pVertexBindingDescriptions = &bindingDescription;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user