// initGL initializes GLFW and OpenGL. func initGL() error { err := glfw.Init() if err != nil { return err } err = glfw.OpenWindow(640, 480, 8, 8, 8, 8, 0, 0, glfw.Windowed) if err != nil { glfw.Terminate() return err } glfw.SetWindowTitle("go-gl/gltext: Bitmap font example") glfw.SetSwapInterval(1) glfw.SetWindowSizeCallback(onResize) glfw.SetKeyCallback(onKey) errno := gl.Init() if errno != gl.NO_ERROR { str, err := glu.ErrorString(errno) if err != nil { return fmt.Errorf("Unknown openGL error: %d", errno) } return fmt.Errorf(str) } gl.Disable(gl.DEPTH_TEST) gl.Disable(gl.LIGHTING) gl.ClearColor(0.2, 0.2, 0.23, 0.0) return nil }
func (i *IO) Init(title string, screenSize int, onCloseHandler func()) error { i.KeyHandler = new(KeyHandler) i.Display = new(Display) i.ScreenOutputChannel = make(chan *types.Screen) i.AudioOutputChannel = make(chan int) if err := glfw.Init(); err != nil { return err } else if err = i.Display.init(title, screenSize); err != nil { return err } i.KeyHandler.Init(DefaultControlScheme) //TODO: allow user to define controlscheme glfw.SetKeyCallback(func(key, state int) { if state == glfw.KeyPress { i.KeyHandler.KeyDown(key) } else { i.KeyHandler.KeyUp(key) } }) glfw.SetWindowCloseCallback(func() int { glfw.CloseWindow() glfw.Terminate() onCloseHandler() return 0 }) return nil }
// initGL initializes GLFW and OpenGL. func initGL() error { err := glfw.Init() if err != nil { return err } err = glfw.OpenWindow(AtlasSize, AtlasSize, 8, 8, 8, 8, 0, 0, glfw.Windowed) if err != nil { glfw.Terminate() return err } glfw.SetWindowTitle("Texture atlas example") glfw.SetSwapInterval(1) glfw.SetWindowSizeCallback(onResize) glfw.SetKeyCallback(onKey) gl.Init() if err = glh.CheckGLError(); err != nil { return err } gl.Disable(gl.DEPTH_TEST) gl.Disable(gl.LIGHTING) gl.Enable(gl.TEXTURE_2D) gl.Enable(gl.BLEND) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) gl.ClearColor(0.2, 0.2, 0.23, 1.0) return nil }
// initGL initializes GLFW and OpenGL. func initGL() error { err := glfw.Init() if err != nil { return err } glfw.OpenWindowHint(glfw.FsaaSamples, 4) err = glfw.OpenWindow(512, 512, 8, 8, 8, 8, 0, 0, glfw.Windowed) if err != nil { glfw.Terminate() return err } glfw.SetWindowTitle("Meshbuffer 2D example") glfw.SetSwapInterval(1) glfw.SetWindowSizeCallback(onResize) glfw.SetKeyCallback(onKey) gl.Init() if err = glh.CheckGLError(); err != nil { return err } gl.Disable(gl.DEPTH_TEST) gl.Enable(gl.MULTISAMPLE) gl.Disable(gl.LIGHTING) gl.Enable(gl.COLOR_MATERIAL) gl.ClearColor(0.2, 0.2, 0.23, 1.0) return nil }
func (i *IO) Init(title string, screenSize int, onCloseHandler func()) error { var err error err = glfw.Init() if err != nil { return err } err = i.Display.init(title, screenSize) if err != nil { return err } i.KeyHandler.Init(DefaultControlScheme) //TODO: allow user to define controlscheme glfw.SetKeyCallback(func(key, state int) { if state == glfw.KeyPress { i.KeyHandler.KeyDown(key) } else { i.KeyHandler.KeyUp(key) } }) glfw.SetWindowCloseCallback(func() int { glfw.CloseWindow() glfw.Terminate() onCloseHandler() return 0 }) return nil }
func KeyChan() chan DigiState { out := make(chan DigiState) glfw.SetKeyCallback(func(key, state int) { go func() { out <- DigiState{key, state} }() }) return out }
func main() { var err error if err = glfw.Init(); err != nil { ///初始化环境 log.Fatalf("%v\n", err) return } defer glfw.Terminate() /// 销毁环境 if err = glfw.OpenWindow(Width, Height, 8, 8, 8, 8, 0, 8, glfw.Windowed); err != nil { ///创建窗口 log.Fatalf("%v\n", err) return } defer glfw.CloseWindow() /// 销毁窗口 glfw.SetSwapInterval(1) glfw.SetWindowTitle(Title) ///设置标题 glfw.SetWindowSizeCallback(onResize) /// 回调窗口变化 glfw.SetKeyCallback(onKey) ///回调按键 initGL() running = true for running && glfw.WindowParam(glfw.Opened) == 1 { drawScene() } }
func main() { var err error if err = glfw.Init(); err != nil { log.Fatalf("%v\n", err) return } defer glfw.Terminate() if err = glfw.OpenWindow(Width, Height, 8, 8, 8, 8, 0, 8, glfw.Windowed); err != nil { log.Fatalf("%v\n", err) return } defer glfw.CloseWindow() glfw.SetSwapInterval(1) glfw.SetWindowTitle(Title) glfw.SetWindowSizeCallback(onResize) glfw.SetKeyCallback(onKey) if err = initGL(); err != nil { log.Fatalf("%v\n", err) return } defer destroyGL() running = true for running && glfw.WindowParam(glfw.Opened) == 1 { drawScene() } }
func Init() { runtime.LockOSThread() // Initialize GLFW var err error if err = glfw.Init(); err != nil { log.Fatalf("%v\n", err) return } err = glfw.OpenWindow(SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 0, 0, 0, 0, glfw.Windowed) if err != nil { log.Fatalf("%v\n", err) return } glfw.SetWindowTitle("Mandelbrot") glfw.SetSwapInterval(1) glfw.SetWindowSizeCallback(onResize) glfw.SetWindowCloseCallback(onClose) glfw.SetMouseButtonCallback(onMouseBtn) glfw.SetMouseWheelCallback(onMouseWheel) glfw.SetKeyCallback(onKey) glfw.SetCharCallback(onChar) // Initialize OpenGL gl.Disable(gl.DEPTH_TEST) gl.ClearColor(0, 0, 0, 0) }
func main() { var err error if err = glfw.Init(); err != nil { log.Fatalf("%v\n", err) return } defer glfw.Terminate() if err = glfw.OpenWindow(640, 480, 8, 8, 8, 8, 0, 0, glfw.Windowed); err != nil { log.Fatalf("%v\n", err) return } defer glfw.CloseWindow() glfw.SetWindowTitle("Draw") glfw.SetSwapInterval(1) glfw.SetKeyCallback(onKey) glfw.SetMouseButtonCallback(onMouseBtn) glfw.SetWindowSizeCallback(onResize) running = true for running && glfw.WindowParam(glfw.Opened) == 1 { if mouse[0] != 0 { pen.lineTo(glfw.MousePos()) } else { pen.moveTo(glfw.MousePos()) } glfw.SwapBuffers() } }
func StartEngine() { runtime.GOMAXPROCS(runtime.NumCPU()) runtime.LockOSThread() fmt.Println("Enginge started!") var err error if err = glfw.Init(); err != nil { panic(err) } fmt.Println("GLFW Initialized!") glfw.OpenWindowHint(glfw.Accelerated, 1) if err = glfw.OpenWindow(Width, Height, 8, 8, 8, 8, 8, 8, glfw.Windowed); err != nil { panic(err) } glfw.SetSwapInterval(1) //0 to disable vsync, 1 to enable it glfw.SetWindowTitle(windowTitle) glfw.SetWindowSizeCallback(onResize) glfw.SetKeyCallback(input.OnKey) glfw.SetCharCallback(input.OnChar) glfw.SetMouseButtonCallback(input.ButtonPress) glfw.SetMouseWheel(0) glfw.SetMouseWheelCallback(input.MouseWheelCallback) input.MouseWheelPosition = glfw.MouseWheel input.MousePosition = glfw.MousePos if err = initGL(); err != nil { panic(err) } fmt.Println("Opengl Initialized!") TextureMaterial = NewBasicMaterial(spriteVertexShader, spriteFragmentShader) err = TextureMaterial.Load() if err != nil { fmt.Println(err) } SDFMaterial = NewBasicMaterial(sdfVertexShader, sdfFragmentShader) err = SDFMaterial.Load() if err != nil { fmt.Println(err) } internalMaterial = NewBasicMaterial(spriteVertexShader, spriteFragmentShader) err = internalMaterial.Load() if err != nil { fmt.Println(err) } initDefaultPlane() glfw.SwapBuffers() gameTime = time.Time{} lastTime = time.Now() dl = glfw.Time() }
func (rw *RenderWindow) Open() error { err := glfw.OpenWindow(int(rw.Width), int(rw.Height), 8, 8, 8, 8, 0, 0, glfw.Windowed) if err != nil { return err } glfw.SetWindowTitle(rw.Title) glfw.SetSwapInterval(2) glfw.SetKeyCallback(rw.onKey) glfw.SetWindowSizeCallback(rw.onResize) return nil }
// Wait for an event to be passed into the Events channel and execute the // corresponding registered actions. func PullEvents() { glfw.SetKeyCallback(keyHandler) glfw.SetWindowCloseCallback(func() int { CloseWindow(); return 0 }) for { e := <-Events for r, fn := range registered { // TODO change this (maps are supposed to work?) if e.Code() == r.Code() && e.State() == r.State() { fn() } } } }
func main() { var err error if err = glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "[e] %v\n", err) return } // Ensure glfw is cleanly terminated on exit. defer glfw.Terminate() if err = glfw.OpenWindow(256, 256, 8, 8, 8, 0, 0, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "[e] %v\n", err) return } // Ensure window is cleanly closed on exit. defer glfw.CloseWindow() // Enable vertical sync on cards that support it. glfw.SetSwapInterval(1) // Set window title glfw.SetWindowTitle("Simple GLFW window") // Hook some events to demonstrate use of callbacks. // These are not necessary if you don't need them. glfw.SetWindowSizeCallback(onResize) glfw.SetWindowCloseCallback(onClose) glfw.SetMouseButtonCallback(onMouseBtn) glfw.SetMouseWheelCallback(onMouseWheel) glfw.SetKeyCallback(onKey) glfw.SetCharCallback(onChar) // Start loop running := true for running { // OpenGL rendering goes here. // Swap front and back rendering buffers. This also implicitly calls // glfw.PollEvents(), so we have valid key/mouse/joystick states after // this. This behavior can be disabled by calling glfw.Disable with the // argument glfw.AutoPollEvents. You must be sure to manually call // PollEvents() or WaitEvents() in this case. glfw.SwapBuffers() // Break out of loop when Escape key is pressed, or window is closed. running = glfw.Key(glfw.KeyEsc) == 0 && glfw.WindowParam(glfw.Opened) == 1 } }
func (d *Device) Init() error { glfw.SetKeyCallback(func(key, state int) { var value cpu.Word if key >= glfw.KeySpecial { switch key { case glfw.KeyBackspace: value = 0x10 case glfw.KeyEnter: value = 0x11 case glfw.KeyInsert: value = 0x12 case glfw.KeyDel: value = 0x13 case glfw.KeyUp: value = 0x80 case glfw.KeyDown: value = 0x81 case glfw.KeyLeft: value = 0x82 case glfw.KeyRight: value = 0x83 case glfw.KeyLshift, glfw.KeyRshift: value = 0x90 case glfw.KeyLctrl, glfw.KeyRctrl: value = 0x91 default: return // Not supported. } } else { value = cpu.Word(key) } d.state[value] = cpu.Word(state) d.buf = append(d.buf, value) // Trigger an interrupt if enabled. if d.id != 0 { d.int(d.id) } }) return nil }
func InitGL(width, height int) { //enable vertical sync if the card supports it glfw.SetSwapInterval(1) gl.ShadeModel(gl.SMOOTH) gl.ClearColor(0.1, 0.1, 0.1, 1.0) gl.Enable(gl.TEXTURE_2D) gl.Enable(gl.CULL_FACE) gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LEQUAL) gl.Hint(gl.PERSPECTIVE_CORRECTION_HINT, gl.NICEST) SetViewport(width, height) glfw.SetWindowSizeCallback(SetViewport) glfw.SetKeyCallback(OnKey) }
// initGL initializes GLFW and OpenGL. func initGL() error { err := glfw.Init() if err != nil { return err } glfw.OpenWindowHint(glfw.FsaaSamples, 4) glfw.OpenWindowHint(glfw.WindowNoResize, gl.TRUE) err = glfw.OpenWindow(512, 512, 8, 8, 8, 8, 32, 0, glfw.Windowed) if err != nil { glfw.Terminate() return err } glfw.SetWindowTitle("Meshbuffer 3D example") glfw.SetSwapInterval(1) glfw.SetWindowSizeCallback(onResize) glfw.SetKeyCallback(onKey) gl.Init() if err = glh.CheckGLError(); err != nil { return err } gl.Enable(gl.DEPTH_TEST) gl.Enable(gl.MULTISAMPLE) gl.Disable(gl.LIGHTING) //gl.ClearColor(0.2, 0.2, 0.23, 1.0) gl.ClearColor(0, 0, 0, 1.0) gl.ShadeModel(gl.SMOOTH) gl.LineWidth(2) gl.ClearDepth(1) gl.DepthFunc(gl.LEQUAL) gl.Hint(gl.PERSPECTIVE_CORRECTION_HINT, gl.NICEST) gl.ColorMaterial(gl.FRONT_AND_BACK, gl.AMBIENT_AND_DIFFUSE) return nil }
func main() { RunGame(Title, Width*Scale, Height*Scale, func() { gl.PointSize(1.0 * Scale) x := 0 y := 0 dcolor := WHITE glfw.SetMouseButtonCallback(func(button, state int) { dcolor += 1 if dcolor > BLUE { dcolor = WHITE } }) glfw.SetMousePosCallback(func(mx, my int) { mx /= Scale my /= Scale if mx >= Width || my >= Height || mx < 0 || my < 0 { return } x = mx y = my if matrix != nil && dcolor != WHITE { (*matrix)[x][y].Color = dcolor (*matrix)[x][y].Intensity = 10 } }) glfw.SetKeyCallback(func(key, state int) { matrix = makeMatrix(Width, Height) }) matrix = makeMatrix(Width, Height) }, func() { matrix = NextMatrix(Width, Height, matrix) gl.Begin(gl.POINTS) drawMatrix(matrix, Scale, Scale) gl.End() }) }
func (s *Sys) runCycles(c int) error { glfw.SetKeyCallback(func(key, state int) { // I think there is a chance of key presses being lost when the system // is sleeping between cycles. // fmt.Printf("key %x (%v) = %d\n", key, string(key), state) if k, ok := keyMap[key]; ok { if state == glfw.KeyPress { s.key[k] = true } else { s.key[k] = false } } }) tick := time.Tick(time.Second / cpuFrequency) for i := 0; c < 0 || i < c; i++ { <-tick if err := s.stepCycle(); err != nil { return err } } return nil }
func (w *glfwBackend) Open(width, height, zoom int, fs bool, font *FontData) { if err := glfw.Init(); err != nil { panic(err) } w.font = font w.zoom = zoom w.width = width w.height = height var fwidth = width * font.CellWidth * zoom var fheight = height * font.CellHeight * zoom var twidth = fwidth var theight = fheight flag := glfw.Windowed if fs { flag = glfw.Fullscreen dm := glfw.DesktopMode() twidth = dm.W theight = dm.H } glfw.OpenWindowHint(glfw.WindowNoResize, gl.TRUE) err := glfw.OpenWindow(twidth, theight, 8, 8, 8, 8, 0, 0, flag) if err != nil { panic(err) } w.key = NOKEY glfw.SetWindowCloseCallback(func() int { w.Close(); return 0 }) glfw.SetKeyCallback(func(key, state int) { w.setKey(key, state) }) glfw.SetCharCallback(func(key, state int) { w.setKey(key, state) }) glfw.Enable(glfw.KeyRepeat) w.mouse = new(MouseData) glfw.Enable(glfw.MouseCursor) glfw.SetMousePosCallback(func(x, y int) { w.mouseMove(x, y) }) glfw.SetMouseButtonCallback(func(but, state int) { w.mousePress(but, state) }) glfw.Enable(glfw.MouseCursor) xoff := float32(twidth-fwidth) / 2.0 yoff := float32(theight-fheight) / 2.0 fc := float32(font.CellWidth * zoom) fch := float32(font.CellHeight * zoom) for y := 0; y < height; y++ { for x := 0; x < width; x++ { cx := xoff + float32(x)*fc cy := yoff + float32(y)*fch w.verts = append(w.verts, cx, cy, cx, cy+fch, cx+fc, cy+fch, cx+fc, cy) } } runtime.LockOSThread() glInit(twidth, theight) m := font.Image.(*image.RGBA) w.s = float32(font.CellWidth) / float32(m.Bounds().Max.X) w.t = float32(font.CellHeight) / float32(m.Bounds().Max.Y) textures = make([]gl.Uint, 2) gl.GenTextures(2, &textures[0]) gl.BindTexture(gl.TEXTURE_2D, textures[0]) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.Sizei(m.Bounds().Max.X), gl.Sizei(m.Bounds().Max.Y), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Pointer(&m.Pix[0])) m = image.NewRGBA(image.Rect(0, 0, font.CellWidth, font.CellHeight)) draw.Draw(m, m.Bounds(), &image.Uniform{White}, image.ZP, draw.Src) gl.BindTexture(gl.TEXTURE_2D, textures[1]) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.Sizei(m.Bounds().Max.X), gl.Sizei(m.Bounds().Max.Y), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Pointer(&m.Pix[0])) w.open = true }
func main() { var err error if err = glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "[e] %v\n", err) return } defer glfw.Terminate() w, h := 1980, 1080 // w, h := 1280, 768 if err = glfw.OpenWindow(w, h, 8, 8, 8, 16, 0, 32, glfw.Fullscreen); err != nil { fmt.Fprintf(os.Stderr, "[e] %v\n", err) return } defer glfw.CloseWindow() glfw.SetSwapInterval(1) glfw.SetWindowTitle("Debris") quadric = glu.NewQuadric() gl.Enable(gl.CULL_FACE) gl.Enable(gl.DEPTH_TEST) gl.DepthFunc(gl.LEQUAL) gl.Enable(gl.NORMALIZE) gl.Enable(gl.BLEND) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) gl.ShadeModel(gl.SMOOTH) gl.Enable(gl.LIGHTING) var ( ambient = []float32{0.1, 0.3, 0.6, 1} diffuse = []float32{1, 1, 0.5, 1} specular = []float32{0.4, 0.4, 0.4, 1} light_position = []float32{1, 0, 0, 0} // mat_specular []float32 = []float32{1, 1, 0.5, 1} mat_specular = []float32{1, 1, 0.75, 1} mat_shininess = float32(120) // light_position []float32 = []float32{0.0, 0.0, 1.0, 0.0} ) const ( fov = 1.1 // degrees znear = 145 zfar = 155 camera_z_offset = -150 camera_x_rotation = 0 // degrees // camera_x_rotation = 20 // degrees starfield_fov = 45 faces = 1000 earth_radius = 1 ) gl.Lightfv(gl.LIGHT1, gl.AMBIENT, ambient) gl.Lightfv(gl.LIGHT1, gl.DIFFUSE, diffuse) gl.Lightfv(gl.LIGHT1, gl.SPECULAR, specular) gl.Lightfv(gl.LIGHT1, gl.POSITION, light_position) gl.Enable(gl.LIGHT1) mat_emission := []float32{0, 0, 0.1, 1} gl.Materialfv(gl.FRONT_AND_BACK, gl.EMISSION, mat_emission) gl.Materialfv(gl.FRONT_AND_BACK, gl.SPECULAR, mat_specular) gl.Materialf(gl.FRONT_AND_BACK, gl.SHININESS, mat_shininess) gl.ClearColor(0.02, 0.02, 0.02, 1) gl.ClearDepth(1) gl.ClearStencil(0) gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) b := createBuffer() planetoids := []*Planetoid{} for i := 0; i < 1000; i++ { p := &Planetoid{ apogee: 1.2 + rand.Float64()*0.7, perigee: 1.5, // inclination: 45, inclination: rand.Float64()*20 - 10, // inclination: 0, phase0: rand.Float64() * 360, rising_node: rand.Float64() * 10, phase: 0, // radius: rand.Float32()*0.05 + 0.01, //float32(r), radius: rand.Float32()*0.0125 + 0.005, //float32(r), // quadric: glu.NewQuadric(), circle: b, } planetoids = append(planetoids, p) } // Initial projection matrix: var aspect float64 glfw.SetWindowSizeCallback(func(w, h int) { gl.Viewport(0, 0, w, h) gl.MatrixMode(gl.PROJECTION) gl.LoadIdentity() aspect = float64(w) / float64(h) glu.Perspective(fov, aspect, znear, zfar) }) d := float64(0) wireframe := false atmosphere := false polar := false rotating := false front := false earth := true cone := true shadowing := true tilt := false running := true glfw.SetKeyCallback(func(key, state int) { if state != glfw.KeyPress { // Don't act on key coming up return } switch key { case 'A': atmosphere = !atmosphere case 'C': cone = !cone case 'E': earth = !earth case 'R': rotating = !rotating case 'F': front = !front if front { gl.FrontFace(gl.CW) } else { gl.FrontFace(gl.CCW) } case 'S': shadowing = !shadowing case 'T': tilt = !tilt case 'W': wireframe = !wireframe method := gl.GLenum(gl.FILL) if wireframe { method = gl.LINE } gl.PolygonMode(gl.FRONT_AND_BACK, method) case glfw.KeyF2: println("Screenshot captured") // glh.CaptureToPng("screenshot.png") w, h := glh.GetViewportWH() im := image.NewRGBA(image.Rect(0, 0, w, h)) glh.ClearAlpha(1) gl.Flush() glh.CaptureRGBA(im) go func() { fd, err := os.Create("screenshot.png") if err != nil { panic("Unable to open file") } defer fd.Close() png.Encode(fd, im) }() case 'Q', glfw.KeyEsc: running = !running case glfw.KeySpace: polar = !polar } }) _ = rand.Float64 stars := glh.NewMeshBuffer( glh.RenderArrays, glh.NewPositionAttr(3, gl.DOUBLE, gl.STATIC_DRAW), glh.NewColorAttr(3, gl.DOUBLE, gl.STATIC_DRAW)) const Nstars = 50000 points := make([]float64, 3*Nstars) colors := make([]float64, 3*Nstars) for i := 0; i < Nstars; i++ { const R = 1 phi := rand.Float64() * 2 * math.Pi z := R * (2*rand.Float64() - 1) theta := math.Asin(z / R) points[i*3+0] = R * math.Cos(theta) * math.Cos(phi) points[i*3+1] = R * math.Cos(theta) * math.Sin(phi) points[i*3+2] = z const r = 0.8 v := rand.Float64()*r + (1 - r) colors[i*3+0] = v colors[i*3+1] = v colors[i*3+2] = v } stars.Add(points, colors) render_stars := func() { glh.With(glh.Attrib{gl.DEPTH_BUFFER_BIT | gl.ENABLE_BIT}, func() { gl.Disable(gl.LIGHTING) gl.PointSize(1) gl.Color4f(1, 1, 1, 1) gl.Disable(gl.DEPTH_TEST) gl.DepthMask(false) stars.Render(gl.POINTS) }) } render_scene := func() { // Update light position (sensitive to current modelview matrix) gl.Lightfv(gl.LIGHT1, gl.POSITION, light_position) gl.Lightfv(gl.LIGHT2, gl.POSITION, light_position) if earth { Sphere(earth_radius, faces) } unlit_points := glh.Compound(glh.Disable(gl.LIGHTING), glh.Primitive{gl.POINTS}) glh.With(unlit_points, func() { gl.Vertex3d(1, 0, 0) }) for _, p := range planetoids { const dt = 0.1 // TODO: Frame update p.Render(dt) } glh.With(glh.Disable(gl.LIGHTING), func() { // Atmosphere gl.Color4f(0.25, 0.25, 1, 0.1) if atmosphere && earth { Sphere(earth_radius*1.025, 100) } gl.PointSize(10) glh.With(glh.Primitive{gl.POINTS}, func() { gl.Color4f(1.75, 0.75, 0.75, 1) gl.Vertex3d(-1.04, 0, 0) }) }) } render_shadow_volume := func() { glh.With(glh.Attrib{ gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.ENABLE_BIT | gl.POLYGON_BIT | gl.STENCIL_BUFFER_BIT, }, func() { gl.Disable(gl.LIGHTING) if shadowing { // gl.Disable(gl.DEPTH_TEST) gl.DepthMask(false) gl.DepthFunc(gl.LEQUAL) gl.Enable(gl.STENCIL_TEST) gl.ColorMask(false, false, false, false) gl.StencilFunc(gl.ALWAYS, 1, 0xffffffff) } shadow_volume := func() { const sv_length = 2 const sv_granularity = 100 const sv_radius = earth_radius * 1.001 // Shadow cone glh.With(glh.Matrix{gl.MODELVIEW}, func() { gl.Rotatef(90, 1, 0, 0) gl.Rotatef(90, 0, -1, 0) gl.Color4f(0.5, 0.5, 0.5, 1) glu.Cylinder(quadric, sv_radius, sv_radius*1.05, sv_length, sv_granularity, 1) glu.Disk(quadric, 0, sv_radius, sv_granularity, 1) glh.With(glh.Matrix{gl.MODELVIEW}, func() { gl.Translated(0, 0, sv_length) glu.Disk(quadric, 0, sv_radius*1.05, sv_granularity, 1) }) }) for _, p := range planetoids { p.RenderShadowVolume() } } if cone { gl.FrontFace(gl.CCW) gl.StencilOp(gl.KEEP, gl.KEEP, gl.INCR) shadow_volume() gl.FrontFace(gl.CW) gl.StencilOp(gl.KEEP, gl.KEEP, gl.DECR) shadow_volume() } if shadowing { gl.StencilFunc(gl.NOTEQUAL, 0, 0xffffffff) gl.StencilOp(gl.KEEP, gl.KEEP, gl.KEEP) gl.ColorMask(true, true, true, true) // gl.Disable(gl.STENCIL_TEST) gl.Disable(gl.DEPTH_TEST) gl.FrontFace(gl.CCW) // gl.Color4f(1, 0, 0, 0.75) gl.Color4f(0, 0, 0, 0.75) // gl.Color4f(1, 1, 1, 0.75) gl.LoadIdentity() gl.Translated(0, 0, camera_z_offset) // TODO: Figure out why this doesn't draw over the whole screen glh.With(glh.Disable(gl.LIGHTING), func() { glh.DrawQuadd(-10, -10, 20, 20) }) // gl.FrontFace(gl.CW) // gl.Enable(gl.LIGHTING) // gl.Disable(gl.LIGHT1) // render_scene() // gl.Enable(gl.LIGHT1) } }) } _ = render_stars for running { running = glfw.WindowParam(glfw.Opened) == 1 glfw.SwapBuffers() gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT) rotation := func() { if tilt { gl.Rotated(20, 1, 0, 0) } if polar { gl.Rotated(90, 1, 0, 0) } gl.Rotated(d, 0, -1, 0) } // Star field glh.With(glh.Matrix{gl.PROJECTION}, func() { gl.LoadIdentity() glu.Perspective(starfield_fov, aspect, 0, 1) glh.With(glh.Matrix{gl.MODELVIEW}, func() { gl.LoadIdentity() rotation() render_stars() }) }) gl.MatrixMode(gl.MODELVIEW) gl.LoadIdentity() gl.Translated(0, 0, camera_z_offset) rotation() if rotating { d += 0.2 } _ = render_scene render_scene() _ = render_shadow_volume render_shadow_volume() } }
func main_loop(data *ProgramData) { start := time.Now() frames := 0 lastblocks := 0 // Frame counter go func() { for { time.Sleep(time.Second) if *verbose { memstats := new(runtime.MemStats) runtime.ReadMemStats(memstats) fps := float64(frames) / time.Since(start).Seconds() blocks := len(data.blocks) bps := float64(blocks-lastblocks) / time.Since(start).Seconds() lastblocks = blocks log.Printf("fps = %5.2f; blocks = %4d; bps = %5.2f sparemem = %6d MB; alloc'd = %6.6f; (+footprint = %6.6f)", fps, len(data.blocks), bps, SpareRAM(), float64(memstats.Alloc)/1024/1024, float64(memstats.Sys-memstats.Alloc)/1024/1024) PrintTimers(frames) } start = time.Now() frames = 0 } }() // Necessary at the moment to prevent eventual OOM go func() { for { time.Sleep(5 * time.Second) if *verbose { log.Print("GC()") } runtime.GC() if *verbose { GCStats() } } }() var i int64 = -int64(*nback) // TODO(pwaller): Make this work again // text := glh.MakeText(data.filename, 32) // Location of mouse in record space var rec, rec_actual int64 = 0, 0 var stacktext, dwarftext []*glh.Text var recordtext *glh.Text = nil var mousex, mousey, mousedownx, mousedowny int var mousepx, mousepy float64 var lbutton bool escape_hit := false glfw.SetMouseWheelCallback(func(pos int) { nback_prev := *nback if pos < 0 { *nback = 40 * 1024 << uint(-pos) } else { *nback = 40 * 1024 >> uint(pos) } //log.Print("Mousewheel position: ", pos, " nback: ", *nback) if rec == 0 { return } // mouse cursor is at screen "rec_actual", and it should be after // the transformation // We need to adjust `i` to keep this value constant: // rec_actual == i + int64(constpart * float64(*nback)) // where constpart <- (-const + 2.) / 4. // (that way, the mouse is still pointing at the same place after scaling) constpart := float64(rec_actual-i) / float64(nback_prev) rec_actual_after := i + int64(constpart*float64(*nback)) delta := rec_actual_after - rec_actual i -= delta // Ensure the mouse cursor position doesn't change when zooming rec = rec_actual - i }) update_text := func() { if DoneThisFrame(RenderText) { return } if recordtext != nil { recordtext.Destroy() recordtext = nil } //r := 0 //data.GetRecord(rec_actual) //if r != nil { //log.Print(data.records[rec_actual]) //recordtext = MakeText(r.String(), 32) //} for j := range stacktext { stacktext[j].Destroy() } // TODO: Load records on demand if false { stack := data.GetStackNames(rec_actual) stacktext = make([]*glh.Text, len(stack)) for j := range stack { stacktext[j] = glh.MakeText(stack[j], 32) } } } glfw.SetMouseButtonCallback(func(button, action int) { switch button { case glfw.Mouse1: switch action { case glfw.KeyPress: mousedownx, mousedowny = mousex, mousey lbutton = true r := data.GetRecord(rec_actual) if r != nil { if r.Type == MEMA_ACCESS { log.Print(r) ma := r.MemAccess() dwarf := data.GetDwarf(ma.Pc) log.Print("Can has dwarf? ", len(dwarf)) for i := range dwarf { log.Print(" ", dwarf[i]) //recordtext = MakeText(data.records[rec_actual].String(), 32) } log.Print("") for j := range dwarftext { dwarftext[j].Destroy() } dwarftext = make([]*glh.Text, len(dwarf)) for j := range dwarf { dwarftext[j] = glh.MakeText(fmt.Sprintf("%q", dwarf[j]), 32) } } //recordtext = MakeText(data.records[rec_actual].String(), 32) } case glfw.KeyRelease: lbutton = false } } }) glfw.SetMousePosCallback(func(x, y int) { px, py := glh.WindowToProj(x, y) // Record index rec = int64((py+2)*float64(*nback)/4. + 0.5) rec_actual = rec + i dpy := py - mousepy di := int64(-dpy * float64(*nback) / 4.) if lbutton { i += di } mousepx, mousepy = px, py mousex, mousey = x, y //log.Printf("Mouse motion: (%3d, %3d), (%f, %f), (%d, %d) dpy=%f di=%d", //x, y, px, py, rec, rec_actual, dpy, di) update_text() }) glfw.SetKeyCallback(func(key, state int) { switch key { case glfw.KeyEsc: escape_hit = true } }) draw_mousepoint := func() { // Draw the mouse point glh.With(glh.Matrix{gl.MODELVIEW}, func() { gl.Translated(0, -2, 0) gl.Scaled(1, 4/float64(*nback), 1) gl.Translated(0, float64(rec), 0) gl.PointSize(10) glh.With(glh.Primitive{gl.POINTS}, func() { gl.Color4f(1, 1, 1, 1) gl.Vertex3d(mousepx, 0, 0) }) }) } draw_text := func() { // Draw any text glh.With(glh.WindowCoords{}, func() { w, h := glh.GetViewportWHD() glh.With(glh.Attrib{gl.ENABLE_BIT}, func() { gl.Enable(gl.TEXTURE_2D) // text.Draw(0, 0) for text_idx := range stacktext { stacktext[text_idx].Draw(int(w*0.55), int(h)-35-text_idx*16) } for text_idx := range dwarftext { dwarftext[text_idx].Draw(int(w*0.55), 35+text_idx*16) } if recordtext != nil { recordtext.Draw(int(w*0.55), 35) } }) }) } Draw = func() { gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) // Draw the memory access/function data data.Draw(i, *nback) draw_mousepoint() draw_text() // Visible region quad // gl.Color4f(1, 1, 1, 0.25) // DrawQuadd(-2.1, -2.25, 4.4, 2.1 - -2.25) // StatsHUD() } interrupt := make(chan os.Signal) signal.Notify(interrupt, os.Interrupt) ctrlc_hit := false go func() { <-interrupt ctrlc_hit = true }() done := false for !done { done_this_frame = make(map[WorkType]bool) glh.With(&Timer{Name: "Draw"}, func() { Draw() }) glfw.SwapBuffers() DoMainThreadWork() done = ctrlc_hit || escape_hit || glfw.WindowParam(glfw.Opened) == 0 frames += 1 } }
func New(width int, height int, title string) *Window { var err error window := &Window{width: width, height: height, title: title} // initialize logger logf, err := os.OpenFile("window.log", os.O_WRONLY|os.O_CREATE, 0640) logger := log.New(logf, "", log.Ldate|log.Ltime) if err = glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "[e] %v\n", err) return nil } // width, hieght, r,g,b,a (color depth bits), depth, stencil, mode if err = glfw.OpenWindow(window.width, window.height, 8, 8, 8, 0, 0, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "[e] %v\n", err) return nil } onResize := func(w, h int) { logger.Printf("resized: %dx%d\n", w, h) } onClose := func() int { logger.Println("window closed\n") return 1 // return 0 to keep window open. } // list callback generators createBtnList := func(btnNext func() interface{}, device string) func(button, state int) { btnList := list.New() btnNext = func() interface{} { return btnList.Remove(btnList.Back()) } return func(button, state int) { btnList.PushFront(btnEvent{button: button, state: state}) logger.Printf("%s button: %d, %d\n", device, button, state) } } createPosList := func(posNext func() interface{}, device string) func(x, y int) { posList := list.New() posNext = func() interface{} { return posList.Remove(posList.Back()) } return func(x, y int) { posList.PushFront(posEvent{x: x, y: y}) logger.Printf("%s pos: %d, %d\n", device, x, y) } } createDeltaList := func(deltaNext func() interface{}, device string) func(delta int) { deltaList := list.New() deltaNext = func() interface{} { return deltaList.Remove(deltaList.Back()) } return func(delta int) { deltaList.PushFront(deltaEvent{delta: delta}) logger.Printf("%s delta: %d\n", device, delta) } } glfw.SetSwapInterval(1) glfw.SetWindowTitle(title) glfw.SetWindowSizeCallback(onResize) glfw.SetWindowCloseCallback(onClose) glfw.SetMousePosCallback(createPosList(window.MousePos, "mouse pos")) glfw.SetMouseButtonCallback(createBtnList(window.MouseBtn, "mouse")) glfw.SetMouseWheelCallback(createDeltaList(window.MouseWheel, "mouse wheel")) glfw.SetKeyCallback(createBtnList(window.KeyEvt, "keyboard")) glfw.SetCharCallback(createBtnList(window.CharEvt, "char")) window.Start = func() { defer glfw.Terminate() defer glfw.CloseWindow() running := true for running { window.Render() glfw.SwapBuffers() // Break out of loop when Escape key is pressed, or window is closed. running = glfw.Key(glfw.KeyEsc) == 0 && glfw.WindowParam(glfw.Opened) == 1 } } return window }
// Specify a function to call when a key is pressed. func (c *Controller) SetKeyCallback(handler KeyHandler) { glfw.SetKeyCallback(glfw.KeyHandler(handler)) }