diff --git a/assets/textures.go b/assets/textures.go index fb58ab6..5a68ac0 100755 --- a/assets/textures.go +++ b/assets/textures.go @@ -238,7 +238,12 @@ func LoadTextureJpeg(file string, loadOptions *TextureLoadOptions) (Texture, err return tex, nil } -func LoadCubemapTextures(rightTex, leftTex, topTex, botTex, frontTex, backTex string) (Cubemap, error) { +// LoadCubemapTextures only supports the 'TextureIsSrgba' option +func LoadCubemapTextures(rightTex, leftTex, topTex, botTex, frontTex, backTex string, loadOptions *TextureLoadOptions) (Cubemap, error) { + + if loadOptions == nil { + loadOptions = &TextureLoadOptions{} + } var imgDecoder func(r io.Reader) (image.Image, error) ext := strings.ToLower(path.Ext(rightTex)) @@ -283,7 +288,12 @@ func LoadCubemapTextures(rightTex, leftTex, topTex, botTex, frontTex, backTex st height := int32(nrgbaImg.Bounds().Dy()) width := int32(nrgbaImg.Bounds().Dx()) - gl.TexImage2D(uint32(gl.TEXTURE_CUBE_MAP_POSITIVE_X)+i, 0, gl.RGBA8, int32(width), int32(height), 0, gl.RGBA, gl.UNSIGNED_BYTE, unsafe.Pointer(&nrgbaImg.Pix[0])) + internalFormat := int32(gl.RGBA8) + if loadOptions.TextureIsSrgba { + internalFormat = gl.SRGB_ALPHA + } + + gl.TexImage2D(uint32(gl.TEXTURE_CUBE_MAP_POSITIVE_X)+i, 0, internalFormat, int32(width), int32(height), 0, gl.RGBA, gl.UNSIGNED_BYTE, unsafe.Pointer(&nrgbaImg.Pix[0])) } // set the texture wrapping/filtering options (on the currently bound texture object) diff --git a/engine/engine.go b/engine/engine.go index 71d1f0a..d17f057 100755 --- a/engine/engine.go +++ b/engine/engine.go @@ -133,17 +133,20 @@ func initSDL() error { sdl.GLSetAttribute(sdl.MAJOR_VERSION, 4) sdl.GLSetAttribute(sdl.MINOR_VERSION, 1) - // R(0-255) G(0-255) B(0-255) sdl.GLSetAttribute(sdl.GL_RED_SIZE, 8) sdl.GLSetAttribute(sdl.GL_GREEN_SIZE, 8) sdl.GLSetAttribute(sdl.GL_BLUE_SIZE, 8) + sdl.GLSetAttribute(sdl.GL_ALPHA_SIZE, 8) sdl.GLSetAttribute(sdl.GL_DOUBLEBUFFER, 1) sdl.GLSetAttribute(sdl.GL_DEPTH_SIZE, 24) sdl.GLSetAttribute(sdl.GL_STENCIL_SIZE, 8) - // Allow us to do MSAA - sdl.GLSetAttribute(sdl.GL_MULTISAMPLEBUFFERS, 8) + sdl.GLSetAttribute(sdl.GL_FRAMEBUFFER_SRGB_CAPABLE, 1) + + // Allows us to do MSAA + sdl.GLSetAttribute(sdl.GL_MULTISAMPLEBUFFERS, 1) + sdl.GLSetAttribute(sdl.GL_MULTISAMPLESAMPLES, 4) sdl.GLSetAttribute(sdl.GL_CONTEXT_PROFILE_MASK, sdl.GL_CONTEXT_PROFILE_CORE) @@ -155,16 +158,12 @@ func CreateOpenGLWindow(title string, x, y, width, height int32, flags WindowFla } func CreateOpenGLWindowCentered(title string, width, height int32, flags WindowFlags, rend renderer.Render) (*Window, error) { - return createWindow(title, -1, -1, width, height, WindowFlags_OPENGL|flags, rend) + return createWindow(title, sdl.WINDOWPOS_CENTERED, sdl.WINDOWPOS_CENTERED, width, height, WindowFlags_OPENGL|flags, rend) } func createWindow(title string, x, y, width, height int32, flags WindowFlags, rend renderer.Render) (*Window, error) { - assert.T(isInited, "engine.Init was not called!") - if x == -1 && y == -1 { - x = sdl.WINDOWPOS_CENTERED - y = sdl.WINDOWPOS_CENTERED - } + assert.T(isInited, "engine.Init() was not called!") sdlWin, err := sdl.CreateWindow(title, x, y, width, height, uint32(flags)) if err != nil { diff --git a/main.go b/main.go index fc8359f..b5efccd 100755 --- a/main.go +++ b/main.go @@ -147,7 +147,7 @@ func main() { game := &OurGame{ Win: window, - ImGUIInfo: nmageimgui.NewImGui(), + ImGUIInfo: nmageimgui.NewImGui("./res/shaders/imgui.glsl"), } window.EventCallbacks = append(window.EventCallbacks, game.handleWindowEvents) @@ -231,7 +231,7 @@ func (g *OurGame) Init() { } //Load textures - tex, err := assets.LoadTexturePNG("./res/textures/pallete-endesga-64-1x.png", nil) + tex, err := assets.LoadTexturePNG("./res/textures/pallete-endesga-64-1x.png", &assets.TextureLoadOptions{TextureIsSrgba: true}) if err != nil { logging.ErrLog.Fatalln("Failed to load texture. Err: ", err) } @@ -240,6 +240,7 @@ func (g *OurGame) Init() { "./res/textures/sb-right.jpg", "./res/textures/sb-left.jpg", "./res/textures/sb-top.jpg", "./res/textures/sb-bottom.jpg", "./res/textures/sb-front.jpg", "./res/textures/sb-back.jpg", + &assets.TextureLoadOptions{TextureIsSrgba: true}, ) if err != nil { logging.ErrLog.Fatalln("Failed to load cubemap. Err: ", err) diff --git a/res/shaders/imgui.glsl b/res/shaders/imgui.glsl new file mode 100755 index 0000000..d2ce15f --- /dev/null +++ b/res/shaders/imgui.glsl @@ -0,0 +1,33 @@ +//shader:vertex +#version 410 + +uniform mat4 ProjMtx; + +in vec2 Position; +in vec2 UV; +in vec4 Color; + +out vec2 Frag_UV; +out vec4 Frag_Color; + +void main() +{ + Frag_UV = UV; + Frag_Color = Color; + gl_Position = ProjMtx * vec4(Position.xy, 0, 1); +} + +//shader:fragment +#version 410 + +uniform sampler2D Texture; + +in vec2 Frag_UV; +in vec4 Frag_Color; + +out vec4 Out_Color; + +void main() +{ + Out_Color = vec4(Frag_Color.rgb, Frag_Color.a * texture(Texture, Frag_UV.st).r); +} \ No newline at end of file diff --git a/ui/imgui/imgui.go b/ui/imgui/imgui.go index 994fb04..8357a5d 100755 --- a/ui/imgui/imgui.go +++ b/ui/imgui/imgui.go @@ -147,7 +147,7 @@ func (i *ImguiInfo) AddFontTTF(fontPath string, fontSize float32, fontConfig *im return f } -const imguiShdrSrc = ` +const DefaultImguiShader = ` //shader:vertex #version 410 @@ -183,11 +183,20 @@ void main() } ` -func NewImGui() ImguiInfo { +// NewImGui setups imgui using the passed shader. +// If the path is empty a default nMage shader is used +func NewImGui(shaderPath string) ImguiInfo { + + var imguiMat *materials.Material + if shaderPath == "" { + imguiMat = materials.NewMaterialSrc("ImGUI Mat", []byte(DefaultImguiShader)) + } else { + imguiMat = materials.NewMaterial("ImGUI Mat", shaderPath) + } imguiInfo := ImguiInfo{ ImCtx: imgui.CreateContext(), - Mat: materials.NewMaterialSrc("ImGUI Mat", []byte(imguiShdrSrc)), + Mat: imguiMat, } io := imgui.CurrentIO()