graphics: Add comments

This commit is contained in:
Hajime Hoshi 2017-09-24 22:56:50 +09:00
parent 8e75964cb1
commit ecc9d0b3b1
3 changed files with 43 additions and 7 deletions

16
internal/graphics/doc.go Normal file
View File

@ -0,0 +1,16 @@
// Copyright 2017 The Ebiten Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Package graphics represents a low layer for graphics using OpenGL.
package graphics

View File

@ -21,6 +21,7 @@ import (
"github.com/hajimehoshi/ebiten/internal/opengl" "github.com/hajimehoshi/ebiten/internal/opengl"
) )
// arrayBufferLayoutPart is a part of an array buffer layout.
type arrayBufferLayoutPart struct { type arrayBufferLayoutPart struct {
// TODO: This struct should belong to a program and know it. // TODO: This struct should belong to a program and know it.
name string name string
@ -29,11 +30,16 @@ type arrayBufferLayoutPart struct {
normalize bool normalize bool
} }
// arrayBufferLayout is an array buffer layout.
//
// An array buffer in OpenGL is a buffer representing vertices and
// is passed to a vertex shader.
type arrayBufferLayout struct { type arrayBufferLayout struct {
parts []arrayBufferLayoutPart parts []arrayBufferLayoutPart
total int total int
} }
// totalBytes returns the size in bytes for one element of the array buffer.
func (a *arrayBufferLayout) totalBytes() int { func (a *arrayBufferLayout) totalBytes() int {
if a.total != 0 { if a.total != 0 {
return a.total return a.total
@ -46,10 +52,12 @@ func (a *arrayBufferLayout) totalBytes() int {
return a.total return a.total
} }
// newArrayBuffer creates OpenGL's buffer object for the array buffer.
func (a *arrayBufferLayout) newArrayBuffer() opengl.Buffer { func (a *arrayBufferLayout) newArrayBuffer() opengl.Buffer {
return opengl.GetContext().NewArrayBuffer(a.totalBytes() * 4 * maxQuads) return opengl.GetContext().NewArrayBuffer(a.totalBytes() * 4 * maxQuads)
} }
// enable binds the array buffer the given program to use the array buffer.
func (a *arrayBufferLayout) enable(program opengl.Program) { func (a *arrayBufferLayout) enable(program opengl.Program) {
for _, p := range a.parts { for _, p := range a.parts {
opengl.GetContext().EnableVertexAttribArray(program, p.name) opengl.GetContext().EnableVertexAttribArray(program, p.name)
@ -62,6 +70,7 @@ func (a *arrayBufferLayout) enable(program opengl.Program) {
} }
} }
// disable stops using the array buffer.
func (a *arrayBufferLayout) disable(program opengl.Program) { func (a *arrayBufferLayout) disable(program opengl.Program) {
// TODO: Disabling should be done in reversed order? // TODO: Disabling should be done in reversed order?
for _, p := range a.parts { for _, p := range a.parts {
@ -70,6 +79,7 @@ func (a *arrayBufferLayout) disable(program opengl.Program) {
} }
var ( var (
// theArrayBufferLayout is the array buffer layout for Ebiten.
theArrayBufferLayout = arrayBufferLayout{ theArrayBufferLayout = arrayBufferLayout{
// Note that GL_MAX_VERTEX_ATTRIBS is at least 16. // Note that GL_MAX_VERTEX_ATTRIBS is at least 16.
parts: []arrayBufferLayoutPart{ parts: []arrayBufferLayoutPart{
@ -101,9 +111,15 @@ var (
} }
) )
// openGLState is a state for OpenGL.
type openGLState struct { type openGLState struct {
// arrayBuffer is OpenGL's array buffer (vertices data).
arrayBuffer opengl.Buffer arrayBuffer opengl.Buffer
indexBufferQuads opengl.Buffer
// elementArrayBuffer is OpenGL's element array buffer (indices data).
elementArrayBuffer opengl.Buffer
// programTexture is OpenGL's program for rendering a texture.
programTexture opengl.Program programTexture opengl.Program
lastProgram opengl.Program lastProgram opengl.Program
@ -113,11 +129,10 @@ type openGLState struct {
} }
var ( var (
// theOpenGLState is the OpenGL state in the current process.
theOpenGLState openGLState theOpenGLState openGLState
zeroBuffer opengl.Buffer
zeroProgram opengl.Program zeroProgram opengl.Program
zeroTexture opengl.Texture
) )
const ( const (
@ -125,10 +140,12 @@ const (
maxQuads = indicesNum / 6 maxQuads = indicesNum / 6
) )
// ResetGLState resets or initializes the current OpenGL state.
func ResetGLState() error { func ResetGLState() error {
return theOpenGLState.reset() return theOpenGLState.reset()
} }
// reset resets or initializes the OpenGL state.
func (s *openGLState) reset() error { func (s *openGLState) reset() error {
if err := opengl.GetContext().Reset(); err != nil { if err := opengl.GetContext().Reset(); err != nil {
return err return err
@ -158,6 +175,8 @@ func (s *openGLState) reset() error {
return err return err
} }
// TODO: Delete the array buffer and the element array buffer when needed?
s.arrayBuffer = theArrayBufferLayout.newArrayBuffer() s.arrayBuffer = theArrayBufferLayout.newArrayBuffer()
indices := make([]uint16, 6*maxQuads) indices := make([]uint16, 6*maxQuads)
@ -169,7 +188,7 @@ func (s *openGLState) reset() error {
indices[6*i+4] = 4*i + 2 indices[6*i+4] = 4*i + 2
indices[6*i+5] = 4*i + 3 indices[6*i+5] = 4*i + 3
} }
s.indexBufferQuads = opengl.GetContext().NewElementArrayBuffer(indices) s.elementArrayBuffer = opengl.GetContext().NewElementArrayBuffer(indices)
return nil return nil
} }
@ -207,7 +226,7 @@ func (p *programContext) begin() error {
p.state.lastProjectionMatrix = nil p.state.lastProjectionMatrix = nil
p.state.lastColorMatrix = nil p.state.lastColorMatrix = nil
p.state.lastColorMatrixTranslation = nil p.state.lastColorMatrixTranslation = nil
c.BindElementArrayBuffer(p.state.indexBufferQuads) c.BindElementArrayBuffer(p.state.elementArrayBuffer)
c.UniformInt(p.program, "texture", 0) c.UniformInt(p.program, "texture", 0)
} }

View File

@ -18,6 +18,7 @@ import (
"github.com/hajimehoshi/ebiten/internal/opengl" "github.com/hajimehoshi/ebiten/internal/opengl"
) )
// texture represents OpenGL's texture.
type texture struct { type texture struct {
native opengl.Texture native opengl.Texture
} }