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

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