Scene videw working

This commit is contained in:
Chewico 2025-12-05 13:20:02 +01:00
parent ded41e7c3e
commit 3817b5a355
18 changed files with 107 additions and 132 deletions

View File

@ -21,7 +21,7 @@ namespace Deer {
bool isValid() const { return ResourceManager<T>::isValid(*this); }
T& getData() { return ResourceManager<T>::getResourceData(*this); }
const std::string& getStorageId() const { return ResourceManager<T>::getStorageId(); }
const std::string& getStorageId() const { return ResourceManager<T>::getStorageId(*this); }
inline explicit operator bool() const { return resourceId >= 0; }

View File

@ -1,22 +1,29 @@
#pragma once
#include "DeerRender/Render/FrameBuffer.h"
#include "DeerRender/Resource.h"
#include <cstring>
#include <stdint.h>
namespace Deer {
// TODO: Add safety
namespace FrameBufferManager {
uint16_t createRGBA8FrameBuffer(std::string& name, int, int);
void resizeFrameBuffer(uint16_t frameBufferId, int, int);
struct FrameBufferData {
enum class FrameBufferType : int {
RGBA8 = 1
};
int getFrameBufferWidth(uint16_t frameBufferId);
int getFrameBufferHeight(uint16_t frameBufferId);
FrameBufferType frameBufferType;
int sizeX, sizeY;
int samples;
FrameBufferData(int _sizeX = 100, int _sizeY = 100, int _samples = 4, FrameBufferType type = FrameBufferType::RGBA8)
: sizeX(_sizeX), sizeY(_sizeY), samples(_samples), frameBufferType(type) { }
};
const std::string& getFrameBufferName(uint16_t);
uint16_t getFrameBufferId(std::string& name);
FrameBuffer& getFrameBuffer(uint16_t);
template <>
class ResourceBuilder<FrameBuffer> {
public:
using BaseDataType = FrameBufferData;
static Scope<FrameBuffer> buildResource(const BaseDataType& baseData);
};
void unloadAllFrameBuffer();
}
}

View File

@ -27,7 +27,7 @@ namespace Deer {
#ifdef DEER_RENDER
ResourceManager<Shader>::unloadResources();
ResourceManager<GPUMesh>::unloadResources();
FrameBufferManager::unloadAllFrameBuffer();
ResourceManager<FrameBuffer>::unloadResources();
#endif
}

View File

@ -0,0 +1,23 @@
#include "DeerRender/FrameBuffer.h"
namespace Deer {
Scope<FrameBuffer> ResourceBuilder<FrameBuffer>::buildResource(const FrameBufferData& baseData) {
TextureBufferType tbt;
switch (baseData.frameBufferType)
{
case FrameBufferData::FrameBufferType::RGBA8 :
tbt = TextureBufferType::RGBA8;
break;
default:
break;
}
FrameBufferSpecification spec(baseData.sizeX, baseData.sizeY, {tbt}, baseData.samples);
Scope<FrameBuffer> frameBuffer = Scope<FrameBuffer>(FrameBuffer::create(spec));
return frameBuffer;
}
}

View File

@ -15,69 +15,5 @@ namespace Deer {
std::unordered_map<std::string, uint16_t> frameBuffers_name_id_map;
}
uint16_t FrameBufferManager::createRGBA8FrameBuffer(std::string& name, int x, int y) {
FrameBufferSpecification specs(
x, y,
{TextureBufferType::RGBA8}, 4,
false);
FrameBuffer* frameBuffer = FrameBuffer::create(specs);
uint16_t frameBufferId = maxFrameBufferId;
maxFrameBufferId++;
frameBuffers[frameBufferId].frameBuffer_data = frameBuffer;
frameBuffers[frameBufferId].frameBuffer_name = name;
frameBuffers_name_id_map[name] = frameBufferId;
return frameBufferId;
}
void FrameBufferManager::resizeFrameBuffer(uint16_t frameBufferId, int x, int y) {
FrameBuffer* frameBuffer = frameBuffers[frameBufferId].frameBuffer_data;
frameBuffer->resize(x, y);
}
int FrameBufferManager::getFrameBufferWidth(uint16_t frameBufferId) {
FrameBuffer* frameBuffer = frameBuffers[frameBufferId].frameBuffer_data;
return frameBuffer->getSpecification().width;
}
int FrameBufferManager::getFrameBufferHeight(uint16_t frameBufferId) {
FrameBuffer* frameBuffer = frameBuffers[frameBufferId].frameBuffer_data;
return frameBuffer->getSpecification().height;
}
const std::string& FrameBufferManager::getFrameBufferName(uint16_t id) {
DEER_CORE_ASSERT(id >= 0 && id < maxFrameBufferId, "Invalid frame buffer id {0}", id);
return frameBuffers[id].frameBuffer_name;
}
FrameBuffer& FrameBufferManager::getFrameBuffer(uint16_t id) {
DEER_CORE_ASSERT(id > 0 && id < maxFrameBufferId, "Invalid frame buffer id {0}", id);
return *frameBuffers[id].frameBuffer_data;
}
uint16_t FrameBufferManager::getFrameBufferId(std::string& name) {
return frameBuffers_name_id_map[name];
}
void FrameBufferManager::unloadAllFrameBuffer() {
for (int x = 1; x < maxFrameBufferId; x++) {
delete frameBuffers[x].frameBuffer_data;
frameBuffers[x].frameBuffer_data = nullptr;
}
frameBuffers_name_id_map.clear();
maxFrameBufferId = 1;
frameBuffers[0].frameBuffer_data = nullptr;
frameBuffers[0].frameBuffer_name = "NULL";
frameBuffers_name_id_map["NULL"] = 0;
}
}

