backend updates
pd-3ds: Add support for RGB565 textures pd-desktop: Add support for A8 textures Add glfw callback chain to not break other libs using the same callback
This commit is contained in:
@@ -95,6 +95,11 @@ void FragCfg(GPU_TEXCOLOR clr) {
|
|||||||
C3D_TexEnvFunc(env, C3D_RGB, GPU_REPLACE);
|
C3D_TexEnvFunc(env, C3D_RGB, GPU_REPLACE);
|
||||||
C3D_TexEnvFunc(env, C3D_Alpha, GPU_MODULATE);
|
C3D_TexEnvFunc(env, C3D_Alpha, GPU_MODULATE);
|
||||||
break;
|
break;
|
||||||
|
case GPU_RGB565:
|
||||||
|
C3D_TexEnvSrc(env, C3D_Alpha, GPU_TEXTURE0);
|
||||||
|
C3D_TexEnvFunc(env, C3D_RGB, GPU_MODULATE);
|
||||||
|
C3D_TexEnvFunc(env, C3D_Alpha, GPU_REPLACE);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
C3D_TexEnvSrc(env, C3D_Both, GPU_TEXTURE0);
|
C3D_TexEnvSrc(env, C3D_Both, GPU_TEXTURE0);
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ class GfxGL2 : public GfxDriver {
|
|||||||
GLuint Shader;
|
GLuint Shader;
|
||||||
GLuint pLocProjection;
|
GLuint pLocProjection;
|
||||||
GLuint pLocTex;
|
GLuint pLocTex;
|
||||||
|
GLuint pLocAlfa;
|
||||||
GLuint VBO, IBO;
|
GLuint VBO, IBO;
|
||||||
};
|
};
|
||||||
} // namespace PD
|
} // namespace PD
|
||||||
@@ -64,6 +64,7 @@ class HidGLFW : public HidDriver {
|
|||||||
GLFWwindow* Window;
|
GLFWwindow* Window;
|
||||||
int PrevState;
|
int PrevState;
|
||||||
std::unordered_map<int, int> PrevStates;
|
std::unordered_map<int, int> PrevStates;
|
||||||
|
static GLFWcharfun pOldTextCB;
|
||||||
static std::string* pText;
|
static std::string* pText;
|
||||||
bool pInTextMode = false;
|
bool pInTextMode = false;
|
||||||
PD::u64 pLastUpdate = 0;
|
PD::u64 pLastUpdate = 0;
|
||||||
|
|||||||
@@ -53,10 +53,15 @@ const char* frag_shader = R"(
|
|||||||
varying vec4 oColor;
|
varying vec4 oColor;
|
||||||
|
|
||||||
uniform sampler2D tex;
|
uniform sampler2D tex;
|
||||||
|
uniform bool alfa;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
vec4 tc = texture2D(tex, oUV);
|
vec4 tc = texture2D(tex, oUV);
|
||||||
gl_FragColor = tc*oColor;
|
if (alfa) {
|
||||||
|
gl_FragColor = vec4(oColor.rgb, tc.a * oColor.a);
|
||||||
|
} else {
|
||||||
|
gl_FragColor = tc * oColor;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
)";
|
)";
|
||||||
|
|
||||||
@@ -138,6 +143,7 @@ void GfxGL2::Init() {
|
|||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
|
||||||
|
|
||||||
pLocTex = glGetUniformLocation(Shader, "tex");
|
pLocTex = glGetUniformLocation(Shader, "tex");
|
||||||
|
pLocAlfa = glGetUniformLocation(Shader, "alfa");
|
||||||
pLocProjection = glGetUniformLocation(Shader, "projection");
|
pLocProjection = glGetUniformLocation(Shader, "projection");
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
@@ -172,6 +178,9 @@ void GfxGL2::BindTex(PD::Li::TexAddress addr) {
|
|||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, (GLuint)addr);
|
glBindTexture(GL_TEXTURE_2D, (GLuint)addr);
|
||||||
glUniform1i(pLocTex, 0);
|
glUniform1i(pLocTex, 0);
|
||||||
|
GLint fmt = 0;
|
||||||
|
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &fmt);
|
||||||
|
glUniform1i(pLocAlfa, fmt == GL_ALPHA);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GfxGL2::RenderDrawData(const std::vector<PD::Li::Command::Ref>& Commands) {
|
void GfxGL2::RenderDrawData(const std::vector<PD::Li::Command::Ref>& Commands) {
|
||||||
|
|||||||
@@ -24,11 +24,21 @@ SOFTWARE.
|
|||||||
|
|
||||||
#include <pd-desktop/bknd-hid.hpp>
|
#include <pd-desktop/bknd-hid.hpp>
|
||||||
namespace PD {
|
namespace PD {
|
||||||
std::string* HidGLFW::pText;
|
std::string* HidGLFW::pText = nullptr;
|
||||||
|
GLFWcharfun HidGLFW::pOldTextCB = nullptr;
|
||||||
// Default Call back (If no Text input is requsted)
|
// Default Call back (If no Text input is requsted)
|
||||||
void NullTextCB(GLFWwindow* win, unsigned int c) {}
|
void NullTextCB(GLFWwindow* win, unsigned int c) {
|
||||||
|
// Chain
|
||||||
|
if (HidGLFW::pOldTextCB) {
|
||||||
|
HidGLFW::pOldTextCB(win, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
// Text callback if requested
|
// Text callback if requested
|
||||||
void TextCB(GLFWwindow* win, unsigned int c) {
|
void TextCB(GLFWwindow* win, unsigned int c) {
|
||||||
|
// Chain
|
||||||
|
if (HidGLFW::pOldTextCB) {
|
||||||
|
HidGLFW::pOldTextCB(win, c);
|
||||||
|
}
|
||||||
if (!HidGLFW::pText) {
|
if (!HidGLFW::pText) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -36,7 +46,7 @@ void TextCB(GLFWwindow* win, unsigned int c) {
|
|||||||
}
|
}
|
||||||
HidGLFW::HidGLFW(GLFWwindow* win) : HidDriver("HidGLFW") {
|
HidGLFW::HidGLFW(GLFWwindow* win) : HidDriver("HidGLFW") {
|
||||||
Window = win;
|
Window = win;
|
||||||
glfwSetCharCallback(Window, NullTextCB);
|
HidGLFW::pOldTextCB = glfwSetCharCallback(Window, NullTextCB);
|
||||||
Flags |= Flags_HasKeyboard;
|
Flags |= Flags_HasKeyboard;
|
||||||
Flags |= Flags_HasMouse;
|
Flags |= Flags_HasMouse;
|
||||||
pBinds[GLFW_MOUSE_BUTTON_LEFT] = Touch;
|
pBinds[GLFW_MOUSE_BUTTON_LEFT] = Touch;
|
||||||
|
|||||||
Reference in New Issue
Block a user