home *** CD-ROM | disk | FTP | other *** search
/ Hackers Magazine 57 / CdHackersMagazineNr57.iso / Software / Multimedia / k3d-setup-0.7.11.0.exe / lib / site-packages / cgkit / mayaspotlight.py < prev    next >
Encoding:
Python Source  |  2007-01-11  |  7.0 KB  |  205 lines

  1. # ***** BEGIN LICENSE BLOCK *****
  2. # Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3. #
  4. # The contents of this file are subject to the Mozilla Public License Version
  5. # 1.1 (the "License"); you may not use this file except in compliance with
  6. # the License. You may obtain a copy of the License at
  7. # http://www.mozilla.org/MPL/
  8. #
  9. # Software distributed under the License is distributed on an "AS IS" basis,
  10. # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11. # for the specific language governing rights and limitations under the
  12. # License.
  13. #
  14. # The Original Code is the Python Computer Graphics Kit.
  15. #
  16. # The Initial Developer of the Original Code is Matthias Baas.
  17. # Portions created by the Initial Developer are Copyright (C) 2004
  18. # the Initial Developer. All Rights Reserved.
  19. #
  20. # Contributor(s):
  21. #
  22. # Alternatively, the contents of this file may be used under the terms of
  23. # either the GNU General Public License Version 2 or later (the "GPL"), or
  24. # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  25. # in which case the provisions of the GPL or the LGPL are applicable instead
  26. # of those above. If you wish to allow use of your version of this file only
  27. # under the terms of either the GPL or the LGPL, and not to allow others to
  28. # use your version of this file under the terms of the MPL, indicate your
  29. # decision by deleting the provisions above and replace them with the notice
  30. # and other provisions required by the GPL or the LGPL. If you do not delete
  31. # the provisions above, a recipient may use your version of this file under
  32. # the terms of any one of the MPL, the GPL or the LGPL.
  33. #
  34. # ***** END LICENSE BLOCK *****
  35. # $Id$
  36.  
  37. import os.path
  38. import protocols
  39. from Interfaces import *
  40. from slots import *
  41. import lookat
  42. from lightsource import LightSource
  43. import ribexport
  44. from math import *
  45.  
  46. # MayaSpotLight
  47. class MayaSpotLight(LightSource):
  48.     """This class represents a spotlight that approximates a Maya spot light.
  49.  
  50.     The direction of the light is the local negative Z axis.
  51.     """
  52.  
  53.     protocols.advise(instancesProvide=[ISceneItem, ribexport.ILightSource])
  54.  
  55.     def __init__(self,
  56.                  name="MayaSpotLight",
  57.                  enabled = True,
  58.                  color = (1,1,1),
  59.                  intensity = 1.0,
  60.                  decayRate = 0,
  61.                  coneAngle = 40,
  62.                  penumbraAngle = 0,
  63.                  dropoff = 0,
  64.  
  65.                  useDepthMapShadows = False,
  66.                  dmapResolution = 512,
  67.                  useMidDistDmap = True,
  68.                  useDmapAutoFocus = True,
  69.                  dmapFocus = 90.0,
  70.                  dmapFilterSize = 1,
  71.                  dmapBias = 0.001,
  72.                  
  73.                  target=vec3(0,0,0),  # spot
  74.                  **params
  75.                  ):
  76.  
  77.         LightSource.__init__(self, name=name, **params)
  78.  
  79. #        target = vec3(target)
  80.  
  81.         # Target
  82. #        self.target_slot = Vec3Slot(target)
  83. #        self.addSlot("target", self.target_slot)
  84.  
  85.         self.enabled = enabled
  86.         self.color = vec3(color)
  87.         self.intensity = float(intensity)
  88.         self.decayRate = int(decayRate)
  89.         self.coneAngle = float(coneAngle)
  90.         self.penumbraAngle = float(penumbraAngle)
  91.         self.dropoff = float(dropoff)
  92.  
  93.         self.useDepthMapShadows = bool(useDepthMapShadows)
  94.         self.dmapResolution = int(dmapResolution)
  95.         self.useMidDistDmap = bool(useMidDistDmap)
  96.         self.useDmapAutoFocus = bool(useDmapAutoFocus)
  97.         self.dmapFocus = float(dmapFocus)
  98.         self.dmapFilterSize = float(dmapFilterSize)
  99.         self.dmapBias = float(dmapBias)
  100.         
  101.     def protocols(self):
  102.         return [ISceneItem]
  103.  
  104.  
  105.     def createPasses(self):
  106.         """Returns a list of RenderPass objects."""
  107.        
  108.         if self.useDepthMapShadows:
  109.             if self.useDmapAutoFocus:
  110.                 fov = max(self.coneAngle, self.coneAngle+2*self.penumbraAngle)
  111.             else:
  112.                 fov = self.dmapFocus
  113.             shadpass = ribexport.ShadowPass(
  114.                                   output = [("shadow.z", "zfile", "z", {})],
  115.                                   light = self,
  116.                                   fov = fov,
  117.                                   resolution = self.dmapResolution,
  118.                                   orientoffset = mat4(1).rotation(pi, vec3(0,1,0))
  119. )
  120.             return [shadpass]
  121.  
  122.         return []
  123.  
  124.     def shaderName(self):
  125.         """Returns the name of the corresponding light shader or None.
  126.         """
  127.         return "mayaspotlight"
  128.  
  129.     def shaderSource(self):
  130.         """Returns surface shader source code as a string or None.
  131.         """
  132.         return """// MayaSpotLight shader
  133.         
  134. light $SHADERNAME(
  135.          uniform color lightcolor = color "rgb" (1, 1, 1);
  136.          uniform float intensity = 1.0;
  137.          uniform float decayRate = 0;
  138.          uniform float coneAngle = 40.0;
  139.          uniform float penumbraAngle = 0.0;
  140.          uniform float dropoff = 0.0;
  141.  
  142.          uniform string dmapName = "";
  143.          uniform float dmapFilterSize = 1;
  144.          uniform float dmapBias = 0.001;
  145.          )
  146. {
  147.   uniform vector axis = normalize(vector "shader" (0,0,-1));
  148.   uniform float coneAngle2 = radians(0.5*coneAngle);
  149.   uniform float penumbra_start = coneAngle2;
  150.   uniform float penumbra_end = coneAngle2;
  151.   if (penumbraAngle<0)
  152.     penumbra_start += radians(penumbraAngle);
  153.   else
  154.     penumbra_end += radians(penumbraAngle);
  155.   uniform float penumbra_range = penumbra_end-penumbra_start;
  156.  
  157.   illuminate(point "shader" (0,0,0), axis, penumbra_end)
  158.   {
  159.     vector L0 = normalize(L);
  160.     float dist = length(vtransform("world", L));
  161.     float att = 1.0;
  162.  
  163.     // Penumbra
  164.     float angle = acos(L0.axis);
  165.     // Linear decay inside the penumbra
  166. //    att *= clamp(1.0-(angle-penumbra_start)/penumbra_range, 0.0, 1.0);
  167.     // Smooth decay inside the penumbra
  168.     att *= 1.0-smoothstep(penumbra_start, penumbra_end, angle);
  169.  
  170.     // Dropoff
  171. //    att *= clamp(2.0-pow(exp(angle),dropoff/255), 0.0, 1.0);
  172.  
  173.     // Decay
  174.     if (dist>1.0)
  175.       att /= pow(dist, decayRate);
  176.  
  177.     Cl = att * intensity * lightcolor;
  178.  
  179.     if (dmapName!="")
  180.       Cl *= 1.0 - shadow(dmapName, Ps, "width", dmapFilterSize, "bias", dmapBias, "samples", 32);
  181.     
  182.   }
  183. }        
  184.         """
  185.  
  186.     def shaderParams(self, passes):
  187.         """Return a dictionary with shader parameters and their values."""
  188.         params = {"intensity":self.intensity,
  189.                   "uniform color lightcolor":self.color,
  190.                   "uniform float decayRate":self.decayRate,
  191.                   "uniform float coneAngle":self.coneAngle,
  192.                   "uniform float penumbraAngle":self.penumbraAngle,
  193.                   "uniform float dropoff":self.dropoff,
  194.                   }
  195.         if self.useDepthMapShadows and passes[0].done():
  196.             zfile = passes[0].realFilename(passes[0].output[0][0])
  197.             mapname = os.path.splitext(zfile)[0]+".map"
  198.             params["uniform string dmapName"] = mapname
  199.             params["uniform float dmapFilterSize"] = self.dmapFilterSize
  200.             params["uniform float dmapBias"] = self.dmapBias
  201.         return params
  202.     
  203.  
  204.         
  205.