func (c *Context) BlendFunc(mode CompositeMode) { gl := c.gl if c.lastCompositeMode == mode { return } c.lastCompositeMode = mode s, d := operations(mode) gl.BlendFunc(mgl.Enum(s), mgl.Enum(d)) }
func (c *Context) NewBuffer(bufferType BufferType, v interface{}, bufferUsage BufferUsage) Buffer { gl := c.gl b := gl.CreateBuffer() gl.BindBuffer(mgl.Enum(bufferType), b) switch v := v.(type) { case int: gl.BufferInit(mgl.Enum(bufferType), v, mgl.Enum(bufferUsage)) case []uint16: gl.BufferData(mgl.Enum(bufferType), uint16ToBytes(v), mgl.Enum(bufferUsage)) default: panic("not reach") } return Buffer(b) }
func (tex Texture) Bind(ctx gl.Context, options ...func(gl.Context, Texture)) { ctx.ActiveTexture(gl.Enum(uint32(gl.TEXTURE0) + tex.Value - 1)) ctx.BindTexture(gl.TEXTURE_2D, tex.Texture) for _, opt := range options { opt(ctx, tex) } }
func (loader *textureLoader) GetCube(name string) gl.Texture { glctx := loader.glctx tex := glctx.CreateTexture() img := loader.images[name] glctx.ActiveTexture(gl.TEXTURE0) glctx.BindTexture(gl.TEXTURE_CUBE_MAP, tex) target := gl.TEXTURE_CUBE_MAP_POSITIVE_X for i := 0; i < 6; i++ { // TODO: Load atlas, not the same image glctx.TexImage2D( gl.Enum(target+i), 0, img.Rect.Size().X, img.Rect.Size().Y, gl.RGBA, gl.UNSIGNED_BYTE, img.Pix, ) } glctx.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR) glctx.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR) glctx.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) glctx.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) // Not available in GLES 2.0 :( //gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE) return tex }
func (c *Context) NewShader(shaderType ShaderType, source string) (Shader, error) { gl := c.gl s := gl.CreateShader(mgl.Enum(shaderType)) if s.Value == 0 { return Shader{}, fmt.Errorf("opengl: glCreateShader failed: shader type: %d", shaderType) } gl.ShaderSource(s, source) gl.CompileShader(s) v := gl.GetShaderi(s, mgl.COMPILE_STATUS) if v == mgl.FALSE { log := gl.GetShaderInfoLog(s) return Shader{}, fmt.Errorf("opengl: shader compile failed: %s", log) } return Shader(s), nil }
func (c *Context) DrawElements(mode Mode, len int, offsetInBytes int) { gl := c.gl gl.DrawElements(mgl.Enum(mode), len, mgl.UNSIGNED_SHORT, offsetInBytes) }
func (c *Context) BufferSubData(bufferType BufferType, data []float32) { gl := c.gl gl.BufferSubData(mgl.Enum(bufferType), 0, float32ToBytes(data)) }
func (c *Context) VertexAttribPointer(p Program, location string, size int, dataType DataType, normalize bool, stride int, offset int) { gl := c.gl l := c.locationCache.GetAttribLocation(c, p, location) gl.VertexAttribPointer(mgl.Attrib(l), size, mgl.Enum(dataType), normalize, stride, offset) }