func (gw *GameWindow) Draw(region g2.Region, style g2.StyleStack) { defer base.StackCatcher() defer func() { // gl.Translated(gl.Double(gw.region.X), gl.Double(gw.region.Y), 0) gl.Disable(gl.TEXTURE_2D) gl.Color4ub(255, 255, 255, 255) gl.LineWidth(3) gl.Begin(gl.LINES) bx, by := gl.Int(region.X), gl.Int(region.Y) bdx, bdy := gl.Int(region.Dx), gl.Int(region.Dy) gl.Vertex2i(bx, by) gl.Vertex2i(bx, by+bdy) gl.Vertex2i(bx, by+bdy) gl.Vertex2i(bx+bdx, by+bdy) gl.Vertex2i(bx+bdx, by+bdy) gl.Vertex2i(bx+bdx, by) gl.Vertex2i(bx+bdx, by) gl.Vertex2i(bx, by) gl.End() gl.LineWidth(1) }() gw.Engine.Pause() game := gw.Engine.GetState().(*Game) // Note that since we do a READER lock on game.local we cannot do any writes // to local data while rendering. game.local.RLock() game.RenderLocal(region) game.local.RUnlock() gw.Engine.Unpause() }
func main() { defer base.StackCatcher() sys.Startup() err := gl.Init() if err != nil { base.Error().Fatalf("%v", err) } render.Init() render.Queue(func() { sys.CreateWindow(10, 10, wdx, wdy) sys.EnableVSync(true) }) base.InitShaders() runtime.GOMAXPROCS(10) sys.Think() base.LoadAllDictionaries() if Version() != "standard" { engine := debugHookup(Version()) mainLoop(engine, "standard") } else { // TODO: Reimplement standard hookup } }
func init() { load_requests = make(chan loadRequest, 10) pipe := make(chan loadRequest, 10) // We want to be able to handle any number of incoming load requests, so // we have one go-routine collect them all and send them along pipe any // time someone is ready to receive one. go func() { defer base.StackCatcher() var rs []loadRequest var send chan loadRequest var hold loadRequest for { select { case r := <-load_requests: rs = append(rs, r) case send <- hold: rs = rs[1:] } if len(rs) > 0 { send = pipe hold = rs[0] } else { // If send is nil then it will effectively be excluded from the select // statement above. This is good since we won't have anything to send // until we get more requests. rs = nil send = nil } } }() for i := 0; i < 4; i++ { go loadTextureRoutine(pipe) } }
func (g *Game) Think() { defer base.StackCatcher() switch { case g.Setup != nil: g.ThinkSetup() default: g.ThinkGame() } }