what is this mess

This commit is contained in:
tildearrow 2023-07-03 18:13:45 -05:00
parent bb3ccedb29
commit 1189cde072
2 changed files with 31 additions and 46 deletions

View File

@ -19,8 +19,11 @@
#include "../gui.h" #include "../gui.h"
class FurnaceGUIRenderSDL: public FurnaceGUIRender { struct FurnaceGUIRenderMetalPrivate;
class FurnaceGUIRenderMetal: public FurnaceGUIRender {
SDL_Renderer* sdlRend; SDL_Renderer* sdlRend;
FurnaceGUIRenderMetalPrivate* priv;
public: public:
ImTextureID getTextureID(FurnaceGUITexture* which); ImTextureID getTextureID(FurnaceGUITexture* which);
bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch); bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch);
@ -44,6 +47,7 @@ class FurnaceGUIRenderSDL: public FurnaceGUIRender {
void initGUI(SDL_Window* win); void initGUI(SDL_Window* win);
void quitGUI(); void quitGUI();
bool quit(); bool quit();
FurnaceGUIRenderSDL(): FurnaceGUIRenderMetal():
sdlRend(NULL) {} sdlRend(NULL),
}; priv(NULL) {}
};

View File

@ -21,9 +21,16 @@
#include "renderMetal.h" #include "renderMetal.h"
#include "backends/imgui_impl_metal.h" #include "backends/imgui_impl_metal.h"
#include <Metal/Metal.h> #include <Metal/Metal.h>
#include <QuartzCore/QuartzCore.h> #include <QuartzCore/QuartzCore.h>
struct FurnaceGUIRenderMetalPrivate {
CAMetalLayer* context;
id<MTLCommandQueue> cmdQueue;
MTLRenderPassDescriptor* renderPass;
};
class FurnaceMetalTexture: public FurnaceGUITexture { class FurnaceMetalTexture: public FurnaceGUITexture {
public: public:
MTLTexture* tex; MTLTexture* tex;
@ -70,69 +77,32 @@ bool FurnaceGUIRenderMetal::destroyTexture(FurnaceGUITexture* which) {
} }
void FurnaceGUIRenderMetal::setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode) { void FurnaceGUIRenderMetal::setTextureBlendMode(FurnaceGUITexture* which, FurnaceGUIBlendMode mode) {
FurnaceSDLTexture* t=(FurnaceSDLTexture*)which;
switch (mode) {
case GUI_BLEND_MODE_NONE:
SDL_SetTextureBlendMode(t->tex,SDL_BLENDMODE_NONE);
break;
case GUI_BLEND_MODE_BLEND:
SDL_SetTextureBlendMode(t->tex,SDL_BLENDMODE_BLEND);
break;
case GUI_BLEND_MODE_ADD:
SDL_SetTextureBlendMode(t->tex,SDL_BLENDMODE_ADD);
break;
case GUI_BLEND_MODE_MULTIPLY:
SDL_SetTextureBlendMode(t->tex,SDL_BLENDMODE_MOD);
break;
}
} }
void FurnaceGUIRenderMetal::setBlendMode(FurnaceGUIBlendMode mode) { void FurnaceGUIRenderMetal::setBlendMode(FurnaceGUIBlendMode mode) {
switch (mode) {
case GUI_BLEND_MODE_NONE:
SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_NONE);
break;
case GUI_BLEND_MODE_BLEND:
SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_BLEND);
break;
case GUI_BLEND_MODE_ADD:
SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_ADD);
break;
case GUI_BLEND_MODE_MULTIPLY:
SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_MOD);
break;
}
} }
void FurnaceGUIRenderMetal::clear(ImVec4 color) { void FurnaceGUIRenderMetal::clear(ImVec4 color) {
SDL_SetRenderDrawColor(sdlRend,color.x*255,color.y*255,color.z*255,color.w*255);
SDL_RenderClear(sdlRend);
} }
bool FurnaceGUIRenderMetal::newFrame() { bool FurnaceGUIRenderMetal::newFrame() {
return ImGui_ImplSDLRenderer2_NewFrame(); ImGui_ImplMetal_NewFrame(priv->renderPass);
} }
void FurnaceGUIRenderMetal::createFontsTexture() { void FurnaceGUIRenderMetal::createFontsTexture() {
ImGui_ImplSDLRenderer2_CreateFontsTexture();
} }
void FurnaceGUIRenderMetal::destroyFontsTexture() { void FurnaceGUIRenderMetal::destroyFontsTexture() {
ImGui_ImplSDLRenderer2_DestroyFontsTexture();
} }
void FurnaceGUIRenderMetal::renderGUI() { void FurnaceGUIRenderMetal::renderGUI() {
ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData()); ImGui_ImplMetal_RenderDrawData(ImGui::GetDrawData());
} }
void FurnaceGUIRenderMetal::wipe(float alpha) { void FurnaceGUIRenderMetal::wipe(float alpha) {
SDL_SetRenderDrawBlendMode(sdlRend,SDL_BLENDMODE_BLEND);
SDL_SetRenderDrawColor(sdlRend,0,0,0,255*alpha);
SDL_RenderFillRect(sdlRend,NULL);
} }
void FurnaceGUIRenderMetal::present() { void FurnaceGUIRenderMetal::present() {
SDL_RenderPresent(sdlRend);
} }
bool FurnaceGUIRenderMetal::getOutputSize(int& w, int& h) { bool FurnaceGUIRenderMetal::getOutputSize(int& w, int& h) {
@ -145,22 +115,33 @@ int FurnaceGUIRenderMetal::getWindowFlags() {
void FurnaceGUIRenderMetal::preInit() { void FurnaceGUIRenderMetal::preInit() {
SDL_SetHint(SDL_HINT_RENDER_DRIVER,"metal"); SDL_SetHint(SDL_HINT_RENDER_DRIVER,"metal");
priv=new FurnaceGUIRenderMetalPrivate;
} }
bool FurnaceGUIRenderMetal::init(SDL_Window* win) { bool FurnaceGUIRenderMetal::init(SDL_Window* win) {
SDL_SetHint(SDL_HINT_RENDER_DRIVER,"metal"); SDL_SetHint(SDL_HINT_RENDER_DRIVER,"metal");
sdlRend=SDL_CreateRenderer(win,-1,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC|SDL_RENDERER_TARGETTEXTURE); sdlRend=SDL_CreateRenderer(win,-1,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC|SDL_RENDERER_TARGETTEXTURE);
return (sdlRend!=NULL);
if (sdlRend==NULL) return NULL;
priv->context=(__bridge CAMetalLayer*)SDL_RenderGetMetalLayer(sdlRend);
priv->context.pixelFormat=MTLPixelFormatBGRA8Unorm;
return true;
} }
void FurnaceGUIRenderMetal::initGUI(SDL_Window* win) { void FurnaceGUIRenderMetal::initGUI(SDL_Window* win) {
ImGui_ImplSDL2_InitForSDLRenderer(win,sdlRend); ImGui_ImplMetal_Init(context.device);
ImGui_ImplSDLRenderer2_Init(sdlRend); ImGui_ImplSDL2_InitForMetal(win);
priv->cmdQueue=[priv->context.device newCommandQueue];
priv->renderPass=[MTLRenderPassDescriptor new];
} }
void FurnaceGUIRenderMetal::quitGUI() { void FurnaceGUIRenderMetal::quitGUI() {
ImGui_ImplSDLRenderer2_Shutdown(); ImGui_ImplSDLRenderer2_Shutdown();
[priv->renderPass release];
[priv->cmdQueue release];
} }
bool FurnaceGUIRenderMetal::quit() { bool FurnaceGUIRenderMetal::quit() {