Pulled out window stuff into GameWindow

main
Sean Hickey 2021-08-28 14:11:51 -07:00
parent 8fb02993f4
commit 0ed95e851b
3 changed files with 135 additions and 78 deletions

98
main.go
View File

@ -14,15 +14,12 @@ import (
"gitea.wisellama.rocks/carpy-breakout/pkg/gl_helpers"
"gitea.wisellama.rocks/carpy-breakout/pkg/gl_objects"
"gitea.wisellama.rocks/carpy-breakout/pkg/game_window"
)
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
const GameTitle = "Carpy Breakout"
const DefaultWindowWidth int32 = 800
const DefaultWindowHeight int32 = 600
const DefaultWindowFlags uint32 = sdl.WINDOW_SHOWN | sdl.WINDOW_RESIZABLE | sdl.WINDOW_OPENGL
const FullscreenWindowFlags uint32 = DefaultWindowFlags | sdl.WINDOW_FULLSCREEN_DESKTOP
const LogFile = "output.log"
func main() {
@ -47,7 +44,7 @@ func run() {
err := sdl.Init(sdl.INIT_EVERYTHING)
if err != nil {
panic(err)
log.Fatal(err)
}
defer sdl.Quit()
@ -59,52 +56,27 @@ func run() {
//sdl.GLSetAttribute(sdl.GL_MULTISAMPLESAMPLES, 4) // Smooth
window, err := sdl.CreateWindow(
GameTitle,
sdl.WINDOWPOS_UNDEFINED,
sdl.WINDOWPOS_UNDEFINED,
DefaultWindowWidth,
DefaultWindowHeight,
DefaultWindowFlags)
if err != nil {
panic(err)
}
defer window.Destroy()
context, err := window.GLCreateContext()
if err != nil {
panic(err)
}
defer sdl.GLDeleteContext(context)
// Capture the mouse for movement
sdl.SetRelativeMouseMode(true)
width, height := window.GetSize()
gl.Init()
version := gl.GoStr(gl.GetString(gl.VERSION))
log.Println("OpenGL version", version)
gl.Viewport(0, 0, width, height)
gl.ClearColor(0.0, 0.0, 0.0, 1.0)
program, err := gl_helpers.NewProgram(vertexShader, fragmentShader)
gameWindow, err := game_window.NewGameWindow(GameTitle)
if err != nil {
panic(err)
log.Fatal(err)
}
gl.UseProgram(program)
projection := mgl32.Perspective(mgl32.DegToRad(45.0), float32(width)/float32(height), 0.01, 1000.0)
projectionUniform := gl.GetUniformLocation(program, gl.Str("projection\x00"))
gl.UniformMatrix4fv(projectionUniform, 1, false, &projection[0])
defer gameWindow.Destroy()
camera := gl_objects.NewCamera()
camera.Position = mgl32.Vec3{0, 0, 10}
camera.Draw(program)
camera.Draw(gameWindow.GLProgram)
modelUniform := gl.GetUniformLocation(program, gl.Str("model\x00"))
modelUniform := gl.GetUniformLocation(gameWindow.GLProgram, gl.Str("model\x00"))
//gl.BindFragDataLocation(program, 0, gl.Str("outputColor\x00"))
//gl.BindFragDataLocation(gameWindow.GLProgram, 0, gl.Str("outputColor\x00"))
texture, err := gl_helpers.NewTexture("square.png")
if err != nil {
@ -120,11 +92,11 @@ func run() {
gl.BindBuffer(gl.ARRAY_BUFFER, vbo)
gl.BufferData(gl.ARRAY_BUFFER, len(cubeVertices)*4, gl.Ptr(cubeVertices), gl.STATIC_DRAW)
vertAttrib := uint32(gl.GetAttribLocation(program, gl.Str("vert\x00")))
vertAttrib := uint32(gl.GetAttribLocation(gameWindow.GLProgram, gl.Str("vert\x00")))
gl.EnableVertexAttribArray(vertAttrib)
gl.VertexAttribPointerWithOffset(vertAttrib, 3, gl.FLOAT, false, 5*4, 0)
texCoordAttrib := uint32(gl.GetAttribLocation(program, gl.Str("vertTexCoord\x00")))
texCoordAttrib := uint32(gl.GetAttribLocation(gameWindow.GLProgram, gl.Str("vertTexCoord\x00")))
gl.EnableVertexAttribArray(texCoordAttrib)
gl.VertexAttribPointerWithOffset(texCoordAttrib, 2, gl.FLOAT, false, 5*4, 3*4)
@ -146,7 +118,7 @@ func run() {
move += 0.01
camera.Update()
camera.Draw(program)
camera.Draw(gameWindow.GLProgram)
angle += 0.00
model = mgl32.HomogRotate3D(angle, mgl32.Vec3{0, 1, 0})
@ -160,9 +132,9 @@ func run() {
gl.DrawArrays(gl.TRIANGLES, 0, 6 * 2 * 3) // 6 sides, 2 triangles, 3 points each
window.GLSwap()
gameWindow.SDLWindow.GLSwap()
running = handleEvents(running, window, &camera)
running = handleEvents(running, gameWindow, &camera)
sdl.Delay(16)
}
}
@ -188,15 +160,17 @@ func drawSDLRenderer(renderer *sdl.Renderer) {
renderer.Present()
}
func handleEvents(running bool, window *sdl.Window, camera *gl_objects.Camera) bool {
func handleEvents(running bool, gameWindow *game_window.GameWindow, camera *gl_objects.Camera) bool {
for event := sdl.PollEvent(); event != nil; event = sdl.PollEvent() {
switch t := event.(type) {
case *sdl.WindowEvent:
gameWindow.WindowProjection()
case *sdl.QuitEvent:
fmt.Printf("Quit")
log.Println("Quiting")
running = false
case *sdl.MouseMotionEvent:
fmt.Printf("[%d ms] MouseMotion\ttype:%d\tid:%d\tx:%d\ty:%d\txrel:%d\tyrel:%d\n",
t.Timestamp, t.Type, t.Which, t.X, t.Y, t.XRel, t.YRel)
if t.XRel != 0 || t.YRel != 0 {
camera.Rotate(t.XRel, t.YRel)
}
@ -208,14 +182,13 @@ func handleEvents(running bool, window *sdl.Window, camera *gl_objects.Camera) b
t.Timestamp, t.Type, t.Which, t.X, t.Y)
case *sdl.KeyboardEvent:
if t.Keysym.Sym == sdl.K_ESCAPE {
fmt.Print("Esc quitting\n")
log.Println("Esc quitting")
running = false
}
if t.Keysym.Sym == sdl.K_f {
window.SetFullscreen(FullscreenWindowFlags)
}
if t.Keysym.Sym == sdl.K_g {
window.SetFullscreen(DefaultWindowFlags)
if t.Type == sdl.KEYDOWN {
gameWindow.ToggleFullscreen()
}
}
if t.Keysym.Sym == sdl.K_w {
if t.Type == sdl.KEYDOWN {
@ -329,26 +302,3 @@ var cubeVertices = []float32{
1.0, 1.0, 1.0, 0.0, 1.0,
}
var vertexShader = `
#version 330
uniform mat4 projection;
uniform mat4 camera;
uniform mat4 model;
in vec3 vert;
in vec2 vertTexCoord;
out vec2 fragTexCoord;
void main() {
fragTexCoord = vertTexCoord;
gl_Position = projection * camera * model * vec4(vert, 1);
}
` + "\x00"
var fragmentShader = `
#version 330
uniform sampler2D tex;
in vec2 fragTexCoord;
out vec4 outputColor;
void main() {
outputColor = texture(tex, fragTexCoord);
}
` + "\x00"

View File

@ -0,0 +1,110 @@
package game_window
import (
"log"
"github.com/veandco/go-sdl2/sdl"
gl "github.com/go-gl/gl/v3.1/gles2"
"github.com/go-gl/mathgl/mgl32"
"gitea.wisellama.rocks/carpy-breakout/pkg/gl_helpers"
)
const DefaultWindowWidth int32 = 800
const DefaultWindowHeight int32 = 600
const DefaultWindowFlags uint32 = sdl.WINDOW_SHOWN | sdl.WINDOW_RESIZABLE | sdl.WINDOW_OPENGL
const FullscreenWindowFlags uint32 = DefaultWindowFlags | sdl.WINDOW_FULLSCREEN_DESKTOP
type GameWindow struct {
SDLWindow *sdl.Window
GLContext *sdl.GLContext
GLProgram uint32
fullscreen bool
}
func NewGameWindow(title string) (*GameWindow, error) {
gameWindow := GameWindow{}
window, err := sdl.CreateWindow(
title,
sdl.WINDOWPOS_UNDEFINED,
sdl.WINDOWPOS_UNDEFINED,
DefaultWindowWidth,
DefaultWindowHeight,
DefaultWindowFlags)
if err != nil {
log.Println("Failed creating SDL window")
return nil, err
}
context, err := window.GLCreateContext()
if err != nil {
log.Println("Failed Creating GL context.")
return nil, err
}
gameWindow.GLContext = &context
program, err := gl_helpers.NewProgram(vertexShader, fragmentShader)
if err != nil {
panic(err)
}
gl.UseProgram(program)
gameWindow.SDLWindow = window
gameWindow.GLProgram = program
gameWindow.fullscreen = false
gameWindow.WindowProjection()
return &gameWindow, err
}
func (w *GameWindow) Destroy() {
w.SDLWindow.Destroy()
sdl.GLDeleteContext(*w.GLContext)
}
func (w *GameWindow) ToggleFullscreen() {
if w.fullscreen {
w.SDLWindow.SetFullscreen(DefaultWindowFlags)
w.fullscreen = false
} else {
w.SDLWindow.SetFullscreen(FullscreenWindowFlags)
w.fullscreen = true
}
return
}
func (w *GameWindow) WindowProjection() {
width, height := w.SDLWindow.GLGetDrawableSize()
projection := mgl32.Perspective(mgl32.DegToRad(45.0), float32(width)/float32(height), 0.01, 1000.0)
projectionUniform := gl.GetUniformLocation(w.GLProgram, gl.Str("projection\x00"))
gl.UniformMatrix4fv(projectionUniform, 1, false, &projection[0])
gl.Viewport(0, 0, width, height)
}
var vertexShader = `
#version 330
uniform mat4 projection;
uniform mat4 camera;
uniform mat4 model;
in vec3 vert;
in vec2 vertTexCoord;
out vec2 fragTexCoord;
void main() {
fragTexCoord = vertTexCoord;
gl_Position = projection * camera * model * vec4(vert, 1);
}
` + "\x00"
var fragmentShader = `
#version 330
uniform sampler2D tex;
in vec2 fragTexCoord;
out vec4 outputColor;
void main() {
outputColor = texture(tex, fragTexCoord);
}
` + "\x00"

View File

@ -1,8 +1,6 @@
package gl_objects
import (
"log"
gl "github.com/go-gl/gl/v3.1/gles2"
"github.com/go-gl/mathgl/mgl32"
)
@ -35,7 +33,7 @@ func NewCamera() (Camera) {
camera.OriginalDirection = mgl32.Vec3{0, 0, -1}
camera.MoveStep = 0.1
camera.RotateStep = 0.02
camera.MouseSensitivity = 0.01
camera.MouseSensitivity = 0.02
return camera
}
@ -102,7 +100,6 @@ func (c *Camera) Move(vec mgl32.Vec3) {
relativeMove = relativeMove.Add(relativeX)
relativeMove = relativeMove.Add(relativeY)
relativeMove = relativeMove.Add(relativeZ)
log.Printf("relativeMove = %v, vec = %v", relativeMove.Len(), vec.Len())
c.Position = c.Position.Add(relativeMove)
}