func (f *Font) DrawText2D(x int, y int, color [3]byte, scale float, txt string) (endw int, endh int) { gl.LoadIdentity() // gl.Translatef(0.0, 0.0, -2.0); glEnable2D() gl.Disable(gl.DEPTH_TEST) texture, initial, intermediarya, intermediary, w, h := f.setupTextRendering(color, txt) locX := gl.GLfloat(x) locY := gl.GLfloat(y) wi := gl.GLfloat(w) * gl.GLfloat(scale) he := gl.GLfloat(h) * gl.GLfloat(scale) /* Draw a quad at location */ gl.Begin(gl.QUADS) /* Recall that the origin is in the lower-left corner That is why the TexCoords specify different corners than the Vertex coors seem to. */ gl.TexCoord2f(0.0, 1.0) gl.Vertex2f(locX, locY) gl.TexCoord2f(1.0, 1.0) gl.Vertex2f(locX+wi, locY) gl.TexCoord2f(1.0, 0.0) gl.Vertex2f(locX+wi, locY+he) gl.TexCoord2f(0.0, 0.0) gl.Vertex2f(locX, locY+he) gl.End() endw, endh = f.teardownTextRendering(texture, initial, intermediarya, intermediary) gl.Enable(gl.DEPTH_TEST) glDisable2D() return }
// handle key press events func handleKeyPress(keysym sdl.Keysym) { switch keysym.Sym { case sdl.K_f: // f key pages through filters filter = (filter + 1) % 3 p("new filter:", filter) case sdl.K_l: // l key toggles light light = !light if light { p("light on") gl.Enable(gl.LIGHTING) } else { p("light off") gl.Disable(gl.LIGHTING) } case sdl.K_PAGEUP: // page up zooms into the scene z -= 0.02 case sdl.K_PAGEDOWN: // zoom out of the scene z += 0.02 case sdl.K_UP: // up arrow affects x rotation xspeed -= 0.01 case sdl.K_DOWN: // down arrow affects x rotation xspeed += 0.01 case sdl.K_RIGHT: // affect y rotation yspeed += 0.01 case sdl.K_LEFT: // affect y rotation yspeed -= 0.01 case sdl.K_ESCAPE: Quit(0) case sdl.K_F1: sdl.WM_ToggleFullScreen(surface) } }
func main() { var err os.Error if err = glfw.Init(); err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) return } defer glfw.Terminate() // Open window with FSAA samples (if possible). glfw.OpenWindowHint(glfw.FsaaSamples, 4) if err = glfw.OpenWindow(400, 400, 0, 0, 0, 0, 0, 0, glfw.Windowed); err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) return } defer glfw.CloseWindow() glfw.SetWindowTitle("Aliasing Detector") glfw.SetSwapInterval(1) if samples := glfw.WindowParam(glfw.FsaaSamples); samples != 0 { fmt.Fprintf(os.Stdout, "Context reports FSAA is supported with %d samples\n", samples) } else { fmt.Fprintf(os.Stdout, "Context reports FSAA is unsupported\n") } gl.MatrixMode(gl.PROJECTION) glu.Perspective(0, 1, 0, 1) for glfw.WindowParam(glfw.Opened) == 1 { time := float32(glfw.Time()) gl.Clear(gl.COLOR_BUFFER_BIT) gl.LoadIdentity() gl.Translatef(0.5, 0, 0) gl.Rotatef(time, 0, 0, 1) gl.Enable(GL_MULTISAMPLE_ARB) gl.Color3f(1, 1, 1) gl.Rectf(-0.25, -0.25, 0.25, 0.25) gl.LoadIdentity() gl.Translatef(-0.5, 0, 0) gl.Rotatef(time, 0, 0, 1) gl.Disable(GL_MULTISAMPLE_ARB) gl.Color3f(1, 1, 1) gl.Rectf(-0.25, -0.25, 0.25, 0.25) glfw.SwapBuffers() } }
func special(key, x, y int) { switch key { case glut.KEY_F1: gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) gl.Enable(gl.BLEND) gl.Enable(gl.LINE_SMOOTH) gl.Enable(gl.POINT_SMOOTH) case glut.KEY_F2: gl.Disable(gl.BLEND) gl.Disable(gl.LINE_SMOOTH) gl.Disable(gl.POINT_SMOOTH) case glut.KEY_UP: thrust = true thrustTime = glut.Get(glut.ELAPSED_TIME) case glut.KEY_LEFT: left = true leftTime = glut.Get(glut.ELAPSED_TIME) case glut.KEY_RIGHT: right = true rightTime = glut.Get(glut.ELAPSED_TIME) } }
func resetZoom() { // Reset viewport gl.LoadIdentity() gl.MatrixMode(gl.PROJECTION) gl.LoadIdentity() // Reset ortho view gl.Ortho(left, right, bottom, top, 1, -1) gl.Rotatef(180, 0, 0, 0) gl.Translatef(float32(-*cx), float32(-*cy), 0) gl.MatrixMode(gl.MODELVIEW) gl.Disable(gl.DEPTH_TEST) gl.LoadIdentity() }
func reshape(w, h int) { /* Because Gil specified "screen coordinates" (presumably with an upper-left origin), this short bit of code sets up the coordinate system to correspond to actual window coodrinates. This code wouldn't be required if you chose a (more typical in 3D) abstract coordinate system. */ gl.ClearColor(1, 1, 1, 1) //fmt.Println(gl.GetString(gl.EXTENSIONS)) gl.Viewport(0, 0, w, h) /* Establish viewing area to cover entire window. */ gl.MatrixMode(gl.PROJECTION) /* Start modifying the projection matrix. */ gl.LoadIdentity() /* Reset project matrix. */ gl.Ortho(0, float64(w), 0, float64(h), -1, 1) /* Map abstract coords directly to window coords. */ gl.Scalef(1, -1, 1) /* Invert Y axis so increasing Y goes down. */ gl.Translatef(0, float32(-h), 0) /* Shift origin up to upper-left corner. */ gl.Enable(gl.BLEND) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) gl.Disable(gl.DEPTH_TEST) width, height = w, h }
func (f *Font) teardownTextRendering(texture gl.GLuint, initial *sdl.Surface, intermediarya *sdl.Surface, intermediary *sdl.Surface) (endw int, endh int) { // gl.Disable(gl.BLEND) /* Bad things happen if we delete the texture before it finishes */ gl.Finish() /* return the deltas in the unused w,h part of the rect */ endw = int(initial.W) endh = int(initial.H) /* Clean up */ initial.Free() intermediarya.Free() intermediary.Free() gl.DeleteTextures(1, &texture) // return }
func drawWin(d float) { gl.LoadIdentity() // gl.LineWidth(5.0) // gl.Enable(gl.POINT_SMOOTH) // gl.Enable(gl.LINE_SMOOTH) gl.Enable(gl.BLEND) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) if d > 1.0 { d = 1.0 } c := WinColor gl.Color4f(gl.GLfloat(c[0]), gl.GLfloat(c[1]), gl.GLfloat(c[2]), gl.GLfloat(d)) m := PlayArea * 4 t := 1.0 * m b := -1.0 * m r := 1.0 * m l := -1.0 * m gl.Begin(gl.POLYGON) zo := -10.0 gl.Vertex3f(gl.GLfloat(l), gl.GLfloat(t), gl.GLfloat(zo)) gl.Vertex3f(gl.GLfloat(r), gl.GLfloat(t), gl.GLfloat(zo)) gl.Vertex3f(gl.GLfloat(r), gl.GLfloat(b), gl.GLfloat(zo)) gl.Vertex3f(gl.GLfloat(l), gl.GLfloat(b), gl.GLfloat(zo)) gl.Vertex3f(gl.GLfloat(l), gl.GLfloat(t), gl.GLfloat(zo)) gl.End() gl.Disable(gl.BLEND) }
func (f *Font) DrawText3D(pos Vector3, color [3]byte, scale float, txt string) (endw int, endh int) { gl.LoadIdentity() // gl.Translatef(gl.GLfloat(pos.X), gl.GLfloat(pos.Y), gl.GLfloat(-4.99)); gl.Translatef(gl.GLfloat(pos.X), gl.GLfloat(pos.Y), gl.GLfloat(-4.99)) gl.Scalef(gl.GLfloat(1.0/64.0*scale), gl.GLfloat(1.0/64.0*scale), gl.GLfloat(1.0)) gl.Disable(gl.DEPTH_TEST) texture, initial, intermediarya, intermediary, w, h := f.setupTextRendering(color, txt) wi := gl.GLfloat(w) he := gl.GLfloat(h) locX := gl.GLfloat(0) - wi*0.5 locY := gl.GLfloat(0) - he*0.5 /* Draw a quad at location */ gl.Begin(gl.QUADS) /* Recall that the origin is in the lower-left corner That is why the TexCoords specify different corners than the Vertex coors seem to. */ gl.Color4f(1.0, 1.0, 0.0, 1.0) gl.TexCoord2f(0.0, 1.0) gl.Vertex3f(locX, locY, 0.0) gl.TexCoord2f(1.0, 1.0) gl.Vertex3f(locX+wi, locY, 0.0) gl.TexCoord2f(1.0, 0.0) gl.Vertex3f(locX+wi, locY+he, 0.0) gl.TexCoord2f(0.0, 0.0) gl.Vertex3f(locX, locY+he, 0.0) gl.End() endw, endh = f.teardownTextRendering(texture, initial, intermediarya, intermediary) gl.Enable(gl.DEPTH_TEST) return }
func drawCircle(t *trigger) { radius := float64(t.Size) pos := t.Pos gl.LoadIdentity() gl.Color4f(gl.GLfloat(t.Col[0]), gl.GLfloat(t.Col[1]), gl.GLfloat(t.Col[2]), gl.GLfloat(t.Col[3])) gl.LineWidth(2.0) gl.Translatef(gl.GLfloat(pos.X), gl.GLfloat(pos.Y), gl.GLfloat(pos.Z)) gl.Enable(gl.BLEND) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) gl.Begin(gl.POLYGON) for i := 0; i < 360; i++ { var degInRad float64 = float64(i) * DEG2RAD gl.Vertex3f(gl.GLfloat(math.Cos(degInRad)*radius), gl.GLfloat(math.Sin(degInRad)*radius), gl.GLfloat(0.0)) } gl.End() gl.Disable(gl.BLEND) }