// program & OpenGL initialization func Init() { pos := []float32{5.0, 5.0, 10.0, 0.0} red := []float32{0.8, 0.1, 0.0, 1.0} green := []float32{0.0, 0.8, 0.2, 1.0} blue := []float32{0.2, 0.2, 1.0, 1.0} gl.Lightfv(gl.LIGHT0, gl.POSITION, pos) gl.Enable(gl.CULL_FACE) gl.Enable(gl.LIGHTING) gl.Enable(gl.LIGHT0) gl.Enable(gl.DEPTH_TEST) // make the gears gear1 = gl.GenLists(1) gl.NewList(gear1, gl.COMPILE) gl.Materialfv(gl.FRONT, gl.AMBIENT_AND_DIFFUSE, red) gear(1.0, 4.0, 1.0, 20, 0.7) gl.EndList() gear2 = gl.GenLists(1) gl.NewList(gear2, gl.COMPILE) gl.Materialfv(gl.FRONT, gl.AMBIENT_AND_DIFFUSE, green) gear(0.5, 2.0, 2.0, 10, 0.7) gl.EndList() gear3 = gl.GenLists(1) gl.NewList(gear3, gl.COMPILE) gl.Materialfv(gl.FRONT, gl.AMBIENT_AND_DIFFUSE, blue) gear(1.3, 2.0, 0.5, 10, 0.7) gl.EndList() gl.Enable(gl.NORMALIZE) // Parse command line options info := flag.Bool("info", false, "Info") autoexit = flag.Int("exit", 30, "Auto Exit after n seconts\n") flag.Parse() if *info { fmt.Printf("gl.RENDERER = %s\n", gl.GetString(gl.RENDERER)) fmt.Printf("gl.VERSION = %s\n", gl.GetString(gl.VERSION)) fmt.Printf("gl.VENDOR = %s\n", gl.GetString(gl.VENDOR)) fmt.Printf("gl.EXTENSIONS = %s\n", gl.GetString(gl.EXTENSIONS)) os.Exit(1) } }
func BuildModel(prim func()) { // all primitives should be built at runtime (for a scene) object = gl.GenLists(1) gl.NewList(object, gl.COMPILE) gl.Materialfv(gl.FRONT, gl.AMBIENT_AND_DIFFUSE, []float32{0.8, 0.1, 0.0, 1.0}) prim() gl.EndList() return object }
func init_() { pos := []float32{5.0, 5.0, 10.0, 0.0} red := []float32{0.8, 0.1, 0.0, 1.0} green := []float32{0.0, 0.8, 0.2, 1.0} blue := []float32{0.2, 0.2, 1.0, 1.0} gl.Lightfv(gl.LIGHT0, gl.POSITION, pos) gl.Enable(gl.CULL_FACE) gl.Enable(gl.LIGHTING) gl.Enable(gl.LIGHT0) gl.Enable(gl.DEPTH_TEST) /* make the gears */ gear1 = gl.GenLists(1) gl.NewList(gear1, gl.COMPILE) gl.Materialfv(gl.FRONT, gl.AMBIENT_AND_DIFFUSE, red) gear(1.0, 4.0, 1.0, 20, 0.7) gl.EndList() gear2 = gl.GenLists(1) gl.NewList(gear2, gl.COMPILE) gl.Materialfv(gl.FRONT, gl.AMBIENT_AND_DIFFUSE, green) gear(0.5, 2.0, 2.0, 10, 0.7) gl.EndList() gear3 = gl.GenLists(1) gl.NewList(gear3, gl.COMPILE) gl.Materialfv(gl.FRONT, gl.AMBIENT_AND_DIFFUSE, blue) gear(1.3, 2.0, 0.5, 10, 0.7) gl.EndList() gl.Enable(gl.NORMALIZE) if *printInfo { print("GL_RENDERER = ", gl.GetString(gl.RENDERER), "\n") print("GL_VERSION = ", gl.GetString(gl.VERSION), "\n") print("GL_VENDOR = ", gl.GetString(gl.VENDOR), "\n") print("GL_EXTENSIONS = ", gl.GetString(gl.EXTENSIONS), "\n") } }
// loadFont loads the given font data. This does not deal with font scaling. // Scaling should be handled by the independent Bitmap/Truetype loaders. // We therefore expect the supplied image and charset to already be adjusted // to the correct font scale. // // The image should hold a sprite sheet, defining the graphical layout for // every glyph. The config describes font metadata. func loadFont(img *image.RGBA, config *FontConfig) (f *Font, err error) { f = new(Font) f.config = config // Resize image to next power-of-two. img = glh.Pow2Image(img).(*image.RGBA) ib := img.Bounds() // Create the texture itself. It will contain all glyphs. // Individual glyph-quads display a subset of this texture. f.texture = gl.GenTexture() f.texture.Bind(gl.TEXTURE_2D) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, ib.Dx(), ib.Dy(), 0, gl.RGBA, gl.UNSIGNED_BYTE, img.Pix) // Create display lists for each glyph. f.listbase = gl.GenLists(len(config.Glyphs)) texWidth := float32(ib.Dx()) texHeight := float32(ib.Dy()) for index, glyph := range config.Glyphs { // Update max glyph bounds. if glyph.Width > f.maxGlyphWidth { f.maxGlyphWidth = glyph.Width } if glyph.Height > f.maxGlyphHeight { f.maxGlyphHeight = glyph.Height } // Quad width/height vw := float32(glyph.Width) vh := float32(glyph.Height) // Texture coordinate offsets. tx1 := float32(glyph.X) / texWidth ty1 := float32(glyph.Y) / texHeight tx2 := (float32(glyph.X) + vw) / texWidth ty2 := (float32(glyph.Y) + vh) / texHeight // Advance width (or height if we render top-to-bottom) adv := float32(glyph.Advance) gl.NewList(f.listbase+uint(index), gl.COMPILE) { gl.Begin(gl.QUADS) { gl.TexCoord2f(tx1, ty2) gl.Vertex2f(0, 0) gl.TexCoord2f(tx2, ty2) gl.Vertex2f(vw, 0) gl.TexCoord2f(tx2, ty1) gl.Vertex2f(vw, vh) gl.TexCoord2f(tx1, ty1) gl.Vertex2f(0, vh) } gl.End() switch config.Dir { case LeftToRight: gl.Translatef(adv, 0, 0) case RightToLeft: gl.Translatef(-adv, 0, 0) case TopToBottom: gl.Translatef(0, -adv, 0) } } gl.EndList() } err = glh.CheckGLError() return }