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.

wind.py 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import os
  2. import sys
  3. #shader_components.Wind
  4. from bge import logic
  5. from . import custom_shader_base
  6. shader_utils = custom_shader_base.shader_utils
  7. shader_lib = custom_shader_base.shader_lib
  8. class WindShader(custom_shader_base.CustomShader):
  9. """Create a wind shader for a material."""
  10. def __init__(self, material, texture=None, scale=[1, 1], vertex_lighting=False, normalmap=None, normal_factor=0.0):
  11. super().__init__(material)
  12. self.texture = texture
  13. self.normalmap = normalmap
  14. self.normal_factor = normal_factor
  15. self.scale = scale
  16. # Set shaders
  17. self._vertex_lighting = vertex_lighting
  18. if not self._vertex_lighting:
  19. if normalmap != None:
  20. vs = open(shader_lib + "wind_pixel_lighting_normal.vert").read()
  21. if texture != None:
  22. fs = open(shader_lib + "wind_pixel_lighting_normal.frag").read()
  23. else:
  24. fs = open(shader_lib + "wind_pixel_lighting_color_normal.frag").read()
  25. else:
  26. vs = open(shader_lib + "wind_pixel_lighting.vert").read()
  27. if texture != None:
  28. fs = open(shader_lib + "wind_pixel_lighting.frag").read()
  29. else:
  30. fs = open(shader_lib + "wind_pixel_lighting_color.frag").read()
  31. else:
  32. vs = open(shader_lib + "wind_vertex_lighting.vert").read()
  33. if texture != None:
  34. fs = open(shader_lib + "wind_vertex_lighting.frag").read()
  35. else:
  36. fs = open(shader_lib + "wind_vertex_lighting_color.frag").read()
  37. self.shader.setSource(vs, fs, True)
  38. # Set uniforms
  39. self.shader.setUniformDef('time', logic.CONSTANT_TIMER)
  40. self.shader.setUniformDef('ModelMatrix', logic.MODELMATRIX)
  41. self.shader.setUniformDef('ViewMatrix', logic.VIEWMATRIX)
  42. if normalmap != None:
  43. self.shader.setAttrib(logic.SHD_TANGENT)
  44. self.shader.setSampler('normalmap', self.normalmap)
  45. self.shader.setUniform1f('normalFactor', self.normal_factor)
  46. self.shader.setUniform2f('scale1', *self.scale)
  47. if texture != None:
  48. self.shader.setSampler('diffuse1', self.texture)
  49. self.shader.setUniform2f('scale1', *self.scale)
  50. # Initialise wind uniforms
  51. self._strength = 1.0
  52. self._speed = 1.0
  53. self.direction = [0, 1]
  54. self._deforming = 0.0
  55. self._bending = 0.0
  56. self._ground = 0.0
  57. self.shader.setUniform1f('strength', self.strength)
  58. self.shader.setUniform1f('speed', self.speed)
  59. self.shader.setUniform2f('direction', *self.direction)
  60. self.shader.setUniform1f('deforming', self.deforming)
  61. self.shader.setUniform1f('bending', self.bending)
  62. self.shader.setUniform1f('ground', self.ground)
  63. @property
  64. def strength(self):
  65. return self._strength
  66. @strength.setter
  67. def strength(self, value):
  68. self._strength = value
  69. self.shader.setUniform1f('strength', self._strength)
  70. @property
  71. def speed(self):
  72. return self._speed
  73. @strength.setter
  74. def speed(self, value):
  75. self._speed = value
  76. self.shader.setUniform1f('speed', self._speed)
  77. @property
  78. def deforming(self):
  79. return self._deforming
  80. @deforming.setter
  81. def deforming(self, value):
  82. self._deforming = value
  83. self.shader.setUniform1f('deforming', self._deforming)
  84. @property
  85. def bending(self):
  86. return self._bending
  87. @bending.setter
  88. def bending(self, value):
  89. self._bending = value
  90. self.shader.setUniform1f('bending', self._bending)
  91. @property
  92. def ground(self):
  93. return self._ground
  94. @ground.setter
  95. def ground(self, value):
  96. self._ground = value
  97. self.shader.setUniform1f('ground', self._ground)
  98. def update(self):
  99. """Update shader uniforms."""
  100. scene = logic.getCurrentScene()
  101. shader_utils.update_mist(self.shader, scene)
  102. shader_utils.update_ambient_color(self.shader, scene)
  103. if self.texture == None:
  104. shader_utils.update_diffuse_color(self.shader, self.material)
  105. shader_utils.update_world(self.shader, scene)
  106. shader_utils.update_emission(self.shader, self.material)
  107. shader_utils.update_specular(self.shader, self.material)
  108. shader_utils.update_light_settings(self.shader, scene)
  109. shader_utils.update_light_transform(self.shader, scene)