From 13aaa8cd631b9db5739748351461f0704cd92875 Mon Sep 17 00:00:00 2001 From: ouczbs Date: Sun, 24 Mar 2024 21:40:57 +0800 Subject: [PATCH] update shader --- engine/src/engine/asset/asset_manager.cpp | 18 ++++++++++++++++++ engine/src/engine/asset/asset_manager.h | 1 + engine/src/engine/object/scene/scene.cpp | 8 ++++++-- engine/src/engine/render/asset/material.cpp | 3 ++- engine/src/engine/render/asset/model.cpp | 1 - engine/src/engine/render/asset/model.h | 7 ++++++- 6 files changed, 33 insertions(+), 5 deletions(-) diff --git a/engine/src/engine/asset/asset_manager.cpp b/engine/src/engine/asset/asset_manager.cpp index 10b225e..c19ec7e 100644 --- a/engine/src/engine/asset/asset_manager.cpp +++ b/engine/src/engine/asset/asset_manager.cpp @@ -37,4 +37,22 @@ namespace engineapi { return text; } + vector AssetManager::LoadBinaryFile(const string& path) + { + // ate:在文件末尾开始读取,从文件末尾开始读取的优点是我们可以使用读取位置来确定文件的大小并分配缓冲区 + ifstream file(path, std::ios::ate | std::ios::binary); + if (!file.is_open()) + zlog::info("Failed to load binary file: {}", path); + + // 使用读取位置来确定文件的大小并分配缓冲区 + size_t fileSize = (size_t)file.tellg(); + vector data(fileSize); + + // 返回文件开头,真正读取内容 + file.seekg(0); + file.read(data.data(), fileSize); + file.close(); + + return data; + } } diff --git a/engine/src/engine/asset/asset_manager.h b/engine/src/engine/asset/asset_manager.h index d1cd0f9..8ff4e87 100644 --- a/engine/src/engine/asset/asset_manager.h +++ b/engine/src/engine/asset/asset_manager.h @@ -49,6 +49,7 @@ namespace engineapi AssetManager() = default; public: static string LoadTextFile(const string& path); + static vector LoadBinaryFile(const string& path); }; } template<> diff --git a/engine/src/engine/object/scene/scene.cpp b/engine/src/engine/object/scene/scene.cpp index 7c9d333..1227f70 100644 --- a/engine/src/engine/object/scene/scene.cpp +++ b/engine/src/engine/object/scene/scene.cpp @@ -7,19 +7,23 @@ namespace engineapi { Scene::Scene() { mCamera = new Camera(); + auto flags = Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG; + Material* material = new Material("assets/shader/simple", flags); { ActorProperty property; property.id = 1; - property.flags = Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG; + property.flags = flags; property.path = "assets/models/cube.obj"; actor1 = ActorMesh::New(property); + actor1->Ptr().SetMaterial(material); } { ActorProperty property; property.id = 1; - property.flags = Asset::ASSET_SHARED_FLAG | Asset::ASSET_ASYNC_FLAG; + property.flags = flags; property.path = "assets/models/box.ply"; actor2 = ActorMesh::New(property); + actor2->Ptr().SetMaterial(material); } } Scene::~Scene() diff --git a/engine/src/engine/render/asset/material.cpp b/engine/src/engine/render/asset/material.cpp index 7995aa7..c1dcb6f 100644 --- a/engine/src/engine/render/asset/material.cpp +++ b/engine/src/engine/render/asset/material.cpp @@ -1,10 +1,11 @@ #include "material.h" +#include "asset/asset_manager.h" #include "../renderapi.h" namespace engineapi { Material::Material(string name, uint32_t flags) :Asset(name, flags) { - + auto vertShader = AssetManager::LoadBinaryFile(name); } Material::~Material() { diff --git a/engine/src/engine/render/asset/model.cpp b/engine/src/engine/render/asset/model.cpp index e4628ef..6e6e90b 100644 --- a/engine/src/engine/render/asset/model.cpp +++ b/engine/src/engine/render/asset/model.cpp @@ -1,6 +1,5 @@ #include "model.h" #include "zlog.h" -#include "mesh.h" #include "assimp/Importer.hpp" #include "assimp/scene.h" #include "assimp/postprocess.h" diff --git a/engine/src/engine/render/asset/model.h b/engine/src/engine/render/asset/model.h index a3033af..3d43fbc 100644 --- a/engine/src/engine/render/asset/model.h +++ b/engine/src/engine/render/asset/model.h @@ -1,5 +1,7 @@ #pragma once #include "asset_render.h" +#include "mesh.h" +#include "material.h" class aiNode; class aiMesh; class aiScene; @@ -7,7 +9,7 @@ namespace engineapi { class Model : public Asset { protected: vector mMeshes; - + Material* mMaterial; public: using Asset::Asset; void BeginLoad()override; @@ -16,6 +18,9 @@ namespace engineapi { vector& GetMeshs() { return mMeshes; } + void SetMaterial(Material* material) { + mMaterial = material; + } void Use(); }; }; \ No newline at end of file