From 323cd1099fec7b419ba5c54624a3d3556387f009 Mon Sep 17 00:00:00 2001 From: bloeys Date: Sun, 3 Jul 2022 09:17:59 +0400 Subject: [PATCH] Move to latest nMage --- glyphs/glyphs.go | 25 +++++++------ go.mod | 4 +-- go.sum | 8 ++--- main.go | 40 ++++----------------- res/shaders/glyph.frag.glsl | 22 ------------ res/shaders/{glyph.vert.glsl => glyph.glsl} | 27 +++++++++++++- res/shaders/grid.frag.glsl | 12 ------- res/shaders/{grid.vert.glsl => grid.glsl} | 17 ++++++++- res/shaders/imgui.frag.glsl | 13 ------- res/shaders/imgui.vert.glsl | 19 ---------- 10 files changed, 67 insertions(+), 120 deletions(-) delete mode 100755 res/shaders/glyph.frag.glsl rename res/shaders/{glyph.vert.glsl => glyph.glsl} (67%) delete mode 100755 res/shaders/grid.frag.glsl rename res/shaders/{grid.vert.glsl => grid.glsl} (72%) delete mode 100755 res/shaders/imgui.frag.glsl delete mode 100755 res/shaders/imgui.vert.glsl diff --git a/glyphs/glyphs.go b/glyphs/glyphs.go index c73aff6..97e48db 100755 --- a/glyphs/glyphs.go +++ b/glyphs/glyphs.go @@ -173,16 +173,12 @@ func (gr *GlyphRend) updateFontAtlasTexture(fontFile string) error { } defer os.Remove(pngFileName) - atlasTex, err := assets.LoadPNGTexture(pngFileName) + atlasTex, err := assets.LoadTexturePNG(pngFileName, nil) if err != nil { return err } gr.AtlasTex = &atlasTex - //TODO: We want a function to load without caching. For now we clear manually - delete(assets.Textures, atlasTex.TexID) - delete(assets.TexturePaths, pngFileName) - gl.BindTexture(gl.TEXTURE_2D, atlasTex.TexID) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) @@ -229,7 +225,7 @@ func NewGlyphRend(fontFile string, fontOptions *truetype.Options, screenWidth, s gr.GlyphMesh = &meshes.Mesh{ Name: "glypQuad", - //VertPos, UV, Color; Instanced attributes are stored separately + //VertPos only. Instanced attributes are stored separately Buf: buffers.NewBuffer( buffers.Element{ElementType: buffers.DataTypeVec3}, ), @@ -249,8 +245,7 @@ func NewGlyphRend(fontFile string, fontOptions *truetype.Options, screenWidth, s }) //Setup material - gr.GlyphMat = materials.NewMaterial("glyphMat", "./res/shaders/glyph") - gr.GlyphMat.SetAttribute(gr.GlyphMesh.Buf) + gr.GlyphMat = materials.NewMaterial("glyphMat", "./res/shaders/glyph.glsl") gr.GlyphMat.DiffuseTex = gr.AtlasTex.TexID //Create instanced buf and set its instanced attributes. @@ -258,6 +253,12 @@ func NewGlyphRend(fontFile string, fontOptions *truetype.Options, screenWidth, s gr.InstancedBuf = buffers.Buffer{ VAOID: gr.GlyphMesh.Buf.VAOID, } + + gl.GenBuffers(1, &gr.InstancedBuf.BufID) + if gr.InstancedBuf.BufID == 0 { + return nil, errors.New("failed to create OpenGL VBO buffer") + } + gr.InstancedBuf.SetLayout( buffers.Element{ElementType: buffers.DataTypeVec2}, //UVST0 buffers.Element{ElementType: buffers.DataTypeVec2}, //UVST1 @@ -269,11 +270,6 @@ func NewGlyphRend(fontFile string, fontOptions *truetype.Options, screenWidth, s buffers.Element{ElementType: buffers.DataTypeVec3}, //ModelScale ) - gl.GenBuffers(1, &gr.InstancedBuf.BufID) - if gr.InstancedBuf.BufID == 0 { - return nil, errors.New("failed to create OpenGL VBO buffer") - } - gr.InstancedBuf.Bind() gl.BindBuffer(gl.ARRAY_BUFFER, gr.InstancedBuf.BufID) layout := gr.InstancedBuf.GetLayout() @@ -318,6 +314,9 @@ func NewGlyphRend(fontFile string, fontOptions *truetype.Options, screenWidth, s gl.BindBuffer(gl.ARRAY_BUFFER, 0) gr.InstancedBuf.UnBind() + //Reset mesh layout because the instancedBuf setLayout over-wrote vertex attribute 0 + gr.GlyphMesh.Buf.SetLayout(buffers.Element{ElementType: buffers.DataTypeVec3}) + gr.SetScreenSize(screenWidth, screenHeight) // fmt.Printf("lineHeight=%d, glyphInfo=%+v\n", gr.Atlas.LineHeight, gr.Atlas.Glyphs['A']) return gr, nil diff --git a/go.mod b/go.mod index e127f0f..33a3c77 100755 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/bloeys/nterm go 1.18 require ( - github.com/bloeys/gglm v0.3.1 - github.com/bloeys/nmage v0.11.12 + github.com/bloeys/gglm v0.41.10 + github.com/bloeys/nmage v0.12.12 github.com/go-gl/gl v0.0.0-20211025173605-bda47ffaa784 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 github.com/veandco/go-sdl2 v0.4.10 diff --git a/go.sum b/go.sum index 1fb3261..cd9f657 100755 --- a/go.sum +++ b/go.sum @@ -1,9 +1,9 @@ github.com/bloeys/assimp-go v0.4.2 h1:ArVK74BCFcTO/rCGj2NgZG9xtbjnJdEn5npIeJx1Z04= github.com/bloeys/assimp-go v0.4.2/go.mod h1:my3yRxT7CfOztmvi+0svmwbaqw0KFrxaHxncoyaEIP0= -github.com/bloeys/gglm v0.3.1 h1:Sy9upW7SBsBfDXrSmEhid3aQ+7J7itej+upwcxOnPMQ= -github.com/bloeys/gglm v0.3.1/go.mod h1:qwJQ0WzV191wAMwlGicbfbChbKoSedMk7gFFX6GnyOk= -github.com/bloeys/nmage v0.11.12 h1:b41h8uPxr2OITwt4Np/rHLlUWtMKwza2eqjNVuJ/ITk= -github.com/bloeys/nmage v0.11.12/go.mod h1:4h2tKtMvk9ab8r/+rem4QonPXEBTho6VWvpCMm0M6iM= +github.com/bloeys/gglm v0.41.10 h1:R9FMiI+VQVXAI+vDwCB7z9xqzy5VAR1657u8TQTDNKA= +github.com/bloeys/gglm v0.41.10/go.mod h1:qwJQ0WzV191wAMwlGicbfbChbKoSedMk7gFFX6GnyOk= +github.com/bloeys/nmage v0.12.12 h1:LeMR6NI+yMqxAZecdz7lOT1re4CWAVd1wDeJFK77+pI= +github.com/bloeys/nmage v0.12.12/go.mod h1:chDDenktiDvAG4BoFYNq1n8nACpbQ6/RFuCgCGmDxh4= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-gl/gl v0.0.0-20211025173605-bda47ffaa784 h1:1Zi56D0LNfvkzM+BdoxKryvUEdyWO7LP8oRT+oSYJW0= diff --git a/main.go b/main.go index f9b0ce6..7f8de9b 100755 --- a/main.go +++ b/main.go @@ -19,7 +19,6 @@ import ( var _ engine.Game = &program{} type program struct { - shouldRun bool win *engine.Window rend *rend3dgl.Rend3DGL imguiInfo nmageimgui.ImguiInfo @@ -34,13 +33,8 @@ type program struct { shouldDrawGrid bool } -//nMage TODO: -// * Assert that engine is inited -// * Create VAO struct independent from VBO to support multi-VBO use cases (e.g. instancing) -// * Move SetAttribute away from material struct -// * Fix FPS counter -// * Allow texture loading without cache -// * Reduce/remove Game interface +//nTerm TODO: +// * Signed distance fields? const subPixelX = 64 const subPixelY = 64 @@ -61,7 +55,6 @@ func main() { engine.SetVSync(true) p := &program{ - shouldRun: true, win: win, rend: rend, imguiInfo: nmageimgui.NewImGUI(), @@ -82,7 +75,7 @@ func main() { gl.ClearColor(0, 0, 0, 0) p.win.SDLWin.GLSwap() - engine.Run(p) + engine.Run(p, p.win, p.imguiInfo) } func (p *program) Init() { @@ -100,28 +93,21 @@ func (p *program) Init() { } glyphs.SaveImgToPNG(p.GlyphRend.Atlas.Img, "./debug-atlas.png") -} -func (p *program) Start() { - - var err error + //Load resources p.gridMesh, err = meshes.NewMesh("grid", "./res/models/quad.obj", 0) if err != nil { panic(err.Error()) } - p.gridMat = materials.NewMaterial("grid", "./res/shaders/grid") - p.gridMat.SetAttribute(p.gridMesh.Buf) + p.gridMat = materials.NewMaterial("grid", "./res/shaders/grid.glsl") p.handleWindowResize() } -func (p *program) FrameStart() { -} - func (p *program) Update() { if input.IsQuitClicked() || input.KeyClicked(sdl.K_ESCAPE) { - p.shouldRun = false + engine.Quit() } if input.KeyClicked(sdl.K_SPACE) { @@ -209,19 +195,7 @@ func (p *program) drawGrid() { func (p *program) FrameEnd() { } -func (g *program) GetWindow() *engine.Window { - return g.win -} - -func (g *program) GetImGUI() nmageimgui.ImguiInfo { - return g.imguiInfo -} - -func (p *program) ShouldRun() bool { - return p.shouldRun -} - -func (p *program) Deinit() { +func (p *program) DeInit() { } diff --git a/res/shaders/glyph.frag.glsl b/res/shaders/glyph.frag.glsl deleted file mode 100755 index cf46b5e..0000000 --- a/res/shaders/glyph.frag.glsl +++ /dev/null @@ -1,22 +0,0 @@ -#version 410 - -in vec4 vertColor; -in vec2 vertUV0; -in vec3 fragPos; - -out vec4 fragColor; - -uniform sampler2D diffTex; - -void main() -{ - vec4 texColor = texture(diffTex, vertUV0); - // if (texColor.r == 0) - // { - // fragColor = vec4(0,1,0,0.25); - // } - // else - { - fragColor = vec4(vertColor.rgb, texColor.r); - } -} diff --git a/res/shaders/glyph.vert.glsl b/res/shaders/glyph.glsl similarity index 67% rename from res/shaders/glyph.vert.glsl rename to res/shaders/glyph.glsl index d7215b0..2ea3e9d 100755 --- a/res/shaders/glyph.vert.glsl +++ b/res/shaders/glyph.glsl @@ -1,3 +1,4 @@ +//shader:vertex #version 410 layout(location=0) in vec3 vertPosIn; @@ -27,4 +28,28 @@ void main() fragPos = vec3(modelMat * vec4(vertPosIn, 1.0)); gl_Position = projViewMat * modelMat * vec4(vertPosIn, 1.0); -} \ No newline at end of file +} + +//shader:fragment +#version 410 + +in vec4 vertColor; +in vec2 vertUV0; +in vec3 fragPos; + +out vec4 fragColor; + +uniform sampler2D diffTex; + +void main() +{ + vec4 texColor = texture(diffTex, vertUV0); + // if (texColor.r == 0) + // { + // fragColor = vec4(0,1,0,0.25); + // } + // else + { + fragColor = vec4(vertColor.rgb, texColor.r); + } +} diff --git a/res/shaders/grid.frag.glsl b/res/shaders/grid.frag.glsl deleted file mode 100755 index 34c6532..0000000 --- a/res/shaders/grid.frag.glsl +++ /dev/null @@ -1,12 +0,0 @@ -#version 410 - -in vec4 vertColor; -in vec2 vertUV0; -in vec3 fragPos; - -out vec4 fragColor; - -void main() -{ - fragColor = vec4(1, 1, 1, 1); -} diff --git a/res/shaders/grid.vert.glsl b/res/shaders/grid.glsl similarity index 72% rename from res/shaders/grid.vert.glsl rename to res/shaders/grid.glsl index d07825c..0a4e3de 100755 --- a/res/shaders/grid.vert.glsl +++ b/res/shaders/grid.glsl @@ -1,3 +1,4 @@ +//shader:vertex #version 410 layout(location=0) in vec3 vertPosIn; @@ -19,4 +20,18 @@ void main() fragPos = vec3(modelMat * vec4(vertPosIn, 1.0)); gl_Position = projViewMat * modelMat * vec4(vertPosIn, 1.0); -} \ No newline at end of file +} + +//shader:fragment +#version 410 + +in vec4 vertColor; +in vec2 vertUV0; +in vec3 fragPos; + +out vec4 fragColor; + +void main() +{ + fragColor = vec4(1, 1, 1, 1); +} diff --git a/res/shaders/imgui.frag.glsl b/res/shaders/imgui.frag.glsl deleted file mode 100755 index edde592..0000000 --- a/res/shaders/imgui.frag.glsl +++ /dev/null @@ -1,13 +0,0 @@ -#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/res/shaders/imgui.vert.glsl b/res/shaders/imgui.vert.glsl deleted file mode 100755 index 08ae4e9..0000000 --- a/res/shaders/imgui.vert.glsl +++ /dev/null @@ -1,19 +0,0 @@ -#version 410 - -uniform mat4 ProjMtx; - -in vec3 Position; -in vec3 Normal; -in vec2 UV; -in vec4 Color; - -out vec2 Frag_UV; -out vec4 Frag_Color; - -void main() -{ - Frag_UV = UV; - Frag_Color = vec4(1,1,1,1); - Frag_Color = Color; - gl_Position = ProjMtx * vec4(Position.xy, 0, 1); -} \ No newline at end of file