Shuvit game master repo. http://shuvit.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ShaderMaterial.py 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from .GameObjectReference import GameObjectReference
  2. from .MaterialManager import MaterialManager
  3. from .Process import Process
  4. import traceback
  5. import sys
  6. import bge
  7. __all__ = ['ShaderMaterial']
  8. class ShaderMaterial(Process):
  9. class InvalidContext(RuntimeError): pass
  10. MaterialManager = MaterialManager
  11. FragmentShader = ''
  12. VertexShader = ''
  13. @property
  14. def owner(self):
  15. return self.reference.object
  16. @property
  17. def invalid(self):
  18. return self.owner is None
  19. def __init__(self, *args, **kargs):
  20. self.MaterialManager = kargs.pop('manager', self.MaterialManager)
  21. self.FragmentShader = kargs.pop('fragment', self.FragmentShader)
  22. self.VertexShader = kargs.pop('vertex', self.VertexShader)
  23. # Fetch the object at initialisation
  24. object = kargs.pop('object', None)
  25. if object is None:
  26. try:
  27. controller = bge.logic.getCurrentController()
  28. object = controller.owner
  29. except SystemError:
  30. self.owner = None
  31. self.error(
  32. self.InvalidContext('No KX_GameObject could be fetched'))
  33. return
  34. self.reference = GameObjectReference(object)
  35. self.init(*args, **kargs)
  36. self.MaterialManager.Register(self)
  37. def filterShader(self, object, mesh, shader):
  38. '''Filter function: how to discriminate the shaders'''
  39. return shader is not None
  40. def getShaders(self):
  41. '''Should return the shaders to keep track of'''
  42. for mesh in self.owner.meshes:
  43. for material in mesh.materials:
  44. shader = material.getShader()
  45. if self.filterShader(object, mesh, shader):
  46. if not shader.isValid():
  47. shader.setSource(
  48. self.VertexShader,
  49. self.FragmentShader,
  50. True)
  51. yield shader
  52. def init(self):
  53. '''This is called on shader instanciation'''
  54. def error(self, error):
  55. '''This is called on error (invalidation)'''
  56. sys.stderr.write('Error occured in object "{}":\n'.format(self.owner))
  57. traceback.print_exc()
  58. def pre_draw_setup_dispatch(self):
  59. for shader in self.getShaders():
  60. self.pre_draw_setup(shader)
  61. def pre_draw_dispatch(self):
  62. for shader in self.getShaders():
  63. self.pre_draw(shader)
  64. def post_draw_dispatch(self):
  65. for shader in self.getShaders():
  66. self.post_draw(shader)