mirror of
https://github.com/bloeys/nmage.git
synced 2025-12-29 13:28:20 +00:00
185 lines
4.1 KiB
Go
Executable File
185 lines
4.1 KiB
Go
Executable File
package main
|
|
|
|
import (
|
|
"github.com/bloeys/gglm/gglm"
|
|
"github.com/bloeys/go-sdl-engine/buffers"
|
|
"github.com/bloeys/go-sdl-engine/input"
|
|
"github.com/bloeys/go-sdl-engine/logging"
|
|
"github.com/bloeys/go-sdl-engine/res/models"
|
|
"github.com/bloeys/go-sdl-engine/shaders"
|
|
"github.com/go-gl/gl/v4.6-core/gl"
|
|
"github.com/veandco/go-sdl2/sdl"
|
|
)
|
|
|
|
const (
|
|
winWidth = 1280
|
|
winHeight = 720
|
|
)
|
|
|
|
var (
|
|
isRunning bool = true
|
|
window *sdl.Window
|
|
|
|
simpleShader shaders.ShaderProgram
|
|
bo *buffers.BufferObject
|
|
)
|
|
|
|
func main() {
|
|
|
|
err := sdl.Init(sdl.INIT_EVERYTHING)
|
|
if err != nil {
|
|
logging.ErrLog.Fatalln("Failed to init SDL. Err:", err)
|
|
}
|
|
|
|
window, err = sdl.CreateWindow("Go SDL Engine", sdl.WINDOWPOS_CENTERED, sdl.WINDOWPOS_CENTERED, winWidth, winHeight, sdl.WINDOW_OPENGL)
|
|
if err != nil {
|
|
logging.ErrLog.Fatalln("Failed to create window. Err: ", err)
|
|
}
|
|
defer window.Destroy()
|
|
|
|
glCtx, err := window.GLCreateContext()
|
|
if err != nil {
|
|
logging.ErrLog.Fatalln("Failed to create OpenGL context. Err: ", err)
|
|
}
|
|
defer sdl.GLDeleteContext(glCtx)
|
|
|
|
initOpenGL()
|
|
loadShaders()
|
|
loadBuffers()
|
|
|
|
simpleShader.SetAttribute("vertPos", bo, bo.VertPosBuf)
|
|
simpleShader.EnableAttribute("vertPos")
|
|
|
|
// simpleShader.SetAttribute("vertColor", bo, bo.ColorBuf)
|
|
// simpleShader.EnableAttribute("vertColor")
|
|
|
|
modelMat := gglm.NewTrMatId()
|
|
translationMat := gglm.NewTranslationMat(gglm.NewVec3(-0.5, 0, 0))
|
|
scaleMat := gglm.NewScaleMat(gglm.NewVec3(0.25, 0.25, 0.25))
|
|
rotMat := gglm.NewRotMat(gglm.NewQuatEuler(gglm.NewVec3(0, 0, 0).AsRad()))
|
|
|
|
modelMat.Mul(translationMat.Mul(rotMat.Mul(scaleMat)))
|
|
simpleShader.SetUnifMat4("modelMat", &modelMat.Mat4)
|
|
|
|
//Game loop
|
|
for isRunning {
|
|
|
|
handleInputs()
|
|
runGameLogic()
|
|
draw()
|
|
|
|
sdl.Delay(17)
|
|
}
|
|
}
|
|
|
|
func initOpenGL() {
|
|
|
|
if err := gl.Init(); err != nil {
|
|
logging.ErrLog.Fatalln(err)
|
|
}
|
|
|
|
sdl.GLSetAttribute(sdl.MAJOR_VERSION, 4)
|
|
sdl.GLSetAttribute(sdl.MINOR_VERSION, 6)
|
|
|
|
// 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_DOUBLEBUFFER, 1)
|
|
gl.ClearColor(0, 0, 0, 1)
|
|
|
|
sdl.GLSetAttribute(sdl.GL_CONTEXT_PROFILE_MASK, sdl.GL_CONTEXT_PROFILE_CORE)
|
|
}
|
|
|
|
func loadShaders() {
|
|
|
|
var err error
|
|
simpleShader, err = shaders.NewShaderProgram()
|
|
if err != nil {
|
|
logging.ErrLog.Fatalln("Failed to create new shader program. Err: ", err)
|
|
}
|
|
|
|
vertShader, err := shaders.LoadAndCompilerShader("./res/shaders/simple.vert.glsl", shaders.VertexShaderType)
|
|
if err != nil {
|
|
logging.ErrLog.Fatalln("Failed to create new shader. Err: ", err)
|
|
}
|
|
|
|
fragShader, err := shaders.LoadAndCompilerShader("./res/shaders/simple.frag.glsl", shaders.FragmentShaderType)
|
|
if err != nil {
|
|
logging.ErrLog.Fatalln("Failed to create new shader. Err: ", err)
|
|
}
|
|
|
|
simpleShader.AttachShader(vertShader)
|
|
simpleShader.AttachShader(fragShader)
|
|
simpleShader.Link()
|
|
}
|
|
|
|
func loadBuffers() {
|
|
|
|
vertices := []float32{
|
|
-0.5, 0.5, 0,
|
|
0.5, 0.5, 0,
|
|
0.5, -0.5, 0,
|
|
-0.5, -0.5, 0,
|
|
}
|
|
// colors := []float32{
|
|
// 1, 0, 0,
|
|
// 0, 0, 1,
|
|
// 0, 0, 1,
|
|
// 0, 0, 1,
|
|
// }
|
|
indices := []uint32{0, 1, 3, 1, 2, 3}
|
|
|
|
//Load obj
|
|
objInfo, err := models.LoadObj("./res/models/obj.obj")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
logging.InfoLog.Printf("%v", objInfo.TriIndices)
|
|
|
|
vertices = objInfo.VertPos
|
|
indices = objInfo.TriIndices
|
|
|
|
bo = buffers.NewBufferObject()
|
|
bo.GenBuffer(vertices, buffers.BufUsageStatic, buffers.BufTypeVertPos, buffers.DataTypeVec3)
|
|
// bo.GenBuffer(colors, buffers.BufUsageStatic, buffers.BufTypeColor, buffers.DataTypeVec3)
|
|
bo.GenBufferUint32(indices, buffers.BufUsageStatic, buffers.BufTypeIndex, buffers.DataTypeUint32)
|
|
}
|
|
|
|
func handleInputs() {
|
|
|
|
input.EventLoopStart()
|
|
|
|
for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
|
|
|
|
switch e := event.(type) {
|
|
|
|
case *sdl.KeyboardEvent:
|
|
input.HandleKeyboardEvent(e)
|
|
case *sdl.MouseButtonEvent:
|
|
input.HandleMouseEvent(e)
|
|
case *sdl.QuitEvent:
|
|
isRunning = false
|
|
}
|
|
}
|
|
}
|
|
|
|
func runGameLogic() {
|
|
|
|
}
|
|
|
|
func draw() {
|
|
|
|
gl.Clear(gl.COLOR_BUFFER_BIT)
|
|
|
|
simpleShader.Activate()
|
|
|
|
//DRAW
|
|
bo.Activate()
|
|
gl.DrawElements(gl.TRIANGLES, 36, gl.UNSIGNED_INT, gl.PtrOffset(0))
|
|
bo.Deactivate()
|
|
|
|
window.GLSwap()
|
|
}
|