mirror of
https://github.com/bloeys/nmage.git
synced 2025-12-29 13:28:20 +00:00
Initial uniform buffers implementation
This commit is contained in:
@ -1,23 +1,22 @@
|
||||
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)
|
||||
// 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
|
||||
// ElementType is the type of an element thats makes up a buffer (e.g. Vec3)
|
||||
type ElementType uint8
|
||||
|
||||
const (
|
||||
DataTypeUnknown ElementType = iota
|
||||
|
||||
DataTypeUint32
|
||||
DataTypeInt32
|
||||
DataTypeFloat32
|
||||
@ -25,35 +24,48 @@ const (
|
||||
DataTypeVec2
|
||||
DataTypeVec3
|
||||
DataTypeVec4
|
||||
|
||||
DataTypeMat2
|
||||
DataTypeMat3
|
||||
DataTypeMat4
|
||||
)
|
||||
|
||||
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:
|
||||
fallthrough
|
||||
case DataTypeMat2:
|
||||
fallthrough
|
||||
case DataTypeMat3:
|
||||
fallthrough
|
||||
case DataTypeMat4:
|
||||
return gl.FLOAT
|
||||
|
||||
default:
|
||||
assert.T(false, fmt.Sprintf("Unknown data type passed. DataType '%v'", dt))
|
||||
assert.T(false, "Unknown data type passed. DataType '%d'", dt)
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
//CompSize returns the size in bytes for one component of the type (e.g. for Vec2 its 4)
|
||||
// CompSize returns the size in bytes for one component of the type (e.g. for Vec2 its 4).
|
||||
// Bools return 1, although in layout=std140 its 4
|
||||
func (dt ElementType) CompSize() int32 {
|
||||
|
||||
switch dt {
|
||||
|
||||
case DataTypeUint32:
|
||||
fallthrough
|
||||
case DataTypeFloat32:
|
||||
@ -65,15 +77,21 @@ func (dt ElementType) CompSize() int32 {
|
||||
case DataTypeVec3:
|
||||
fallthrough
|
||||
case DataTypeVec4:
|
||||
fallthrough
|
||||
case DataTypeMat2:
|
||||
fallthrough
|
||||
case DataTypeMat3:
|
||||
fallthrough
|
||||
case DataTypeMat4:
|
||||
return 4
|
||||
|
||||
default:
|
||||
assert.T(false, fmt.Sprintf("Unknown data type passed. DataType '%v'", dt))
|
||||
assert.T(false, "Unknown data type passed. DataType '%d'", dt)
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
//CompCount returns the number of components in the element (e.g. for Vec2 its 2)
|
||||
// CompCount returns the number of components in the element (e.g. for Vec2 its 2)
|
||||
func (dt ElementType) CompCount() int32 {
|
||||
|
||||
switch dt {
|
||||
@ -91,16 +109,24 @@ func (dt ElementType) CompCount() int32 {
|
||||
case DataTypeVec4:
|
||||
return 4
|
||||
|
||||
case DataTypeMat2:
|
||||
return 2 * 2
|
||||
case DataTypeMat3:
|
||||
return 3 * 3
|
||||
case DataTypeMat4:
|
||||
return 4 * 4
|
||||
|
||||
default:
|
||||
assert.T(false, fmt.Sprintf("Unknown data type passed. DataType '%v'", dt))
|
||||
assert.T(false, "Unknown data type passed. DataType '%d'", dt)
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
//Size returns the total size in bytes (e.g. for vec3 its 3*4=12 bytes)
|
||||
// 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:
|
||||
@ -115,8 +141,110 @@ func (dt ElementType) Size() int32 {
|
||||
case DataTypeVec4:
|
||||
return 4 * 4
|
||||
|
||||
case DataTypeMat2:
|
||||
return 2 * 2 * 4
|
||||
case DataTypeMat3:
|
||||
return 3 * 3 * 4
|
||||
case DataTypeMat4:
|
||||
return 4 * 4 * 4
|
||||
|
||||
default:
|
||||
assert.T(false, fmt.Sprintf("Unknown data type passed. DataType '%v'", dt))
|
||||
assert.T(false, "Unknown data type passed. DataType '%d'", dt)
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
func (dt ElementType) GlStd140BaseAlignment() uint8 {
|
||||
|
||||
switch dt {
|
||||
|
||||
case DataTypeUint32:
|
||||
fallthrough
|
||||
case DataTypeFloat32:
|
||||
fallthrough
|
||||
case DataTypeInt32:
|
||||
return 4
|
||||
|
||||
case DataTypeVec2:
|
||||
return 4 * 2
|
||||
|
||||
// Vec3 has the same alignment as vec4
|
||||
case DataTypeVec3:
|
||||
fallthrough
|
||||
case DataTypeVec4:
|
||||
return 4 * 4
|
||||
|
||||
// Matrices follow: (vec4Alignment) * numColumns
|
||||
case DataTypeMat2:
|
||||
return (4 * 4) * 2
|
||||
case DataTypeMat3:
|
||||
return (4 * 4) * 3
|
||||
case DataTypeMat4:
|
||||
return (4 * 4) * 4
|
||||
|
||||
default:
|
||||
assert.T(false, "Unknown data type passed. DataType '%d'", dt)
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
func (dt ElementType) GlStd140AlignmentBoundary() uint16 {
|
||||
|
||||
switch dt {
|
||||
|
||||
case DataTypeUint32:
|
||||
fallthrough
|
||||
case DataTypeFloat32:
|
||||
fallthrough
|
||||
case DataTypeInt32:
|
||||
return 4
|
||||
|
||||
case DataTypeVec2:
|
||||
return 8
|
||||
|
||||
case DataTypeVec3:
|
||||
fallthrough
|
||||
case DataTypeVec4:
|
||||
fallthrough
|
||||
case DataTypeMat2:
|
||||
fallthrough
|
||||
case DataTypeMat3:
|
||||
fallthrough
|
||||
case DataTypeMat4:
|
||||
return 16
|
||||
|
||||
default:
|
||||
assert.T(false, "Unknown data type passed. DataType '%d'", dt)
|
||||
return 0
|
||||
}
|
||||
}
|
||||
|
||||
func (dt ElementType) String() string {
|
||||
|
||||
switch dt {
|
||||
|
||||
case DataTypeUint32:
|
||||
return "uint32"
|
||||
case DataTypeFloat32:
|
||||
return "float32"
|
||||
case DataTypeInt32:
|
||||
return "int32"
|
||||
|
||||
case DataTypeVec2:
|
||||
return "Vec2"
|
||||
case DataTypeVec3:
|
||||
return "Vec3"
|
||||
case DataTypeVec4:
|
||||
return "Vec4"
|
||||
|
||||
case DataTypeMat2:
|
||||
return "Mat2"
|
||||
case DataTypeMat3:
|
||||
return "Mat3"
|
||||
case DataTypeMat4:
|
||||
return "Mat4"
|
||||
|
||||
default:
|
||||
return "Unknown"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user