Get rid of unneeded pointers+update todos

This commit is contained in:
bloeys
2024-05-01 01:16:33 +04:00
parent abd7079e61
commit d523c0951b
6 changed files with 72 additions and 70 deletions

View File

@ -59,9 +59,9 @@ func (c *Camera) UpdateRotation(pitch, yaw float32) {
c.Update() c.Update()
} }
func NewPerspective(pos, forward, worldUp *gglm.Vec3, nearClip, farClip, fovRadians, aspectRatio float32) *Camera { func NewPerspective(pos, forward, worldUp *gglm.Vec3, nearClip, farClip, fovRadians, aspectRatio float32) Camera {
cam := &Camera{ cam := Camera{
Type: Type_Perspective, Type: Type_Perspective,
Pos: *pos, Pos: *pos,
Forward: *forward, Forward: *forward,
@ -78,9 +78,9 @@ func NewPerspective(pos, forward, worldUp *gglm.Vec3, nearClip, farClip, fovRadi
return cam return cam
} }
func NewOrthographic(pos, forward, worldUp *gglm.Vec3, nearClip, farClip, left, right, top, bottom float32) *Camera { func NewOrthographic(pos, forward, worldUp *gglm.Vec3, nearClip, farClip, left, right, top, bottom float32) Camera {
cam := &Camera{ cam := Camera{
Type: Type_Orthographic, Type: Type_Orthographic,
Pos: *pos, Pos: *pos,
Forward: *forward, Forward: *forward,

View File

@ -167,42 +167,44 @@ func initSDL() error {
return nil return nil
} }
func CreateOpenGLWindow(title string, x, y, width, height int32, flags WindowFlags, rend renderer.Render) (*Window, error) { func CreateOpenGLWindow(title string, x, y, width, height int32, flags WindowFlags, rend renderer.Render) (Window, error) {
return createWindow(title, x, y, width, height, WindowFlags_OPENGL|flags, rend) return createWindow(title, x, y, width, height, WindowFlags_OPENGL|flags, rend)
} }
func CreateOpenGLWindowCentered(title string, width, height int32, flags WindowFlags, rend renderer.Render) (*Window, error) { func CreateOpenGLWindowCentered(title string, width, height int32, flags WindowFlags, rend renderer.Render) (Window, error) {
return createWindow(title, sdl.WINDOWPOS_CENTERED, sdl.WINDOWPOS_CENTERED, 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) { func createWindow(title string, x, y, width, height int32, flags WindowFlags, rend renderer.Render) (Window, error) {
assert.T(isInited, "engine.Init() was not called!") assert.T(isInited, "engine.Init() was not called!")
sdlWin, err := sdl.CreateWindow(title, x, y, width, height, uint32(flags)) win := Window{
if err != nil { SDLWin: nil,
return nil, err
}
win := &Window{
SDLWin: sdlWin,
EventCallbacks: make([]func(sdl.Event), 0), EventCallbacks: make([]func(sdl.Event), 0),
Rend: rend, Rend: rend,
} }
win.GlCtx, err = sdlWin.GLCreateContext() var err error
win.SDLWin, err = sdl.CreateWindow(title, x, y, width, height, uint32(flags))
if err != nil { if err != nil {
return nil, err return win, err
}
win.GlCtx, err = win.SDLWin.GLCreateContext()
if err != nil {
return win, err
} }
err = initOpenGL() err = initOpenGL()
if err != nil { if err != nil {
return nil, err return win, err
} }
// Get rid of the blinding white startup screen (unfortunately there is still one frame of white) // Get rid of the blinding white startup screen (unfortunately there is still one frame of white)
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT) gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT)
sdlWin.GLSwap() win.SDLWin.GLSwap()
return win, err return win, err
} }

84
main.go
View File

@ -33,19 +33,19 @@ import (
- Directional light shadows ✅ - Directional light shadows ✅
- Point light shadows ✅ - Point light shadows ✅
- Spotlight shadows ✅ - Spotlight shadows ✅
- Create VAO struct independent from VBO to support multi-VBO use cases (e.g. instancing) ✅
- UBO support - UBO support
- HDR - HDR
- Cascaded shadow mapping - Cascaded shadow mapping
- Skeletal animations - Skeletal animations
- In some cases we DO want input even when captured by UI. We need two systems within input package, one filtered and one not - In some cases we DO want input even when captured by UI. We need two systems within input package, one filtered and one not
- Proper model loading (i.e. load model by reading all its meshes, textures, and so on together) - Proper model loading (i.e. load model by reading all its meshes, textures, and so on together)
- Create VAO struct independent from VBO to support multi-VBO use cases (e.g. instancing) ✅
- Renderer batching - Renderer batching
- Scene graph - Scene graph
- Separate engine loop from rendering loop? or leave it to the user? - Separate engine loop from rendering loop? or leave it to the user?
- Abstract keys enum away from sdl - Abstract keys enum away from sdl?
- Proper Asset loading
- Frustum culling - Frustum culling
- Proper Asset loading system
- Material system editor with fields automatically extracted from the shader - Material system editor with fields automatically extracted from the shader
*/ */
@ -169,11 +169,11 @@ const (
) )
var ( var (
window *engine.Window window engine.Window
pitch float32 = 0 pitch float32 = 0
yaw float32 = -1.5 yaw float32 = -1.5
cam *camera.Camera cam camera.Camera
// Demo fbo // Demo fbo
renderToDemoFbo = false renderToDemoFbo = false
@ -195,22 +195,22 @@ var (
spotLightDepthMapFbo buffers.Framebuffer spotLightDepthMapFbo buffers.Framebuffer
screenQuadVao buffers.VertexArray screenQuadVao buffers.VertexArray
screenQuadMat *materials.Material screenQuadMat materials.Material
unlitMat *materials.Material unlitMat materials.Material
whiteMat *materials.Material whiteMat materials.Material
containerMat *materials.Material containerMat materials.Material
palleteMat *materials.Material palleteMat materials.Material
skyboxMat *materials.Material skyboxMat materials.Material
depthMapMat *materials.Material depthMapMat materials.Material
arrayDepthMapMat *materials.Material arrayDepthMapMat materials.Material
omnidirDepthMapMat *materials.Material omnidirDepthMapMat materials.Material
debugDepthMat *materials.Material debugDepthMat materials.Material
cubeMesh *meshes.Mesh cubeMesh meshes.Mesh
sphereMesh *meshes.Mesh sphereMesh meshes.Mesh
chairMesh *meshes.Mesh chairMesh meshes.Mesh
skyboxMesh *meshes.Mesh skyboxMesh meshes.Mesh
cubeModelMat = gglm.NewTrMatId() cubeModelMat = gglm.NewTrMatId()
@ -314,14 +314,14 @@ func main() {
engine.SetSrgbFramebuffer(true) engine.SetSrgbFramebuffer(true)
game := &Game{ game := &Game{
Win: window, Win: &window,
WinWidth: int32(unscaledWindowWidth * dpiScaling), WinWidth: int32(unscaledWindowWidth * dpiScaling),
WinHeight: int32(unscaledWindowHeight * dpiScaling), WinHeight: int32(unscaledWindowHeight * dpiScaling),
ImGUIInfo: nmageimgui.NewImGui("./res/shaders/imgui.glsl"), ImGUIInfo: nmageimgui.NewImGui("./res/shaders/imgui.glsl"),
} }
window.EventCallbacks = append(window.EventCallbacks, game.handleWindowEvents) window.EventCallbacks = append(window.EventCallbacks, game.handleWindowEvents)
engine.Run(game, window, game.ImGUIInfo) engine.Run(game, &window, game.ImGUIInfo)
} }
func (g *Game) handleWindowEvents(e sdl.Event) { func (g *Game) handleWindowEvents(e sdl.Event) {
@ -995,7 +995,7 @@ func (g *Game) Render() {
if renderToBackBuffer { if renderToBackBuffer {
if renderDepthBuffer { if renderDepthBuffer {
g.RenderScene(debugDepthMat) g.RenderScene(&debugDepthMat)
} else { } else {
g.RenderScene(nil) g.RenderScene(nil)
} }
@ -1031,7 +1031,7 @@ func (g *Game) renderDirectionalLightShadowmap() {
// //
// Some note that this is too troublesome and fails in many cases. Might be better to remove. // Some note that this is too troublesome and fails in many cases. Might be better to remove.
gl.CullFace(gl.FRONT) gl.CullFace(gl.FRONT)
g.RenderScene(depthMapMat) g.RenderScene(&depthMapMat)
gl.CullFace(gl.BACK) gl.CullFace(gl.BACK)
dirLightDepthMapFbo.UnBindWithViewport(uint32(g.WinWidth), uint32(g.WinHeight)) dirLightDepthMapFbo.UnBindWithViewport(uint32(g.WinWidth), uint32(g.WinHeight))
@ -1041,7 +1041,7 @@ func (g *Game) renderDirectionalLightShadowmap() {
screenQuadMat.SetUnifVec2("offset", dirLightDepthMapFboOffset) screenQuadMat.SetUnifVec2("offset", dirLightDepthMapFboOffset)
screenQuadMat.SetUnifVec2("scale", dirLightDepthMapFboScale) screenQuadMat.SetUnifVec2("scale", dirLightDepthMapFboScale)
screenQuadMat.Bind() screenQuadMat.Bind()
window.Rend.DrawVertexArray(screenQuadMat, &screenQuadVao, 0, 6) window.Rend.DrawVertexArray(&screenQuadMat, &screenQuadVao, 0, 6)
} }
} }
@ -1070,7 +1070,7 @@ func (g *Game) renderSpotLightShadowmaps() {
// Front culling created issues // Front culling created issues
// gl.CullFace(gl.FRONT) // gl.CullFace(gl.FRONT)
g.RenderScene(arrayDepthMapMat) g.RenderScene(&arrayDepthMapMat)
// gl.CullFace(gl.BACK) // gl.CullFace(gl.BACK)
spotLightDepthMapFbo.UnBindWithViewport(uint32(g.WinWidth), uint32(g.WinHeight)) spotLightDepthMapFbo.UnBindWithViewport(uint32(g.WinWidth), uint32(g.WinHeight))
@ -1096,7 +1096,7 @@ func (g *Game) renderPointLightShadowmaps() {
omnidirDepthMapMat.SetUnifMat4("cubemapProjViewMats["+strconv.Itoa(j)+"]", &projViewMats[j]) omnidirDepthMapMat.SetUnifMat4("cubemapProjViewMats["+strconv.Itoa(j)+"]", &projViewMats[j])
} }
g.RenderScene(omnidirDepthMapMat) g.RenderScene(&omnidirDepthMapMat)
} }
pointLightDepthMapFbo.UnBindWithViewport(uint32(g.WinWidth), uint32(g.WinHeight)) pointLightDepthMapFbo.UnBindWithViewport(uint32(g.WinWidth), uint32(g.WinHeight))
@ -1108,7 +1108,7 @@ func (g *Game) renderDemoFob() {
demoFbo.Clear() demoFbo.Clear()
if renderDepthBuffer { if renderDepthBuffer {
g.RenderScene(debugDepthMat) g.RenderScene(&debugDepthMat)
} else { } else {
g.RenderScene(nil) g.RenderScene(nil)
} }
@ -1123,7 +1123,7 @@ func (g *Game) renderDemoFob() {
screenQuadMat.SetUnifVec2("offset", demoFboOffset) screenQuadMat.SetUnifVec2("offset", demoFboOffset)
screenQuadMat.SetUnifVec2("scale", demoFboScale) screenQuadMat.SetUnifVec2("scale", demoFboScale)
window.Rend.DrawVertexArray(screenQuadMat, &screenQuadVao, 0, 6) window.Rend.DrawVertexArray(&screenQuadMat, &screenQuadVao, 0, 6)
} }
func (g *Game) RenderScene(overrideMat *materials.Material) { func (g *Game) RenderScene(overrideMat *materials.Material) {
@ -1131,9 +1131,9 @@ func (g *Game) RenderScene(overrideMat *materials.Material) {
tempModelMatrix := cubeModelMat.Clone() tempModelMatrix := cubeModelMat.Clone()
// See if we need overrides // See if we need overrides
sunMat := palleteMat sunMat := &palleteMat
chairMat := palleteMat chairMat := &palleteMat
cubeMat := containerMat cubeMat := &containerMat
if overrideMat != nil { if overrideMat != nil {
sunMat = overrideMat sunMat = overrideMat
@ -1142,32 +1142,32 @@ func (g *Game) RenderScene(overrideMat *materials.Material) {
} }
// Draw dir light // Draw dir light
window.Rend.DrawMesh(sphereMesh, gglm.NewTrMatId().Translate(gglm.NewVec3(0, 10, 0)).Scale(gglm.NewVec3(0.1, 0.1, 0.1)), sunMat) window.Rend.DrawMesh(&sphereMesh, gglm.NewTrMatId().Translate(gglm.NewVec3(0, 10, 0)).Scale(gglm.NewVec3(0.1, 0.1, 0.1)), sunMat)
// Draw point lights // Draw point lights
for i := 0; i < len(pointLights); i++ { for i := 0; i < len(pointLights); i++ {
pl := &pointLights[i] pl := &pointLights[i]
window.Rend.DrawMesh(cubeMesh, gglm.NewTrMatId().Translate(&pl.Pos).Scale(gglm.NewVec3(0.1, 0.1, 0.1)), sunMat) window.Rend.DrawMesh(&cubeMesh, gglm.NewTrMatId().Translate(&pl.Pos).Scale(gglm.NewVec3(0.1, 0.1, 0.1)), sunMat)
} }
// Chair // Chair
window.Rend.DrawMesh(chairMesh, tempModelMatrix, chairMat) window.Rend.DrawMesh(&chairMesh, tempModelMatrix, chairMat)
// Ground // Ground
window.Rend.DrawMesh(cubeMesh, gglm.NewTrMatId().Translate(gglm.NewVec3(0, -3, 0)).Scale(gglm.NewVec3(20, 1, 20)), cubeMat) window.Rend.DrawMesh(&cubeMesh, gglm.NewTrMatId().Translate(gglm.NewVec3(0, -3, 0)).Scale(gglm.NewVec3(20, 1, 20)), cubeMat)
// Cubes // Cubes
tempModelMatrix.Translate(gglm.NewVec3(-6, 0, 0)) tempModelMatrix.Translate(gglm.NewVec3(-6, 0, 0))
window.Rend.DrawMesh(cubeMesh, tempModelMatrix, cubeMat) window.Rend.DrawMesh(&cubeMesh, tempModelMatrix, cubeMat)
tempModelMatrix.Translate(gglm.NewVec3(0, -1, -4)) tempModelMatrix.Translate(gglm.NewVec3(0, -1, -4))
window.Rend.DrawMesh(cubeMesh, tempModelMatrix, cubeMat) window.Rend.DrawMesh(&cubeMesh, tempModelMatrix, cubeMat)
// Rotating cubes // Rotating cubes
window.Rend.DrawMesh(cubeMesh, &rotatingCubeTrMat1, cubeMat) window.Rend.DrawMesh(&cubeMesh, &rotatingCubeTrMat1, cubeMat)
window.Rend.DrawMesh(cubeMesh, &rotatingCubeTrMat2, cubeMat) window.Rend.DrawMesh(&cubeMesh, &rotatingCubeTrMat2, cubeMat)
window.Rend.DrawMesh(cubeMesh, &rotatingCubeTrMat3, cubeMat) window.Rend.DrawMesh(&cubeMesh, &rotatingCubeTrMat3, cubeMat)
// Cubes generator // Cubes generator
// rowSize := 1 // rowSize := 1
@ -1185,7 +1185,7 @@ func (g *Game) DrawSkybox() {
gl.Disable(gl.CULL_FACE) gl.Disable(gl.CULL_FACE)
gl.DepthFunc(gl.LEQUAL) gl.DepthFunc(gl.LEQUAL)
window.Rend.DrawCubemap(skyboxMesh, skyboxMat) window.Rend.DrawCubemap(&skyboxMesh, &skyboxMat)
gl.DepthFunc(gl.LESS) gl.DepthFunc(gl.LESS)
gl.Enable(gl.CULL_FACE) gl.Enable(gl.CULL_FACE)

View File

@ -166,22 +166,22 @@ func (m *Material) Delete() {
gl.DeleteProgram(m.ShaderProg.Id) gl.DeleteProgram(m.ShaderProg.Id)
} }
func NewMaterial(matName, shaderPath string) *Material { func NewMaterial(matName, shaderPath string) Material {
shdrProg, err := shaders.LoadAndCompileCombinedShader(shaderPath) shdrProg, err := shaders.LoadAndCompileCombinedShader(shaderPath)
if err != nil { if err != nil {
logging.ErrLog.Fatalf("Failed to create new material '%s'. Err: %s\n", matName, err.Error()) logging.ErrLog.Fatalf("Failed to create new material '%s'. Err: %s\n", matName, err.Error())
} }
return &Material{Name: matName, ShaderProg: shdrProg, UnifLocs: make(map[string]int32), AttribLocs: make(map[string]int32)} return Material{Name: matName, ShaderProg: shdrProg, UnifLocs: make(map[string]int32), AttribLocs: make(map[string]int32)}
} }
func NewMaterialSrc(matName string, shaderSrc []byte) *Material { func NewMaterialSrc(matName string, shaderSrc []byte) Material {
shdrProg, err := shaders.LoadAndCompileCombinedShaderSrc(shaderSrc) shdrProg, err := shaders.LoadAndCompileCombinedShaderSrc(shaderSrc)
if err != nil { if err != nil {
logging.ErrLog.Fatalf("Failed to create new material '%s'. Err: %s\n", matName, err.Error()) logging.ErrLog.Fatalf("Failed to create new material '%s'. Err: %s\n", matName, err.Error())
} }
return &Material{Name: matName, ShaderProg: shdrProg, UnifLocs: make(map[string]int32), AttribLocs: make(map[string]int32)} return Material{Name: matName, ShaderProg: shdrProg, UnifLocs: make(map[string]int32), AttribLocs: make(map[string]int32)}
} }

View File

@ -21,19 +21,19 @@ type Mesh struct {
SubMeshes []SubMesh SubMeshes []SubMesh
} }
func NewMesh(name, modelPath string, postProcessFlags asig.PostProcess) (*Mesh, error) { func NewMesh(name, modelPath string, postProcessFlags asig.PostProcess) (Mesh, error) {
scene, release, err := asig.ImportFile(modelPath, asig.PostProcessTriangulate|postProcessFlags) scene, release, err := asig.ImportFile(modelPath, asig.PostProcessTriangulate|postProcessFlags)
if err != nil { if err != nil {
return nil, errors.New("Failed to load model. Err: " + err.Error()) return Mesh{}, errors.New("Failed to load model. Err: " + err.Error())
} }
defer release() defer release()
if len(scene.Meshes) == 0 { if len(scene.Meshes) == 0 {
return nil, errors.New("No meshes found in file: " + modelPath) return Mesh{}, errors.New("No meshes found in file: " + modelPath)
} }
mesh := &Mesh{ mesh := Mesh{
Name: name, Name: name,
Vao: buffers.NewVertexArray(), Vao: buffers.NewVertexArray(),
SubMeshes: make([]SubMesh, 0, 1), SubMeshes: make([]SubMesh, 0, 1),

View File

@ -12,7 +12,7 @@ import (
type ImguiInfo struct { type ImguiInfo struct {
ImCtx imgui.Context ImCtx imgui.Context
Mat *materials.Material Mat materials.Material
VaoID uint32 VaoID uint32
VboID uint32 VboID uint32
IndexBufID uint32 IndexBufID uint32
@ -204,7 +204,7 @@ void main()
// If the path is empty a default nMage shader is used // If the path is empty a default nMage shader is used
func NewImGui(shaderPath string) ImguiInfo { func NewImGui(shaderPath string) ImguiInfo {
var imguiMat *materials.Material var imguiMat materials.Material
if shaderPath == "" { if shaderPath == "" {
imguiMat = materials.NewMaterialSrc("ImGUI Mat", []byte(DefaultImguiShader)) imguiMat = materials.NewMaterialSrc("ImGUI Mat", []byte(DefaultImguiShader))
} else { } else {