Files
nmage/buffers/element.go
2022-07-23 22:51:57 +04:00

123 lines
2.2 KiB
Go
Executable File

package buffers
import (
"fmt"
"github.com/bloeys/nmage/assert"
"github.com/go-gl/gl/v4.1-core/gl"
)
//Element represents an element that makes up a buffer (e.g. Vec3 at an offset of 12 bytes)
type Element struct {
Offset int
ElementType
}
//ElementType is the type of an element thats makes up a buffer (e.g. Vec3)
type ElementType int
const (
DataTypeUnknown ElementType = iota
DataTypeUint32
DataTypeInt32
DataTypeFloat32
DataTypeVec2
DataTypeVec3
DataTypeVec4
)
func (dt ElementType) GLType() uint32 {
switch dt {
case DataTypeUint32:
return gl.UNSIGNED_INT
case DataTypeInt32:
return gl.INT
case DataTypeFloat32:
fallthrough
case DataTypeVec2:
fallthrough
case DataTypeVec3:
fallthrough
case DataTypeVec4:
return gl.FLOAT
default:
assert.T(false, fmt.Sprintf("Unknown data type passed. DataType '%v'", dt))
return 0
}
}
//CompSize returns the size in bytes for one component of the type (e.g. for Vec2 its 4)
func (dt ElementType) CompSize() int32 {
switch dt {
case DataTypeUint32:
fallthrough
case DataTypeFloat32:
fallthrough
case DataTypeInt32:
fallthrough
case DataTypeVec2:
fallthrough
case DataTypeVec3:
fallthrough
case DataTypeVec4:
return 4
default:
assert.T(false, fmt.Sprintf("Unknown data type passed. DataType '%v'", dt))
return 0
}
}
//CompCount returns the number of components in the element (e.g. for Vec2 its 2)
func (dt ElementType) CompCount() int32 {
switch dt {
case DataTypeUint32:
fallthrough
case DataTypeFloat32:
fallthrough
case DataTypeInt32:
return 1
case DataTypeVec2:
return 2
case DataTypeVec3:
return 3
case DataTypeVec4:
return 4
default:
assert.T(false, fmt.Sprintf("Unknown data type passed. DataType '%v'", dt))
return 0
}
}
//Size returns the total size in bytes (e.g. for vec3 its 3*4=12 bytes)
func (dt ElementType) Size() int32 {
switch dt {
case DataTypeUint32:
fallthrough
case DataTypeFloat32:
fallthrough
case DataTypeInt32:
return 4
case DataTypeVec2:
return 2 * 4
case DataTypeVec3:
return 3 * 4
case DataTypeVec4:
return 4 * 4
default:
assert.T(false, fmt.Sprintf("Unknown data type passed. DataType '%v'", dt))
return 0
}
}