View File

@ -18,7 +18,7 @@ namespace Deer {
std::string getName();
};
FrameBufferStruct createRGBA8FrameBuffer(std::string& name, int, int);
FrameBufferStruct createLoadRGBA8FrameBuffer(std::string& name, int sizeX, int sizeY, int samples);
FrameBufferStruct getFrameBuffer(std::string& name);
void frameBuffer_constructor(FrameBufferHandleStruct* mem);

View File

@ -21,7 +21,7 @@ namespace Deer {
struct FrameBufferHandleStruct {
FrameBufferHandleStruct(int _id = 0) : frameBufferId(_id) {}
uint16_t frameBufferId;
int32_t frameBufferId = 0;
};
} // namespace StudioAPI
} // namespace Deer

View File

@ -15,8 +15,7 @@ namespace Deer {
REGISTER_EXT_OBJECT_CONSTRUCTOR("FrameBuffer", "void f()", StudioAPI::frameBuffer_constructor);
scriptEngine->SetDefaultNamespace("Engine");
REGISTER_GLOBAL_FUNC("FrameBuffer createRGBA8FrameBuffer(const string&in, int, int)", StudioAPI::createRGBA8FrameBuffer);
REGISTER_GLOBAL_FUNC("FrameBuffer getFrameBuffer(const string&in)", StudioAPI::getFrameBuffer);
REGISTER_GLOBAL_FUNC("FrameBuffer createLoadRGBA8FrameBuffer(const string&in, int width, int height, int samples = 4)", StudioAPI::createLoadRGBA8FrameBuffer);
scriptEngine->SetDefaultNamespace("");
}
} // namespace Deer

View File

