CapsuleShadowMap.hx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package h3d.pass;
  2. class CapsuleShadowMap extends CubeShadowMap {
  3. var pshader : h3d.shader.PointShadow;
  4. public function new( light : h3d.scene.Light, useWorldDist : Bool ) {
  5. super(light, useWorldDist);
  6. shader = pshader = new h3d.shader.PointShadow();
  7. }
  8. override function set_mode(m:Shadows.RenderMode) {
  9. pshader.enable = m != None && enabled;
  10. return mode = m;
  11. }
  12. override function set_enabled(b:Bool) {
  13. pshader.enable = b && mode != None;
  14. return enabled = b;
  15. }
  16. override function getShadowTex() {
  17. return pshader.shadowMap;
  18. }
  19. override function syncShader(texture) {
  20. if( texture == null )
  21. throw "assert";
  22. var capsuleLight = cast(light, h3d.scene.pbr.CapsuleLight);
  23. pshader.shadowMap = texture;
  24. pshader.shadowBias = bias;
  25. pshader.shadowPower = power;
  26. pshader.lightPos = light.getAbsPos().getPosition();
  27. pshader.zFar = capsuleLight.range + capsuleLight.length;
  28. // ESM
  29. pshader.USE_ESM = samplingKind == ESM;
  30. pshader.shadowPower = power;
  31. // PCF
  32. pshader.USE_PCF = samplingKind == PCF;
  33. pshader.pcfScale = pcfScale / 100.0;
  34. pshader.pcfQuality = pcfQuality;
  35. }
  36. override function createCollider(light : h3d.scene.Light) {
  37. var absPos = light.getAbsPos();
  38. var capsuleLight = cast(light, h3d.scene.pbr.CapsuleLight);
  39. // TODO : Optimize culling
  40. return new h3d.col.Sphere(absPos.tx, absPos.ty, absPos.tz, capsuleLight.range + capsuleLight.length * 0.5);
  41. }
  42. override function cull(lightCollider : h3d.col.Collider, col : h3d.col.Collider ) {
  43. var sphere = cast(lightCollider, h3d.col.Sphere);
  44. return col.inSphere(sphere);
  45. }
  46. override function updateLightCameraNearFar(light : h3d.scene.Light) {
  47. var capsuleLight = cast(light, h3d.scene.pbr.CapsuleLight);
  48. lightCamera.zFar = capsuleLight.range;
  49. lightCamera.zNear = capsuleLight.zNear;
  50. }
  51. }