rigged_mesh.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // Copyright 2016 The G3N Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package graphic
  5. import (
  6. "github.com/g3n/engine/gls"
  7. "strconv"
  8. "github.com/g3n/engine/core"
  9. "github.com/g3n/engine/math32"
  10. )
  11. // MaxBoneInfluencers is the maximum number of bone influencers per vertex.
  12. const MaxBoneInfluencers = 4
  13. // RiggedMesh is a Mesh associated with a skeleton.
  14. type RiggedMesh struct {
  15. *Mesh // Embedded mesh
  16. skeleton *Skeleton
  17. mBones gls.Uniform
  18. }
  19. // NewRiggedMesh returns a new rigged mesh.
  20. func NewRiggedMesh(mesh *Mesh) *RiggedMesh {
  21. rm := new(RiggedMesh)
  22. rm.Mesh = mesh
  23. rm.SetIGraphic(rm)
  24. rm.mBones.Init("mBones")
  25. rm.ShaderDefines.Set("BONE_INFLUENCERS", strconv.Itoa(MaxBoneInfluencers))
  26. rm.ShaderDefines.Set("TOTAL_BONES", "0")
  27. return rm
  28. }
  29. // SetSkeleton sets the skeleton used by the rigged mesh.
  30. func (rm *RiggedMesh) SetSkeleton(sk *Skeleton) {
  31. rm.skeleton = sk
  32. rm.ShaderDefines.Set("TOTAL_BONES", strconv.Itoa(len(rm.skeleton.Bones())))
  33. }
  34. // SetSkeleton returns the skeleton used by the rigged mesh.
  35. func (rm *RiggedMesh) Skeleton() *Skeleton {
  36. return rm.skeleton
  37. }
  38. // RenderSetup is called by the renderer before drawing the geometry.
  39. func (rm *RiggedMesh) RenderSetup(gs *gls.GLS, rinfo *core.RenderInfo) {
  40. // Call base mesh's RenderSetup
  41. rm.Mesh.RenderSetup(gs, rinfo)
  42. // Get inverse matrix world
  43. var invMat math32.Matrix4
  44. node := rm.GetNode()
  45. nMW := node.MatrixWorld()
  46. err := invMat.GetInverse(&nMW)
  47. if err != nil {
  48. log.Error("Skeleton.BoneMatrices: inverting matrix failed!")
  49. }
  50. // Transfer bone matrices
  51. boneMatrices := rm.skeleton.BoneMatrices(&invMat)
  52. location := rm.mBones.Location(gs)
  53. gs.UniformMatrix4fv(location, int32(len(boneMatrices)), false, &boneMatrices[0][0])
  54. }