Pulled out window stuff into GameWindow
parent
8fb02993f4
commit
0ed95e851b
98
main.go
98
main.go
|
@ -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"
|
||||
|
|
|
@ -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"
|
|
@ -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)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue