Scene videw working
This commit is contained in:
parent
ded41e7c3e
commit
3817b5a355
@ -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; }
|
||||
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -27,7 +27,7 @@ namespace Deer {
|
||||
#ifdef DEER_RENDER
|
||||
ResourceManager<Shader>::unloadResources();
|
||||
ResourceManager<GPUMesh>::unloadResources();
|
||||
FrameBufferManager::unloadAllFrameBuffer();
|
||||
ResourceManager<FrameBuffer>::unloadResources();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
23
Deer/src/DeerRender/FrameBuffer/FrameBuffer.cpp
Normal file
23
Deer/src/DeerRender/FrameBuffer/FrameBuffer.cpp
Normal 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;
|
||||
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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
|
||||
@ -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;
|
||||
|
||||
@ -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); }
|
||||
|
||||
@ -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); }
|
||||
|
||||
@ -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); }
|
||||
|
||||
@ -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); }
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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); }
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user