mirror of
https://github.com/bloeys/nmage.git
synced 2025-12-29 13:28:20 +00:00
87 lines
2.0 KiB
Go
Executable File
87 lines
2.0 KiB
Go
Executable File
package rend3dgl
|
|
|
|
import (
|
|
"github.com/bloeys/gglm/gglm"
|
|
"github.com/bloeys/nmage/buffers"
|
|
"github.com/bloeys/nmage/materials"
|
|
"github.com/bloeys/nmage/meshes"
|
|
"github.com/bloeys/nmage/renderer"
|
|
"github.com/go-gl/gl/v4.1-core/gl"
|
|
)
|
|
|
|
var _ renderer.Render = &Rend3DGL{}
|
|
|
|
type Rend3DGL struct {
|
|
BoundVaoId uint32
|
|
BoundMatId uint32
|
|
BoundMeshVaoId uint32
|
|
}
|
|
|
|
func (r *Rend3DGL) DrawMesh(mesh meshes.Mesh, modelMat gglm.TrMat, mat materials.Material) {
|
|
|
|
if mesh.Vao.Id != r.BoundMeshVaoId {
|
|
mesh.Vao.Bind()
|
|
r.BoundMeshVaoId = mesh.Vao.Id
|
|
}
|
|
|
|
if mat.Id != r.BoundMatId {
|
|
mat.Bind()
|
|
r.BoundMatId = mat.Id
|
|
}
|
|
|
|
if mat.Settings.Has(materials.MaterialSettings_HasModelMtx) {
|
|
mat.SetUnifMat4("modelMat", &modelMat.Mat4)
|
|
}
|
|
|
|
if mat.Settings.Has(materials.MaterialSettings_HasNormalMtx) {
|
|
normalMat := modelMat.Clone().InvertAndTranspose().ToMat3()
|
|
mat.SetUnifMat3("normalMat", &normalMat)
|
|
}
|
|
|
|
for i := 0; i < len(mesh.SubMeshes); i++ {
|
|
gl.DrawElementsBaseVertexWithOffset(gl.TRIANGLES, mesh.SubMeshes[i].IndexCount, gl.UNSIGNED_INT, uintptr(mesh.SubMeshes[i].BaseIndex), mesh.SubMeshes[i].BaseVertex)
|
|
}
|
|
}
|
|
|
|
func (r *Rend3DGL) DrawVertexArray(mat materials.Material, vao buffers.VertexArray, firstElement int32, elementCount int32) {
|
|
|
|
if vao.Id != r.BoundVaoId {
|
|
vao.Bind()
|
|
r.BoundVaoId = vao.Id
|
|
}
|
|
|
|
if mat.Id != r.BoundMatId {
|
|
mat.Bind()
|
|
r.BoundMatId = mat.Id
|
|
}
|
|
|
|
gl.DrawArrays(gl.TRIANGLES, firstElement, elementCount)
|
|
}
|
|
|
|
func (r *Rend3DGL) DrawCubemap(mesh meshes.Mesh, mat materials.Material) {
|
|
|
|
if mesh.Vao.Id != r.BoundMeshVaoId {
|
|
mesh.Vao.Bind()
|
|
r.BoundMeshVaoId = mesh.Vao.Id
|
|
}
|
|
|
|
if mat.Id != r.BoundMatId {
|
|
mat.Bind()
|
|
r.BoundMatId = mat.Id
|
|
}
|
|
|
|
for i := 0; i < len(mesh.SubMeshes); i++ {
|
|
gl.DrawElementsBaseVertexWithOffset(gl.TRIANGLES, mesh.SubMeshes[i].IndexCount, gl.UNSIGNED_INT, uintptr(mesh.SubMeshes[i].BaseIndex), mesh.SubMeshes[i].BaseVertex)
|
|
}
|
|
}
|
|
|
|
func (r3d *Rend3DGL) FrameEnd() {
|
|
r3d.BoundVaoId = 0
|
|
r3d.BoundMatId = 0
|
|
r3d.BoundMeshVaoId = 0
|
|
}
|
|
|
|
func NewRend3DGL() *Rend3DGL {
|
|
return &Rend3DGL{}
|
|
}
|