From 0e2e9007b628153bfbf0178e21911391cea75293 Mon Sep 17 00:00:00 2001 From: bloeys Date: Sat, 27 Nov 2021 22:18:51 +0400 Subject: [PATCH] Day8: Assimp+Basic Lights+Asserts+vert normals&colors --- asserts/asserts.go | 18 ++++++ buffers/buffers.go | 6 ++ consts/flags_debug.go | 7 +++ consts/flags_release.go | 7 +++ go.mod | 5 +- go.sum | 2 + imgui.ini | 5 ++ main.go | 103 +++++++++++++++++++++++++---------- res/models/color-cube.fbx | Bin 0 -> 15372 bytes res/models/loader.go | 73 ------------------------- res/shaders/simple.frag.glsl | 17 ++++-- res/shaders/simple.vert.glsl | 16 ++++-- 12 files changed, 146 insertions(+), 113 deletions(-) create mode 100755 asserts/asserts.go create mode 100755 consts/flags_debug.go create mode 100755 consts/flags_release.go create mode 100755 imgui.ini create mode 100755 res/models/color-cube.fbx delete mode 100755 res/models/loader.go diff --git a/asserts/asserts.go b/asserts/asserts.go new file mode 100755 index 0000000..6b0d5b9 --- /dev/null +++ b/asserts/asserts.go @@ -0,0 +1,18 @@ +package asserts + +import ( + "github.com/bloeys/go-sdl-engine/consts" + "github.com/bloeys/go-sdl-engine/logging" +) + +func True(check bool, msg string) { + if consts.Debug && !check { + logging.ErrLog.Panicln(msg) + } +} + +func False(check bool, msg string) { + if consts.Debug && check { + logging.ErrLog.Panicln(msg) + } +} diff --git a/buffers/buffers.go b/buffers/buffers.go index 9396a9b..9edc4ef 100755 --- a/buffers/buffers.go +++ b/buffers/buffers.go @@ -21,11 +21,14 @@ const ( BufTypeVertPos BufTypeColor BufTypeIndex + BufTypeNormal ) func (bt BufType) GetBufferGLType() BufGLType { switch bt { + case BufTypeNormal: + fallthrough case BufTypeColor: fallthrough case BufTypeVertPos: @@ -68,6 +71,7 @@ func (b *Buffer) Deactivate() { type BufferObject struct { VAOID uint32 VertPosBuf *Buffer + NormalBuf *Buffer ColorBuf *Buffer IndexBuf *Buffer } @@ -133,6 +137,8 @@ func (bo *BufferObject) SetBuffer(buf *Buffer) { switch buf.Type { case BufTypeVertPos: bo.VertPosBuf = buf + case BufTypeNormal: + bo.NormalBuf = buf case BufTypeColor: bo.ColorBuf = buf case BufTypeIndex: diff --git a/consts/flags_debug.go b/consts/flags_debug.go new file mode 100755 index 0000000..142cb5a --- /dev/null +++ b/consts/flags_debug.go @@ -0,0 +1,7 @@ +//go:build debug + +package consts + +const ( + Debug = true +) diff --git a/consts/flags_release.go b/consts/flags_release.go new file mode 100755 index 0000000..66d1ed0 --- /dev/null +++ b/consts/flags_release.go @@ -0,0 +1,7 @@ +//go:build !debug + +package consts + +const ( + Debug = false +) diff --git a/go.mod b/go.mod index cc99228..a2ab2f6 100755 --- a/go.mod +++ b/go.mod @@ -11,4 +11,7 @@ require ( github.com/inkyblackness/imgui-go/v4 v4.3.0 ) -require github.com/inkyblackness/imgui-go v1.12.0 // indirect +require ( + github.com/bloeys/assimp-go v0.2.0 // indirect + github.com/inkyblackness/imgui-go v1.12.0 // indirect +) diff --git a/go.sum b/go.sum index f07240f..67ee2b1 100755 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/bloeys/assimp-go v0.2.0 h1:CiqxTXsjUlNaCDhULmqZ2swsCsRahmg9BaOFA9a8vQU= +github.com/bloeys/assimp-go v0.2.0/go.mod h1:b9nj+ANpGPQ0mZ2r4Ma6nH1ExBTs9WIJF0N9zk1dWyk= github.com/bloeys/gglm v0.1.1 h1:juLE2OqobKKamMq7IKkplOJcZaM45CAcmbS0rCND3Hc= github.com/bloeys/gglm v0.1.1/go.mod h1:qwJQ0WzV191wAMwlGicbfbChbKoSedMk7gFFX6GnyOk= github.com/bloeys/gglm v0.2.4 h1:dHw+VHTdkr1GCsFWPJ7LAiEH1Ry+p4ReGhVK0/ssopo= diff --git a/imgui.ini b/imgui.ini new file mode 100755 index 0000000..29f0279 --- /dev/null +++ b/imgui.ini @@ -0,0 +1,5 @@ +[Window][Debug##Default] +Pos=809,63 +Size=449,377 +Collapsed=0 + diff --git a/main.go b/main.go index 26bb36a..4ce467e 100755 --- a/main.go +++ b/main.go @@ -1,13 +1,15 @@ package main import ( + "fmt" "runtime" + "github.com/bloeys/assimp-go/asig" "github.com/bloeys/gglm/gglm" + "github.com/bloeys/go-sdl-engine/asserts" "github.com/bloeys/go-sdl-engine/buffers" "github.com/bloeys/go-sdl-engine/input" "github.com/bloeys/go-sdl-engine/logging" - "github.com/bloeys/go-sdl-engine/res/models" "github.com/bloeys/go-sdl-engine/shaders" "github.com/go-gl/gl/v4.1-core/gl" "github.com/inkyblackness/imgui-go/v4" @@ -77,11 +79,15 @@ func main() { loadBuffers() initImGUI() - simpleShader.SetAttribute("vertPos", bo, bo.VertPosBuf) - simpleShader.EnableAttribute("vertPos") + //Enable vertex attributes + simpleShader.SetAttribute("vertPosIn", bo, bo.VertPosBuf) + simpleShader.EnableAttribute("vertPosIn") - // simpleShader.SetAttribute("vertColor", bo, bo.ColorBuf) - // simpleShader.EnableAttribute("vertColor") + simpleShader.SetAttribute("vertColorIn", bo, bo.ColorBuf) + simpleShader.EnableAttribute("vertColorIn") + + simpleShader.SetAttribute("vertNormalIn", bo, bo.NormalBuf) + simpleShader.EnableAttribute("vertNormalIn") //Movement, scale and rotation translationMat := gglm.NewTranslationMat(gglm.NewVec3(0, 0, 0)) @@ -101,6 +107,10 @@ func main() { projMat := gglm.Perspective(45*gglm.Deg2Rad, float32(winWidth)/float32(winHeight), 0.1, 20) simpleShader.SetUnifMat4("projMat", projMat) + //Lights + simpleShader.SetUnifVec3("lightPos1", &lightPos1) + simpleShader.SetUnifVec3("lightColor1", &lightColor1) + //Game loop for isRunning { @@ -189,36 +199,58 @@ func loadShaders() { imShader.Link() } +func flattenVec3(vec3s []gglm.Vec3) []float32 { + + floats := make([]float32, len(vec3s)*3) + for i := 0; i < len(vec3s); i++ { + floats[i*3+0] = vec3s[i].X() + floats[i*3+1] = vec3s[i].Y() + floats[i*3+2] = vec3s[i].Z() + } + + return floats +} + +func flattenVec4(vec4s []gglm.Vec4) []float32 { + + floats := make([]float32, len(vec4s)*4) + for i := 0; i < len(vec4s); i++ { + floats[i*4+0] = vec4s[i].X() + floats[i*4+1] = vec4s[i].Y() + floats[i*4+2] = vec4s[i].Z() + floats[i*4+3] = vec4s[i].W() + } + + return floats +} + +func flattenFaces(faces []asig.Face) []uint32 { + + asserts.True(len(faces[0].Indices) == 3, fmt.Sprintf("Face doesn't have 3 indices. Index count: %v\n", len(faces[0].Indices))) + + uints := make([]uint32, len(faces)*3) + for i := 0; i < len(faces); i++ { + uints[i*3+0] = uint32(faces[i].Indices[0]) + uints[i*3+1] = uint32(faces[i].Indices[1]) + uints[i*3+2] = uint32(faces[i].Indices[2]) + } + + return uints +} + func loadBuffers() { - vertices := []float32{ - -0.5, 0.5, 0, - 0.5, 0.5, 0, - 0.5, -0.5, 0, - -0.5, -0.5, 0, - } - // colors := []float32{ - // 1, 0, 0, - // 0, 0, 1, - // 0, 0, 1, - // 0, 0, 1, - // } - indices := []uint32{0, 1, 3, 1, 2, 3} - - //Load obj - objInfo, err := models.LoadObj("./res/models/obj.obj") + scene, release, err := asig.ImportFile("./res/models/color-cube.fbx", asig.PostProcessTriangulate) if err != nil { - panic(err) + logging.ErrLog.Panicln("Failed to load model. Err: " + err.Error()) } - // logging.InfoLog.Printf("%v", objInfo.TriIndices) - - vertices = objInfo.VertPos - indices = objInfo.TriIndices + release() bo = buffers.NewBufferObject() - bo.GenBuffer(vertices, buffers.BufUsageStatic, buffers.BufTypeVertPos, buffers.DataTypeVec3) - // bo.GenBuffer(colors, buffers.BufUsageStatic, buffers.BufTypeColor, buffers.DataTypeVec3) - bo.GenBufferUint32(indices, buffers.BufUsageStatic, buffers.BufTypeIndex, buffers.DataTypeUint32) + bo.GenBuffer(flattenVec3(scene.Meshes[0].Vertices), buffers.BufUsageStatic, buffers.BufTypeVertPos, buffers.DataTypeVec3) + bo.GenBuffer(flattenVec3(scene.Meshes[0].Normals), buffers.BufUsageStatic, buffers.BufTypeNormal, buffers.DataTypeVec3) + bo.GenBuffer(flattenVec4(scene.Meshes[0].ColorSets[0]), buffers.BufUsageStatic, buffers.BufTypeColor, buffers.DataTypeVec4) + bo.GenBufferUint32(flattenFaces(scene.Meshes[0].Faces), buffers.BufUsageStatic, buffers.BufTypeIndex, buffers.DataTypeUint32) } func initImGUI() { @@ -380,9 +412,12 @@ func handleWindowResize(newWinWidth, newWinHeight int32) { var time uint64 = 0 var name string = "" -var ambientColor gglm.Vec3 +var ambientColor gglm.Vec3 = *gglm.NewVec3(1, 1, 1) var ambientColorStrength float32 = 1 +var lightPos1 gglm.Vec3 = *gglm.NewVec3(2, 2, 0) +var lightColor1 gglm.Vec3 = *gglm.NewVec3(1, 1, 1) + func runGameLogic() { if input.KeyDown(sdl.K_w) { @@ -428,6 +463,14 @@ func runGameLogic() { simpleShader.SetUnifFloat32("ambientStrength", ambientColorStrength) } + if imgui.SliderFloat3("Light Pos 1", &lightPos1.Data, -10, 10) { + simpleShader.SetUnifVec3("lightPos1", &lightPos1) + } + + if imgui.SliderFloat3("Light Color 1", &lightColor1.Data, 0, 1) { + simpleShader.SetUnifVec3("lightColor1", &lightColor1) + } + imgui.Render() } diff --git a/res/models/color-cube.fbx b/res/models/color-cube.fbx new file mode 100755 index 0000000000000000000000000000000000000000..bda8866f5bf864cfa59637d798a4212384a45380 GIT binary patch literal 15372 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