@ -16,8 +16,20 @@ namespace Deer {
std::vector<Environment*> environments{&Scene::environment};
void EnvironmentStruct::render(FrameBufferHandleStruct frameBuffer_handle, SceneCamera& sc) {
FrameBuffer& frameBuffer = FrameBufferManager::getFrameBuffer(frameBuffer_handle.frameBufferId);
Environment& env = *environments[environmentId];
Resource<FrameBuffer> frameBufferResource = Resource<FrameBuffer>::unsafeFromId(frameBuffer_handle.frameBufferId);
FrameBuffer& frameBuffer = frameBufferResource.getData();
Environment* envPtr = nullptr;
if (environmentId < 0) {
envPtr = &Scene::environment;
} else {
Resource<Environment> environmentResource =
Resource<Environment>::unsafeFromId(environmentId);
envPtr = &environmentResource.getData();
}
Environment& env = *envPtr;
frameBuffer.bind();

View File

@ -5,38 +5,45 @@ namespace Deer {
namespace StudioAPI {
int FrameBufferStruct::getWidth() {
return FrameBufferManager::getFrameBufferWidth(frameBufferId);
Resource<FrameBuffer> frameBufferResource = Resource<FrameBuffer>::unsafeFromId(frameBufferId);
FrameBuffer& frameBuffer = frameBufferResource.getData();
return frameBuffer.getSpecification().width;
}
int FrameBufferStruct::getHeight() {
return FrameBufferManager::getFrameBufferWidth(frameBufferId);
Resource<FrameBuffer> frameBufferResource = Resource<FrameBuffer>::unsafeFromId(frameBufferId);
FrameBuffer& frameBuffer = frameBufferResource.getData();
return frameBuffer.getSpecification().height;
}
void FrameBufferStruct::resize(int x, int y) {
FrameBufferManager::resizeFrameBuffer(frameBufferId, x, y);
Resource<FrameBuffer> frameBufferResource = Resource<FrameBuffer>::unsafeFromId(frameBufferId);
FrameBuffer& frameBuffer = frameBufferResource.getData();
frameBuffer.resize(x, y);
}
void FrameBufferStruct::clearRGBA(int r, int g, int b, int a) {
FrameBuffer& frameBuffer =
FrameBufferManager::getFrameBuffer(frameBufferId);
Resource<FrameBuffer> frameBufferResource = Resource<FrameBuffer>::unsafeFromId(frameBufferId);
FrameBuffer& frameBuffer = frameBufferResource.getData();
frameBuffer.bind();
frameBuffer.clear();
uint8_t clearColor[4]{(uint8_t)r, (uint8_t)g, (uint8_t)b,
(uint8_t)a};
uint8_t clearColor[4]{(uint8_t)r, (uint8_t)g, (uint8_t)b, (uint8_t)a};
frameBuffer.clearBuffer(0, &clearColor);
frameBuffer.unbind();
}
std::string FrameBufferStruct::getName() {
return FrameBufferManager::getFrameBufferName(frameBufferId);
return Resource<FrameBuffer>::unsafeFromId(frameBufferId).getStorageId();
}
FrameBufferStruct createRGBA8FrameBuffer(std::string& name, int x,
int y) {
uint16_t id =
FrameBufferManager::createRGBA8FrameBuffer(name, x, y);
return FrameBufferStruct(id);
FrameBufferStruct createLoadRGBA8FrameBuffer(std::string& name, int sizeX, int sizeY, int samples) {
FrameBufferData fbd(sizeX, sizeY, samples, FrameBufferData::FrameBufferType::RGBA8);
Resource<FrameBuffer> frameBuffer = ResourceManager<FrameBuffer>::loadResourceFromData(fbd, name);
return FrameBufferStruct(frameBuffer.getResourceId());
}
void frameBuffer_constructor(FrameBufferHandleStruct* mem) {
@ -44,11 +51,8 @@ namespace Deer {
}
bool FrameBufferStruct::isValid() {
return frameBufferId > 0 && frameBufferId < 100;
}
FrameBufferStruct getFrameBuffer(std::string& name) {
return FrameBufferManager::getFrameBufferId(name);
DEER_CORE_TRACE("{} fbid", frameBufferId);
return frameBufferId >= 0 && frameBufferId < 100;
}
} // namespace StudioAPI
} // namespace Deer

View File

@ -221,10 +221,10 @@ namespace Deer {
ImGui::Image((void*)(uint64_t)iconId, ImVec2(size, size), ImVec2(0, 1), ImVec2(1, 0), ImVec4(0.5f, 0.6f, 0.8f, 1.0f), ImVec4(0,0,0,0));
}
void drawFrameBuffer(FrameBufferHandleStruct frameBuffer_handle,
int sizeX, int sizeY) {
FrameBuffer& frameBuffer = FrameBufferManager::getFrameBuffer(
frameBuffer_handle.frameBufferId);
void drawFrameBuffer(FrameBufferHandleStruct frameBuffer_handle, int sizeX, int sizeY) {
Resource<FrameBuffer> frameBufferResource = Resource<FrameBuffer>::unsafeFromId(frameBuffer_handle.frameBufferId);
FrameBuffer& frameBuffer = frameBufferResource.getData();
frameBuffer.bind();
int frameBufferId = frameBuffer.getTextureBufferID(0);
@ -233,10 +233,9 @@ namespace Deer {
frameBuffer.unbind();
}
void drawFrameBufferCentered(FrameBufferHandleStruct frameBuffer_handle,
int _x, int _y) {
FrameBuffer& frameBuffer = FrameBufferManager::getFrameBuffer(
frameBuffer_handle.frameBufferId);
void drawFrameBufferCentered(FrameBufferHandleStruct frameBuffer_handle, int _x, int _y) {
Resource<FrameBuffer> frameBufferResource = Resource<FrameBuffer>::unsafeFromId(frameBuffer_handle.frameBufferId);
FrameBuffer& frameBuffer = frameBufferResource.getData();
int frameBufferId = frameBuffer.getTextureBufferID();
float sizeX;

View File

@ -426,12 +426,11 @@ namespace Resource { string[]@ getResourceFolders(string&in path); }
namespace Resource { string[]@ getResourceFiles(string&in path); }
namespace Resource { ResourceType getResourceType(string&in path); }
namespace Engine { Environment getMainEnvironment(); }
namespace Engine { Environment createEnvironment(); }
namespace Engine { Environment createLoadEnvironment(const string&in envId); }
namespace Engine { Entity getRoot(); }
namespace Engine { void print(const string&in text); }
namespace Path { string getParent(const string&in path); }
namespace Path { string getParentName(const string&in path); }
namespace Path { string getName(const string&in path); }
namespace Path { string[]@ divide(const string&in path); }
namespace Engine { FrameBuffer createRGBA8FrameBuffer(const string&in, int, int); }
namespace Engine { FrameBuffer getFrameBuffer(const string&in); }
namespace Engine { FrameBuffer createLoadRGBA8FrameBuffer(const string&in, int width, int height, int samples = 4); }

View File

@ -426,12 +426,11 @@ namespace Resource { string[]@ getResourceFolders(string&in path); }
namespace Resource { string[]@ getResourceFiles(string&in path); }
namespace Resource { ResourceType getResourceType(string&in path); }
namespace Engine { Environment getMainEnvironment(); }
namespace Engine { Environment createEnvironment(); }
namespace Engine { Environment createLoadEnvironment(const string&in envId); }
namespace Engine { Entity getRoot(); }
namespace Engine { void print(const string&in text); }
namespace Path { string getParent(const string&in path); }
namespace Path { string getParentName(const string&in path); }
namespace Path { string getName(const string&in path); }
namespace Path { string[]@ divide(const string&in path); }
namespace Engine { FrameBuffer createRGBA8FrameBuffer(const string&in, int, int); }
namespace Engine { FrameBuffer getFrameBuffer(const string&in); }
namespace Engine { FrameBuffer createLoadRGBA8FrameBuffer(const string&in, int width, int height, int samples = 4); }

View File

@ -426,12 +426,11 @@ namespace Resource { string[]@ getResourceFolders(string&in path); }
namespace Resource { string[]@ getResourceFiles(string&in path); }
namespace Resource { ResourceType getResourceType(string&in path); }
namespace Engine { Environment getMainEnvironment(); }
namespace Engine { Environment createEnvironment(); }
namespace Engine { Environment createLoadEnvironment(const string&in envId); }
namespace Engine { Entity getRoot(); }
namespace Engine { void print(const string&in text); }
namespace Path { string getParent(const string&in path); }
namespace Path { string getParentName(const string&in path); }
namespace Path { string getName(const string&in path); }
namespace Path { string[]@ divide(const string&in path); }
namespace Engine { FrameBuffer createRGBA8FrameBuffer(const string&in, int, int); }
namespace Engine { FrameBuffer getFrameBuffer(const string&in); }
namespace Engine { FrameBuffer createLoadRGBA8FrameBuffer(const string&in, int width, int height, int samples = 4); }

View File

@ -426,12 +426,11 @@ namespace Resource { string[]@ getResourceFolders(string&in path); }
namespace Resource { string[]@ getResourceFiles(string&in path); }
namespace Resource { ResourceType getResourceType(string&in path); }
namespace Engine { Environment getMainEnvironment(); }
namespace Engine { Environment createEnvironment(); }
namespace Engine { Environment createLoadEnvironment(const string&in envId); }
namespace Engine { Entity getRoot(); }
namespace Engine { void print(const string&in text); }
namespace Path { string getParent(const string&in path); }
namespace Path { string getParentName(const string&in path); }
namespace Path { string getName(const string&in path); }
namespace Path { string[]@ divide(const string&in path); }
namespace Engine { FrameBuffer createRGBA8FrameBuffer(const string&in, int, int); }
namespace Engine { FrameBuffer getFrameBuffer(const string&in); }
namespace Engine { FrameBuffer createLoadRGBA8FrameBuffer(const string&in, int width, int height, int samples = 4); }

View File

@ -70,7 +70,7 @@ class ViewportPanel : Panel {
}
void init() {
frameBuffer = Engine::createRGBA8FrameBuffer("MainFrameBuffer", 400, 400);
frameBuffer = Engine::createLoadRGBA8FrameBuffer("MainFrameBuffer", 400, 400);
mainEnv = Engine::getMainEnvironment();
sceneCamera.transform.position = vec3(0, 1, -2);

View File

@ -69,9 +69,9 @@ enum key {
LeftSuper = 530,
RightSuper = 534,
LeftCtrl = 527,
MouseLeft = 641,
MouseRight = 642,
MouseMiddle = 643
MouseLeft = 656,
MouseRight = 657,
MouseMiddle = 658
}
class ref {
~ref();
@ -426,12 +426,11 @@ namespace Resource { string[]@ getResourceFolders(string&in path); }
namespace Resource { string[]@ getResourceFiles(string&in path); }
namespace Resource { ResourceType getResourceType(string&in path); }
namespace Engine { Environment getMainEnvironment(); }
namespace Engine { Environment createEnvironment(); }
namespace Engine { Environment createLoadEnvironment(const string&in envId); }
namespace Engine { Entity getRoot(); }
namespace Engine { void print(const string&in text); }
namespace Path { string getParent(const string&in path); }
namespace Path { string getParentName(const string&in path); }
namespace Path { string getName(const string&in path); }
namespace Path { string[]@ divide(const string&in path); }
namespace Engine { FrameBuffer createRGBA8FrameBuffer(const string&in, int, int); }
namespace Engine { FrameBuffer getFrameBuffer(const string&in); }
namespace Engine { FrameBuffer createLoadRGBA8FrameBuffer(const string&in, int width, int height, int samples = 4); }

View File

@ -4,10 +4,10 @@ Size=1920,1011
Collapsed=0
[Window][ViewportPanel]
Pos=333,24
Size=1282,732
Pos=433,34
Size=1057,615
Collapsed=0
DockId=0xA1672E74,0
DockId=0x00000004,1
[Window][Debug##Default]
Pos=60,60
@ -70,7 +70,7 @@ DockSpace ID=0x0AC2E849 Window=0xD0388BC8 Pos=0,34 Size=1920,976 Split=Y
DockNode ID=0x00000005 Parent=0x0AC2E849 SizeRef=1920,615 Split=X
DockNode ID=0x00000002 Parent=0x00000005 SizeRef=1490,645 Split=X Selected=0xD9E076F4
DockNode ID=0x00000001 Parent=0x00000002 SizeRef=431,976 Selected=0x16E3C1E7
DockNode ID=0x00000004 Parent=0x00000002 SizeRef=1057,976 CentralNode=1 Selected=0xD9E076F4
DockNode ID=0x00000004 Parent=0x00000002 SizeRef=1057,976 CentralNode=1 Selected=0x0F5FFC8C
DockNode ID=0x00000003 Parent=0x00000005 SizeRef=428,645 Selected=0x9876A79B
DockNode ID=0x00000006 Parent=0x0AC2E849 SizeRef=1920,359 Selected=0x018A0F9B
DockSpace ID=0xA1672E74 Pos=0,34 Size=1920,976 CentralNode=1 Selected=0x9ED090AF