// vim: shiftwidth=4 tabstop=4 noexpandtab package main import ( "log" "github.com/go-gl/glfw/v3.3/glfw" "github.com/go-gl/mathgl/mgl32" ) const ( WINDOW_WIDTH = 500 WINDOW_HEIGHT = 500 WINDOW_TITLE = "stlscope" ) // App contains data about the OpenGL application including for example the // window, OpenGL graphics and the current STL model. type App struct { window *glfw.Window graphics *Graphics stl *StlModel homeTrafo mgl32.Mat4 } // newApp creates a new App struct based on a given STL model. func newApp(stl *StlModel) App { var app App = App{} app.stl = stl var err error log.Println("GLFW init") if err := glfw.Init(); err != nil { panic(err) } glfw.WindowHint(glfw.Resizable, glfw.False) glfw.WindowHint(glfw.ContextVersionMajor, 4) glfw.WindowHint(glfw.ContextVersionMinor, 6) glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) glfw.WindowHint(glfw.Samples, 16) // anti-aliasing log.Println("Creating Window") app.window, err = glfw.CreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_TITLE, nil, nil) if err != nil { panic(err) } app.window.MakeContextCurrent() app.homeTrafo = stl.surface.getHomeView() return app } // handle has to be called frequently to let the App work. func (application *App) handle() { glfw.PollEvents() application.window.SwapBuffers() // generate and set transformation trafo := application.homeTrafo trafo = mgl32.HomogRotate3D( float32(glfw.GetTime()) * 0.4 * 6.282, mgl32.Vec3{0.1, 1, 0}).Mul4(trafo) // apply time-based rotation application.graphics.setTrafo(trafo) } // terminate closes the App. func (application *App) terminate() { glfw.Terminate() }