support opengl asset
This commit is contained in:
		
							parent
							
								
									a00d3bba06
								
							
						
					
					
						commit
						c250a3cb4e
					
				@ -1,22 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
#pragma once
 | 
					 | 
				
			||||||
//#include "meta/variant.inl"
 | 
					 | 
				
			||||||
//#include "meta/tuple.inl"
 | 
					 | 
				
			||||||
//#include "meta/comparable.inl"
 | 
					 | 
				
			||||||
//#include "meta/hash.h"
 | 
					 | 
				
			||||||
//#include "zstd/span.h"
 | 
					 | 
				
			||||||
//#include "zstd/table.h"
 | 
					 | 
				
			||||||
//#include <vector>
 | 
					 | 
				
			||||||
//#include <optional>
 | 
					 | 
				
			||||||
namespace engineapi {
 | 
					 | 
				
			||||||
	using namespace meta;
 | 
					 | 
				
			||||||
	using zstd::span;
 | 
					 | 
				
			||||||
	using std::vector;
 | 
					 | 
				
			||||||
	using std::array;
 | 
					 | 
				
			||||||
	using zstd::table;
 | 
					 | 
				
			||||||
	using zstd::hash_table;
 | 
					 | 
				
			||||||
	template<typename T>
 | 
					 | 
				
			||||||
	using opt = std::optional<T>;
 | 
					 | 
				
			||||||
	template<bool val>
 | 
					 | 
				
			||||||
	using sfinae = std::enable_if_t<val>;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -2,24 +2,34 @@
 | 
				
			|||||||
#include "file_manager.h"
 | 
					#include "file_manager.h"
 | 
				
			||||||
#include "yaml/yaml.h"
 | 
					#include "yaml/yaml.h"
 | 
				
			||||||
#include <fstream>
 | 
					#include <fstream>
 | 
				
			||||||
 | 
					#include "file_handle.h"
 | 
				
			||||||
namespace engineapi {
 | 
					namespace engineapi {
 | 
				
			||||||
 | 
						constexpr string asset_token = "#__asset__\n";
 | 
				
			||||||
	void AssetLoader::Init() {
 | 
						void AssetLoader::Init() {
 | 
				
			||||||
		ResourceManager::GetSingleton().RegisterLoader<AssetLoader>(".asset");
 | 
							ResourceManager::GetSingleton().RegisterLoader<AssetLoader>(".asset");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	ResourceBundle AssetLoader::LoadFile(PackagePath handle, const MetaBundle& meta)
 | 
						ResourceBundle AssetLoader::LoadFile(PackagePath path, const MetaBundle& meta)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							FileHandle handle(path);
 | 
				
			||||||
 | 
							if (!handle.Open(FILE_OP::READ, mFileFlag & FileFlag::File_Binary)) {
 | 
				
			||||||
 | 
								return {};
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							string text1 = handle.ReadUntil(asset_token);
 | 
				
			||||||
 | 
							string text2 = handle.ReadUntil(asset_token);
 | 
				
			||||||
 | 
							string text3 = handle.ReadUntil(asset_token);
 | 
				
			||||||
		return ResourceBundle();
 | 
							return ResourceBundle();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	void AssetLoader::SaveFile(PackagePath handle, const ResourceBundle& bundle)
 | 
						void AssetLoader::SaveFile(PackagePath path, const ResourceBundle& bundle)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		YAML::Node result;
 | 
							FileHandle handle(path);
 | 
				
			||||||
 | 
							handle.Open(FILE_OP::WRITE, mFileFlag & FileFlag::File_Binary);
 | 
				
			||||||
		for (auto& elem : bundle.GetAll<Asset>()) {
 | 
							for (auto& elem : bundle.GetAll<Asset>()) {
 | 
				
			||||||
			RscHandle<Asset> handle = elem.AsHandle<Asset>();
 | 
								RscHandle<Asset> asset = elem.AsHandle<Asset>();
 | 
				
			||||||
			YAML::Node meta;
 | 
								string name = string(asset->meta->name) + "=" + asset->GetGuid().ToString();
 | 
				
			||||||
			meta["name"] = string(handle->meta->name);
 | 
								handle.WriteLine(name);
 | 
				
			||||||
			meta["data"] = YAML::Text_Serialize(refl::Any{handle.res, handle->meta});
 | 
								string text = YAML::Text_Serialize(refl::Any{ asset.res, asset->meta});
 | 
				
			||||||
			result.push_back(meta);
 | 
								handle.WriteLine(text);
 | 
				
			||||||
 | 
								handle.WriteLine(asset_token);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		//FileManager::SaveTextFile(handle, YAML::Dump(result));
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,7 @@ namespace engineapi {
 | 
				
			|||||||
	class AssetLoader :public IFileLoader{
 | 
						class AssetLoader :public IFileLoader{
 | 
				
			||||||
	public:
 | 
						public:
 | 
				
			||||||
		static void Init();
 | 
							static void Init();
 | 
				
			||||||
		ResourceBundle LoadFile(PackagePath handle, const MetaBundle& meta) override;
 | 
							ResourceBundle LoadFile(PackagePath path, const MetaBundle& meta) override;
 | 
				
			||||||
		void SaveFile(PackagePath handle, const ResourceBundle& bundle) override;
 | 
							void SaveFile(PackagePath path, const ResourceBundle& bundle) override;
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1,6 +1,7 @@
 | 
				
			|||||||
#include "file_handle.h"
 | 
					#include "file_handle.h"
 | 
				
			||||||
#include <algorithm>
 | 
					#include <algorithm>
 | 
				
			||||||
#define READ_DATA_SIZE 1024
 | 
					#define READ_DATA_SIZE 100
 | 
				
			||||||
 | 
					#define TOKEN_SIZE 100
 | 
				
			||||||
namespace engineapi {
 | 
					namespace engineapi {
 | 
				
			||||||
	FileHandle& FileHandle::Open(FILE_OP _op, bool is_binarry)
 | 
						FileHandle& FileHandle::Open(FILE_OP _op, bool is_binarry)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -10,10 +11,13 @@ namespace engineapi {
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
		case engineapi::FILE_OP::READ:
 | 
							case engineapi::FILE_OP::READ:
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			vfile = std::ifstream(file_path, is_binarry ? std::ios::binary : 0);
 | 
								vfile = std::ifstream(file_path, is_binarry ? std::ios::binary | std::ios::ate : std::ios::ate);
 | 
				
			||||||
			if (!Reader().is_open()) {
 | 
								auto& fi = Reader();
 | 
				
			||||||
 | 
								if (!fi.is_open()) {
 | 
				
			||||||
				return *this;
 | 
									return *this;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								size = fi.tellg();
 | 
				
			||||||
 | 
								fi.seekg(0);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		case engineapi::FILE_OP::WRITE:
 | 
							case engineapi::FILE_OP::WRITE:
 | 
				
			||||||
@ -37,54 +41,36 @@ namespace engineapi {
 | 
				
			|||||||
		fi.read((char*)data, size);
 | 
							fi.read((char*)data, size);
 | 
				
			||||||
		return fi.gcount();
 | 
							return fi.gcount();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	string FileHandle::ReadUntil(const string& token)
 | 
						bool FileHandle::FindNext(const char* begin, const char* end, size_t& stop)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		auto& fi = Reader();
 | 
							auto& fi = Reader();
 | 
				
			||||||
		size_t cur = fi.tellg();
 | 
							size_t start = fi.tellg();
 | 
				
			||||||
		fi.seekg(0, std::ios::end);
 | 
							size_t cur = start;
 | 
				
			||||||
		size_t size = (size_t)fi.tellg() - cur;
 | 
							char chunk[READ_DATA_SIZE + TOKEN_SIZE];
 | 
				
			||||||
		fi.seekg(cur);
 | 
							const char* last = chunk + READ_DATA_SIZE + TOKEN_SIZE;
 | 
				
			||||||
		size_t buffer_size = READ_DATA_SIZE;
 | 
							while (cur < stop) {
 | 
				
			||||||
		string buffer;
 | 
								fi.read(chunk + TOKEN_SIZE, READ_DATA_SIZE);
 | 
				
			||||||
		char chunk[READ_DATA_SIZE];
 | 
								size_t count = fi.gcount();
 | 
				
			||||||
		while (buffer_size < size) {
 | 
								if (count < READ_DATA_SIZE || cur + count > stop) {
 | 
				
			||||||
			fi.read(chunk, READ_DATA_SIZE);
 | 
									fi.clear();
 | 
				
			||||||
			buffer.append(chunk, READ_DATA_SIZE);
 | 
					 | 
				
			||||||
			size_t offset = buffer_size > READ_DATA_SIZE ? buffer_size - READ_DATA_SIZE - token.size() : 0;
 | 
					 | 
				
			||||||
			size_t it = buffer.substr(offset).find(token);
 | 
					 | 
				
			||||||
			if (it != std::string::npos) {
 | 
					 | 
				
			||||||
				buffer_size = offset + it;
 | 
					 | 
				
			||||||
				buffer.resize(buffer_size);
 | 
					 | 
				
			||||||
				fi.seekg(cur + buffer_size + token.size());
 | 
					 | 
				
			||||||
				return buffer;
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			buffer_size += READ_DATA_SIZE;
 | 
								const char* first = cur == start ? chunk + TOKEN_SIZE : chunk;
 | 
				
			||||||
		}
 | 
								const char* it = std::search(first, last, begin, end);
 | 
				
			||||||
		return buffer;
 | 
								if (it != last) {
 | 
				
			||||||
	}
 | 
									fi.seekg(start);
 | 
				
			||||||
	vector<char> FileHandle::ReadUntil(const vector<char>& token)
 | 
									stop = cur + (it - first) - TOKEN_SIZE;
 | 
				
			||||||
	{
 | 
									return true;
 | 
				
			||||||
		auto& fi = Reader();
 | 
					 | 
				
			||||||
		size_t cur = fi.tellg();
 | 
					 | 
				
			||||||
		fi.seekg(0, std::ios::end);
 | 
					 | 
				
			||||||
		size_t size = (size_t)fi.tellg() - cur;
 | 
					 | 
				
			||||||
		fi.seekg(cur);
 | 
					 | 
				
			||||||
		size_t buffer_size = READ_DATA_SIZE;
 | 
					 | 
				
			||||||
		vector<char> buffer(buffer_size);
 | 
					 | 
				
			||||||
		while (buffer_size < size) {
 | 
					 | 
				
			||||||
			fi.read(buffer.data(), READ_DATA_SIZE);
 | 
					 | 
				
			||||||
			size_t offset = buffer_size > READ_DATA_SIZE ? buffer_size - READ_DATA_SIZE - token.size() : 0;
 | 
					 | 
				
			||||||
			auto it = std::search(buffer.begin() + offset, buffer.end(), token.begin(), token.end());
 | 
					 | 
				
			||||||
			if (it != buffer.end()) {
 | 
					 | 
				
			||||||
				buffer_size += it - buffer.end();
 | 
					 | 
				
			||||||
				buffer.resize(buffer_size);
 | 
					 | 
				
			||||||
				fi.seekg(cur + buffer_size + token.size());
 | 
					 | 
				
			||||||
				return buffer;
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			buffer_size += READ_DATA_SIZE;
 | 
								if (count < READ_DATA_SIZE) {
 | 
				
			||||||
			buffer.insert(buffer.end(), READ_DATA_SIZE, 0);
 | 
									fi.seekg(start);
 | 
				
			||||||
 | 
									stop = cur + count;
 | 
				
			||||||
 | 
									return false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								cur += count;
 | 
				
			||||||
 | 
								memcpy(chunk, chunk + READ_DATA_SIZE, TOKEN_SIZE);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return buffer;
 | 
							fi.seekg(start);
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	void FileHandle::Write(const char* data,size_t size)
 | 
						void FileHandle::Write(const char* data,size_t size)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
				
			|||||||
@ -15,6 +15,7 @@ namespace engineapi {
 | 
				
			|||||||
	protected:
 | 
						protected:
 | 
				
			||||||
		uint32_t flag{0};
 | 
							uint32_t flag{0};
 | 
				
			||||||
		FILE_OP op{ FILE_OP::NONE};
 | 
							FILE_OP op{ FILE_OP::NONE};
 | 
				
			||||||
 | 
							size_t size{0};
 | 
				
			||||||
		std::variant<std::ifstream, std::ofstream, nullptr_t> vfile{nullptr};
 | 
							std::variant<std::ifstream, std::ofstream, nullptr_t> vfile{nullptr};
 | 
				
			||||||
	public:
 | 
						public:
 | 
				
			||||||
		using PackagePath::PackagePath;
 | 
							using PackagePath::PackagePath;
 | 
				
			||||||
@ -40,26 +41,27 @@ namespace engineapi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		template<typename T = vector<char>>
 | 
							template<typename T = vector<char>>
 | 
				
			||||||
		T ReadLeft();
 | 
							T ReadLeft();
 | 
				
			||||||
		string ReadUntil(const string& token);
 | 
							bool FindNext(const char* begin, const char* end, size_t& stop);
 | 
				
			||||||
		vector<char> ReadUntil(const vector<char>& token);
 | 
							template<typename T>
 | 
				
			||||||
 | 
							T ReadUntil(const T& token);
 | 
				
			||||||
		void Write(const char* data, size_t size);
 | 
							void Write(const char* data, size_t size);
 | 
				
			||||||
	};
 | 
							template<typename T = string>
 | 
				
			||||||
	template<typename T>
 | 
							void Write(const T& data) {
 | 
				
			||||||
	inline T FileHandle::ReadLeft()
 | 
								Write(data.data(), data.size());
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		auto& fi = Reader();
 | 
					 | 
				
			||||||
		size_t cur = fi.tellg();
 | 
					 | 
				
			||||||
		fi.seekg(0, std::ios::end);
 | 
					 | 
				
			||||||
		size_t size = (size_t)fi.tellg() - cur;
 | 
					 | 
				
			||||||
		fi.seekg(cur);
 | 
					 | 
				
			||||||
		T data;
 | 
					 | 
				
			||||||
		data.resize(size, '\0');
 | 
					 | 
				
			||||||
		fi.read(data.data(), size);
 | 
					 | 
				
			||||||
		// 检查实际读取的字节数
 | 
					 | 
				
			||||||
		size_t read = (size_t)fi.gcount();
 | 
					 | 
				
			||||||
		if (read != size) {
 | 
					 | 
				
			||||||
			data.resize(read);
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return data;
 | 
							template<typename T = string>
 | 
				
			||||||
	}
 | 
							void WriteLine(const T& data) {
 | 
				
			||||||
 | 
								Write<T>(data);
 | 
				
			||||||
 | 
								Write<T>(T{ "\n" });
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						class FileSpan {
 | 
				
			||||||
 | 
							size_t start{ 0 }, stop{ 0 };
 | 
				
			||||||
 | 
							FileHandle& handle;
 | 
				
			||||||
 | 
						public:
 | 
				
			||||||
 | 
							FileSpan(FileHandle& handle, size_t start, size_t stop = 0)
 | 
				
			||||||
 | 
								: handle(handle), start(start), stop(stop){}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					#include "file_handle.inl"
 | 
				
			||||||
@ -87,7 +87,7 @@ namespace engineapi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		else {
 | 
							else {
 | 
				
			||||||
			string text = YAML::Text_Serialize(bundle);
 | 
								string text = YAML::Text_Serialize(bundle);
 | 
				
			||||||
			handle.Write(text.data(), text.size());
 | 
								handle.Write(text);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	void ResourceManager::SaveDirtyFiles()
 | 
						void ResourceManager::SaveDirtyFiles()
 | 
				
			||||||
@ -106,6 +106,11 @@ namespace engineapi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		mDirtyBlocks.clear();
 | 
							mDirtyBlocks.clear();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						void ResourceManager::SaveFile(PackagePath path, const ResourceBundle& bundle)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							auto loader = GetLoader(path.GetExtension());
 | 
				
			||||||
 | 
							loader->SaveFile(path, bundle);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	constexpr const char* FileFlagName = "/engine/assets/file_flag.meta";
 | 
						constexpr const char* FileFlagName = "/engine/assets/file_flag.meta";
 | 
				
			||||||
	void ResourceManager::LoadFileFlag()
 | 
						void ResourceManager::LoadFileFlag()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -131,7 +136,7 @@ namespace engineapi {
 | 
				
			|||||||
		FileHandle handle(FileFlagName);
 | 
							FileHandle handle(FileFlagName);
 | 
				
			||||||
		handle.Open(FILE_OP::WRITE);
 | 
							handle.Open(FILE_OP::WRITE);
 | 
				
			||||||
		string text = YAML::Text_Serialize(res);
 | 
							string text = YAML::Text_Serialize(res);
 | 
				
			||||||
		handle.Write(text.data(), text.size());
 | 
							handle.Write(text);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -70,7 +70,7 @@ namespace engineapi {
 | 
				
			|||||||
        MetaBundle GetVisitMeta(const ResourceBundle& bundle);
 | 
					        MetaBundle GetVisitMeta(const ResourceBundle& bundle);
 | 
				
			||||||
        void SaveMeta(PackagePath path, const MetaBundle& bundle);
 | 
					        void SaveMeta(PackagePath path, const MetaBundle& bundle);
 | 
				
			||||||
        void SaveDirtyFiles();
 | 
					        void SaveDirtyFiles();
 | 
				
			||||||
 | 
					        void SaveFile(PackagePath path, const ResourceBundle& bundle);
 | 
				
			||||||
        void LoadFileFlag();
 | 
					        void LoadFileFlag();
 | 
				
			||||||
        void SaveFileFlag();
 | 
					        void SaveFileFlag();
 | 
				
			||||||
        uint32_t GetFileFlag(const Name& name);
 | 
					        uint32_t GetFileFlag(const Name& name);
 | 
				
			||||||
 | 
				
			|||||||
@ -10,4 +10,13 @@ namespace engineapi {
 | 
				
			|||||||
	{
 | 
						{
 | 
				
			||||||
		mPtr.BeginLoad();
 | 
							mPtr.BeginLoad();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void StaticMesh::SetMaterial(RscHandle<Material> material)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							auto meshes = mPtr.GetMeshs();
 | 
				
			||||||
 | 
							for (auto it : meshes) {
 | 
				
			||||||
 | 
								it->SetMaterial(material);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -9,10 +9,10 @@ namespace engineapi {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	public:
 | 
						public:
 | 
				
			||||||
		StaticMesh(Model& model);
 | 
							StaticMesh(Model& model);
 | 
				
			||||||
 | 
					 | 
				
			||||||
		void LoadMesh();
 | 
					 | 
				
			||||||
		Model& Ptr() {
 | 
							Model& Ptr() {
 | 
				
			||||||
			return mPtr;
 | 
								return mPtr;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							void LoadMesh();
 | 
				
			||||||
 | 
							void SetMaterial(RscHandle<Material> material);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -6,6 +6,7 @@
 | 
				
			|||||||
#include "data/property/actor_property.h"
 | 
					#include "data/property/actor_property.h"
 | 
				
			||||||
#include "asset/resource_manager.h"
 | 
					#include "asset/resource_manager.h"
 | 
				
			||||||
#include "asset/file_manager.h"
 | 
					#include "asset/file_manager.h"
 | 
				
			||||||
 | 
					#include "asset/asset_loader.h"
 | 
				
			||||||
namespace engineapi {
 | 
					namespace engineapi {
 | 
				
			||||||
	Scene::Scene()
 | 
						Scene::Scene()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -16,7 +17,14 @@ namespace engineapi {
 | 
				
			|||||||
		shader->mVert = ResourceManager::GetSingleton().Load<ShaderProgram>("/engine/assets/shader/simple.vert");
 | 
							shader->mVert = ResourceManager::GetSingleton().Load<ShaderProgram>("/engine/assets/shader/simple.vert");
 | 
				
			||||||
		shader->mFrag = ResourceManager::GetSingleton().Load<ShaderProgram>("/engine/assets/shader/simple.frag");
 | 
							shader->mFrag = ResourceManager::GetSingleton().Load<ShaderProgram>("/engine/assets/shader/simple.frag");
 | 
				
			||||||
		RenderAPI::GetSingleton().LoadShader(*shader);
 | 
							RenderAPI::GetSingleton().LoadShader(*shader);
 | 
				
			||||||
		//Material* material = new Material("/engine/assets/shader/simple.shader", flags);
 | 
							auto material = ResourceManager::GetSingleton().LoaderEmplaceResource<Material>();
 | 
				
			||||||
 | 
							material->mShader = shader;
 | 
				
			||||||
 | 
							ResourceBundle bundle;
 | 
				
			||||||
 | 
							bundle.Add(shader);
 | 
				
			||||||
 | 
							bundle.Add(material);
 | 
				
			||||||
 | 
							const char* path = "/engine/assets/asset/mesh1.asset";
 | 
				
			||||||
 | 
							ResourceManager::GetSingleton().SaveFile(path, bundle);
 | 
				
			||||||
 | 
							auto bundle2 = ResourceManager::GetSingleton().Load(path);
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			ActorProperty property;
 | 
								ActorProperty property;
 | 
				
			||||||
			property.id = 1;
 | 
								property.id = 1;
 | 
				
			||||||
@ -24,7 +32,7 @@ namespace engineapi {
 | 
				
			|||||||
			property.path = "/engine/assets/models/cube.obj";
 | 
								property.path = "/engine/assets/models/cube.obj";
 | 
				
			||||||
			actor1 = ActorMesh::New(property);
 | 
								actor1 = ActorMesh::New(property);
 | 
				
			||||||
			actor1->LoadMesh();
 | 
								actor1->LoadMesh();
 | 
				
			||||||
			//actor1->Ptr().SetMaterial(material);
 | 
								actor1->SetMaterial(material);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			ActorProperty property;
 | 
								ActorProperty property;
 | 
				
			||||||
@ -44,10 +52,10 @@ namespace engineapi {
 | 
				
			|||||||
	void Scene::Render()
 | 
						void Scene::Render()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		RenderAPI::GetSingletonPtr()->Render(*mCamera);
 | 
							RenderAPI::GetSingletonPtr()->Render(*mCamera);
 | 
				
			||||||
		//auto meshs = actor1->Ptr().GetMeshs();
 | 
							auto& meshs = actor1->Ptr().GetMeshs();
 | 
				
			||||||
		//for (auto it : meshs) {
 | 
							for (auto it : meshs) {
 | 
				
			||||||
			//RenderAPI::GetSingletonPtr()->DrawStaticMesh(*it);
 | 
								RenderAPI::GetSingletonPtr()->DrawStaticMesh(*it);
 | 
				
			||||||
		//}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	void Scene::AddGameObject(GameObject* gameObject)
 | 
						void Scene::AddGameObject(GameObject* gameObject)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,7 @@
 | 
				
			|||||||
#include "opengl_glsl_loader.h"
 | 
					#include "opengl_glsl_loader.h"
 | 
				
			||||||
#include "asset/file_handle.h"
 | 
					#include "asset/file_handle.h"
 | 
				
			||||||
 | 
					#include "render/tool/glsl_to_spirv.h"
 | 
				
			||||||
 | 
					#include <GL/glew.h>
 | 
				
			||||||
using namespace engineapi;
 | 
					using namespace engineapi;
 | 
				
			||||||
namespace openglapi {
 | 
					namespace openglapi {
 | 
				
			||||||
	void OpenGLGlslLoader::Init()
 | 
						void OpenGLGlslLoader::Init()
 | 
				
			||||||
@ -9,8 +11,53 @@ namespace openglapi {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	ResourceBundle OpenGLGlslLoader::LoadFile(PackagePath path, const MetaBundle& meta)
 | 
						ResourceBundle OpenGLGlslLoader::LoadFile(PackagePath path, const MetaBundle& meta)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							auto m = meta.FetchMeta<ShaderProgram>();
 | 
				
			||||||
		return {};
 | 
							auto program = m ? ResourceManager::GetSingleton().LoaderEmplaceResource<glShaderProgram>(m->guid)
 | 
				
			||||||
 | 
								: ResourceManager::GetSingleton().LoaderEmplaceResource<glShaderProgram>();
 | 
				
			||||||
 | 
							FileHandle handle(path);
 | 
				
			||||||
 | 
							shaderc_shader_kind shader_kind = GlslToSpirv::GetShaderKind(path.GetExtension());
 | 
				
			||||||
 | 
							if (!handle.Open(FILE_OP::READ, mFileFlag & FileFlag::File_Binary)) {
 | 
				
			||||||
 | 
								return program;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (mFileFlag & FileFlag::File_Binary) {
 | 
				
			||||||
 | 
								vector<char> data = handle.ReadAll();
 | 
				
			||||||
 | 
								std::vector<unsigned int> spirv(data.size() / 4);
 | 
				
			||||||
 | 
								std::memcpy(spirv.data(), data.data(), data.size());
 | 
				
			||||||
 | 
								program->Load(shader_kind, spirv);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								string glsl = handle.ReadAll<string>();
 | 
				
			||||||
 | 
								auto spirv = GlslToSpirv::ToSpirv(glsl, shader_kind, path.GetFileName());
 | 
				
			||||||
 | 
								if (spirv) {
 | 
				
			||||||
 | 
									program->Load(shader_kind, *spirv);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return program;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						void glShaderProgram::Load(int _type, const std::vector<uint32_t>& spirv)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							shaderc_shader_kind type = (shaderc_shader_kind)_type;
 | 
				
			||||||
 | 
							switch (type)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							case shaderc_shader_kind::shaderc_vertex_shader:
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
 | 
				
			||||||
 | 
								glShaderBinary(1, &vertexShader, GL_SHADER_BINARY_FORMAT_SPIR_V_ARB, spirv.data(), spirv.size() * sizeof(uint32_t));
 | 
				
			||||||
 | 
								glSpecializeShaderARB(vertexShader, "main", 0, nullptr, nullptr);
 | 
				
			||||||
 | 
								mPtr = vertexShader;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							case shaderc_shader_kind::shaderc_fragment_shader:
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
 | 
				
			||||||
 | 
								glShaderBinary(1, &fragmentShader, GL_SHADER_BINARY_FORMAT_SPIR_V_ARB, spirv.data(), spirv.size() * sizeof(uint32_t));
 | 
				
			||||||
 | 
								glSpecializeShaderARB(fragmentShader, "main", 0, nullptr, nullptr);
 | 
				
			||||||
 | 
								mPtr = fragmentShader;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,15 @@
 | 
				
			|||||||
#include "asset/resource_manager.h"
 | 
					#include "asset/resource_manager.h"
 | 
				
			||||||
namespace openglapi {
 | 
					namespace openglapi {
 | 
				
			||||||
	using engineapi::table;
 | 
						using engineapi::table;
 | 
				
			||||||
 | 
						class glShaderProgram : public engineapi::ShaderProgram {
 | 
				
			||||||
 | 
						private:
 | 
				
			||||||
 | 
							uint32_t mPtr{0};
 | 
				
			||||||
 | 
						public:
 | 
				
			||||||
 | 
							uint32_t Ptr() {
 | 
				
			||||||
 | 
								return mPtr;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							void Load(int type, const std::vector<uint32_t>& spirv);
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
	class OpenGLGlslLoader : public engineapi::IFileLoader
 | 
						class OpenGLGlslLoader : public engineapi::IFileLoader
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		inline static table<engineapi::Guid, void*> ShaderTable;
 | 
							inline static table<engineapi::Guid, void*> ShaderTable;
 | 
				
			||||||
 | 
				
			|||||||
@ -43,13 +43,6 @@ namespace openglapi {
 | 
				
			|||||||
	void RenderOpenGLApi::BeginFrame()
 | 
						void RenderOpenGLApi::BeginFrame()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		glClear(GL_COLOR_BUFFER_BIT);
 | 
							glClear(GL_COLOR_BUFFER_BIT);
 | 
				
			||||||
		glBegin(GL_TRIANGLES);
 | 
					 | 
				
			||||||
		glColor3f(1.0f, 0.0f, 0.0f);
 | 
					 | 
				
			||||||
		glVertex2f(-0.5f, -0.5f);
 | 
					 | 
				
			||||||
		glColor3f(0.0f, 1.0f, 0.0f);
 | 
					 | 
				
			||||||
		glVertex2f(0.5f, -0.5f);
 | 
					 | 
				
			||||||
		glColor3f(0.0f, 0.0f, 1.0f);
 | 
					 | 
				
			||||||
		glVertex2f(0.0f, 0.5f);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	void RenderOpenGLApi::EndFrame()
 | 
						void RenderOpenGLApi::EndFrame()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -95,12 +88,26 @@ namespace openglapi {
 | 
				
			|||||||
		glBindBuffer(GL_ARRAY_BUFFER, 0);
 | 
							glBindBuffer(GL_ARRAY_BUFFER, 0);
 | 
				
			||||||
		// 解绑VAO
 | 
							// 解绑VAO
 | 
				
			||||||
		glBindVertexArray(0);
 | 
							glBindVertexArray(0);
 | 
				
			||||||
		VAOTable[mesh.GetGuid()] = VAO;
 | 
							VAOTable[mesh.GetGuid()] = OpenGLPtr{ VAO };
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	void RenderOpenGLApi::DrawStaticMesh(Mesh& mesh)
 | 
						void RenderOpenGLApi::DrawStaticMesh(Mesh& mesh)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							OpenGLPtr& shaderPtr = ShaderTable[mesh.GetShaderGuid()];
 | 
				
			||||||
 | 
							glUseProgram(shaderPtr);
 | 
				
			||||||
 | 
							OpenGLPtr& meshPtr = VAOTable[mesh.GetGuid()];
 | 
				
			||||||
 | 
							glBindVertexArray(meshPtr);
 | 
				
			||||||
 | 
							glDrawElements(GL_TRIANGLES, mesh.GetIndices().size(), GL_UNSIGNED_INT, 0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	void RenderOpenGLApi::LoadShader(Shader& shader)
 | 
						void RenderOpenGLApi::LoadShader(Shader& shader)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							auto vertModule = shader.GetVertHandle<glShaderProgram>()->Ptr();
 | 
				
			||||||
 | 
							auto fragModule = shader.GetFragHandle<glShaderProgram>()->Ptr();
 | 
				
			||||||
 | 
							GLuint shaderProgram = glCreateProgram();
 | 
				
			||||||
 | 
							glAttachShader(shaderProgram, vertModule);
 | 
				
			||||||
 | 
							glAttachShader(shaderProgram, fragModule);
 | 
				
			||||||
 | 
							glLinkProgram(shaderProgram);
 | 
				
			||||||
 | 
							glDeleteProgram(vertModule);
 | 
				
			||||||
 | 
							glDeleteProgram(fragModule);
 | 
				
			||||||
 | 
							ShaderTable[shader.GetGuid()] = OpenGLPtr{ shaderProgram };
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -9,14 +9,13 @@ namespace openglapi {
 | 
				
			|||||||
	using engineapi::Guid;
 | 
						using engineapi::Guid;
 | 
				
			||||||
	using zstd::hash_table;
 | 
						using zstd::hash_table;
 | 
				
			||||||
	class OpenGLWindow;
 | 
						class OpenGLWindow;
 | 
				
			||||||
	struct OpenGLVAO {
 | 
						using OpenGLPtr = uint32_t;
 | 
				
			||||||
		int VAO;
 | 
					 | 
				
			||||||
	};
 | 
					 | 
				
			||||||
	class RenderOpenGLApi : public engineapi::RenderAPI {
 | 
						class RenderOpenGLApi : public engineapi::RenderAPI {
 | 
				
			||||||
	public:
 | 
						public:
 | 
				
			||||||
		RenderContext context;
 | 
							RenderContext context;
 | 
				
			||||||
		OpenGLWindow* window;
 | 
							OpenGLWindow* window;
 | 
				
			||||||
		hash_table<Guid, OpenGLVAO> VAOTable;
 | 
							hash_table<Guid, OpenGLPtr> VAOTable;
 | 
				
			||||||
 | 
							hash_table<Guid, OpenGLPtr> ShaderTable;
 | 
				
			||||||
	public:
 | 
						public:
 | 
				
			||||||
		RenderContext* GetContext() override {
 | 
							RenderContext* GetContext() override {
 | 
				
			||||||
			return &context;
 | 
								return &context;
 | 
				
			||||||
 | 
				
			|||||||
@ -7,6 +7,7 @@ namespace engineapi {
 | 
				
			|||||||
		REFL_FRIEND(Material)
 | 
							REFL_FRIEND(Material)
 | 
				
			||||||
		UPROPERTY()
 | 
							UPROPERTY()
 | 
				
			||||||
		RscHandle<Shader> mShader;
 | 
							RscHandle<Shader> mShader;
 | 
				
			||||||
 | 
							friend class Scene;
 | 
				
			||||||
	public:
 | 
						public:
 | 
				
			||||||
		Material();
 | 
							Material();
 | 
				
			||||||
		~Material();
 | 
							~Material();
 | 
				
			||||||
 | 
				
			|||||||
@ -21,6 +21,9 @@ namespace engineapi {
 | 
				
			|||||||
		Guid GetShaderGuid() {
 | 
							Guid GetShaderGuid() {
 | 
				
			||||||
			return mMaterial->GetShader().guid;
 | 
								return mMaterial->GetShader().guid;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							void SetMaterial(RscHandle<Material> material) {
 | 
				
			||||||
 | 
								mMaterial = material;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		RscHandle<Material> GetMaterial() {
 | 
							RscHandle<Material> GetMaterial() {
 | 
				
			||||||
			return mMaterial;
 | 
								return mMaterial;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,10 @@
 | 
				
			|||||||
#include "glsl_to_spirv.h"
 | 
					#include "glsl_to_spirv.h"
 | 
				
			||||||
#include <shaderc/shaderc.hpp>
 | 
					#include <shaderc/shaderc.hpp>
 | 
				
			||||||
 | 
					#include "meta/hash.h"
 | 
				
			||||||
 | 
					using meta::string_hash;
 | 
				
			||||||
namespace engineapi
 | 
					namespace engineapi
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	optional<vector<uint32_t>> GlslToSpirv::spirv(const string& glsl, shaderc_shader_kind kind, string_view code_id)
 | 
						optional<vector<uint32_t>> GlslToSpirv::ToSpirv(const string& glsl, shaderc_shader_kind kind, string_view code_id)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		optional<vector<uint32_t>> spirv_out;
 | 
							optional<vector<uint32_t>> spirv_out;
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
@ -17,5 +19,17 @@ namespace engineapi
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return spirv_out;
 | 
							return spirv_out;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						shaderc_shader_kind GlslToSpirv::GetShaderKind(string_view ext)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							switch (string_hash(ext))
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							case string_hash(".vert"): return shaderc_shader_kind::shaderc_vertex_shader;
 | 
				
			||||||
 | 
							case string_hash(".geom"): return shaderc_shader_kind::shaderc_geometry_shader;
 | 
				
			||||||
 | 
							case string_hash(".tese"): return shaderc_shader_kind::shaderc_tess_evaluation_shader;
 | 
				
			||||||
 | 
							case string_hash(".tesc"): return shaderc_shader_kind::shaderc_tess_control_shader;
 | 
				
			||||||
 | 
							case string_hash(".frag"): return shaderc_shader_kind::shaderc_fragment_shader;
 | 
				
			||||||
 | 
							default:                   return shaderc_shader_kind::shaderc_miss_shader;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -12,6 +12,7 @@ namespace engineapi
 | 
				
			|||||||
	class GlslToSpirv
 | 
						class GlslToSpirv
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	public:
 | 
						public:
 | 
				
			||||||
		static optional<vector<uint32_t>> spirv(const string& glsl, shaderc_shader_kind kind, string_view code_id = "unknown_shader");
 | 
							static shaderc_shader_kind GetShaderKind(string_view ext);
 | 
				
			||||||
 | 
							static optional<vector<uint32_t>> ToSpirv(const string& glsl, shaderc_shader_kind kind, string_view code_id = "unknown_shader");
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -4,38 +4,9 @@
 | 
				
			|||||||
#include "render/asset/vertex.h"
 | 
					#include "render/asset/vertex.h"
 | 
				
			||||||
#include "vkmeta_vertex_gen.inl"
 | 
					#include "vkmeta_vertex_gen.inl"
 | 
				
			||||||
#include "asset/file_handle.h"
 | 
					#include "asset/file_handle.h"
 | 
				
			||||||
#include "meta/hash.h"
 | 
					 | 
				
			||||||
#include <vulkan/vulkan.hpp>
 | 
					 | 
				
			||||||
using namespace engineapi;
 | 
					using namespace engineapi;
 | 
				
			||||||
namespace vulkanapi {
 | 
					namespace vulkanapi {
 | 
				
			||||||
	using std::string_view;
 | 
						using std::string_view;
 | 
				
			||||||
	using meta::string_hash;
 | 
					 | 
				
			||||||
	shaderc_shader_kind ConvertStageSC(vk::ShaderStageFlagBits stage)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		static hash_table< vk::ShaderStageFlagBits, shaderc_shader_kind> conv
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			{ vk::ShaderStageFlagBits::eVertex				  ,shaderc_shader_kind::shaderc_vertex_shader },
 | 
					 | 
				
			||||||
			{ vk::ShaderStageFlagBits::eFragment              ,shaderc_shader_kind::shaderc_fragment_shader },
 | 
					 | 
				
			||||||
			{ vk::ShaderStageFlagBits::eGeometry              ,shaderc_shader_kind::shaderc_geometry_shader },
 | 
					 | 
				
			||||||
			{ vk::ShaderStageFlagBits::eTessellationControl   ,shaderc_shader_kind::shaderc_tess_control_shader },
 | 
					 | 
				
			||||||
			{ vk::ShaderStageFlagBits::eTessellationEvaluation,shaderc_shader_kind::shaderc_tess_evaluation_shader },
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
		auto itr = conv.find(stage);
 | 
					 | 
				
			||||||
		return itr->second;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	vk::ShaderStageFlagBits GetShaderType(string_view ext)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		switch (string_hash(ext))
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
		case string_hash(".vert"): return vk::ShaderStageFlagBits::eVertex;
 | 
					 | 
				
			||||||
		case string_hash(".geom"): return vk::ShaderStageFlagBits::eGeometry;
 | 
					 | 
				
			||||||
		case string_hash(".tese"): return vk::ShaderStageFlagBits::eTessellationEvaluation;
 | 
					 | 
				
			||||||
		case string_hash(".tesc"): return vk::ShaderStageFlagBits::eTessellationControl;
 | 
					 | 
				
			||||||
		case string_hash(".frag"): return vk::ShaderStageFlagBits::eFragment;
 | 
					 | 
				
			||||||
		case string_hash(".comp"): return vk::ShaderStageFlagBits::eCompute;
 | 
					 | 
				
			||||||
		default:                   return vk::ShaderStageFlagBits::eAll;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	void VulkanGlslLoader::Init()
 | 
						void VulkanGlslLoader::Init()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		REGISTER_META_TABLE(PosVertex);
 | 
							REGISTER_META_TABLE(PosVertex);
 | 
				
			||||||
@ -50,7 +21,7 @@ namespace vulkanapi {
 | 
				
			|||||||
		auto m = meta.FetchMeta<ShaderProgram>();
 | 
							auto m = meta.FetchMeta<ShaderProgram>();
 | 
				
			||||||
		auto program = m ? ResourceManager::GetSingleton().LoaderEmplaceResource<vkShaderProgram>(m->guid)
 | 
							auto program = m ? ResourceManager::GetSingleton().LoaderEmplaceResource<vkShaderProgram>(m->guid)
 | 
				
			||||||
			: ResourceManager::GetSingleton().LoaderEmplaceResource<vkShaderProgram>();
 | 
								: ResourceManager::GetSingleton().LoaderEmplaceResource<vkShaderProgram>();
 | 
				
			||||||
		FileHandle handle(path + ".meta");
 | 
							FileHandle handle(path);
 | 
				
			||||||
		if (!handle.Open(FILE_OP::READ, mFileFlag & FileFlag::File_Binary)) {
 | 
							if (!handle.Open(FILE_OP::READ, mFileFlag & FileFlag::File_Binary)) {
 | 
				
			||||||
			return program;
 | 
								return program;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -63,8 +34,8 @@ namespace vulkanapi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		else {
 | 
							else {
 | 
				
			||||||
			string glsl = handle.ReadAll<string>();
 | 
								string glsl = handle.ReadAll<string>();
 | 
				
			||||||
			auto shader_enum = GetShaderType(path.GetExtension());
 | 
								auto shader_kind = GlslToSpirv::GetShaderKind(path.GetExtension());
 | 
				
			||||||
			auto spirv = GlslToSpirv::spirv(glsl, ConvertStageSC(shader_enum), path.GetFileName());
 | 
								auto spirv = GlslToSpirv::ToSpirv(glsl, shader_kind, path.GetFileName());
 | 
				
			||||||
			if (spirv) {
 | 
								if (spirv) {
 | 
				
			||||||
				program->Load(*spirv);
 | 
									program->Load(*spirv);
 | 
				
			||||||
				//LoadShaderInfo(program->GetGuid(), *spirv);
 | 
									//LoadShaderInfo(program->GetGuid(), *spirv);
 | 
				
			||||||
@ -72,7 +43,7 @@ namespace vulkanapi {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return program;
 | 
							return program;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	void vkShaderProgram::Load(const std::vector<unsigned int>& spirv)
 | 
						void vkShaderProgram::Load(const std::vector<uint32_t>& spirv)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		RenderVulkanAPI* renderApi = RenderVulkanAPI::GetSingletonPtr();
 | 
							RenderVulkanAPI* renderApi = RenderVulkanAPI::GetSingletonPtr();
 | 
				
			||||||
		mPtr = renderApi->backend.GetDevice().CreateShaderModule(spirv);
 | 
							mPtr = renderApi->backend.GetDevice().CreateShaderModule(spirv);
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@ namespace vulkanapi {
 | 
				
			|||||||
		VkShaderModule Ptr() {
 | 
							VkShaderModule Ptr() {
 | 
				
			||||||
			return mPtr;
 | 
								return mPtr;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		void Load(const std::vector<unsigned int>& spirv);
 | 
							void Load(const std::vector<uint32_t>& spirv);
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
	class VulkanGlslLoader : public engineapi::IFileLoader
 | 
						class VulkanGlslLoader : public engineapi::IFileLoader
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user