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 / worldobject.py < prev    next >
Encoding:
Python Source  |  2007-01-11  |  7.7 KB  |  216 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: worldobject.py,v 1.3 2005/08/15 15:47:56 mbaas Exp $
  36.  
  37. ## \file worldobject.py
  38. ## Contains the WorldObject class.
  39.  
  40. #from _core import WorldObject as _WorldObject
  41. #from _core import _WorldObjectChildIterator
  42. import _core
  43. from Interfaces import ISceneItem, ISceneItemContainer
  44. import protocols
  45. import scene
  46. from cgtypes import *
  47.  
  48. # WorldObject
  49. class WorldObject(_core.WorldObject):
  50.     """The base class for a world object.
  51.  
  52.     A world object is a scene item that has a position and orientation in
  53.     space and that can usually be represented by 3D geometry.
  54.  
  55.     Attributes:
  56.  
  57.     - name
  58.     - transform
  59.     - pos
  60.     - rot
  61.     - scale
  62.     - pivot
  63.     - mass
  64.  
  65.     If you access an attribute that's actually stored in the geom then
  66.     the attribute access is forwarded to the geom. This means you can
  67.     access the geom slots through the world object (for example, if you
  68.     attach a sphere geom to a world object, then the world object "has"
  69.     an attribute 'radius').
  70.     """
  71.  
  72.     protocols.advise(instancesProvide=[ISceneItem, ISceneItemContainer])
  73.     
  74.     def __init__(self,
  75.                  name="object",
  76.                  transform = None,
  77.                  pos = None, rot = None, scale = None,
  78.                  pivot = None,
  79.                  offsetTransform = None,
  80.                  parent = None,
  81.                  mass = None,
  82.                  material = None,
  83.                  visible = True,
  84.                  linearvel = None,
  85.                  angularvel = None,
  86.                  auto_insert = True):
  87.         """Constructor.
  88.  
  89.         \param name (\c str) Object name
  90.         \param transform (\c mat4) Initial transform
  91.         \param pos (\c vec3) Initial position
  92.         \param rot (\c mat3) Initial rotation
  93.         \param scale (\c vec3) Initial scaling
  94.         \param pivot (\c vec3) Initial pivot point (takes precedence over offsetTransform)
  95.         \param offsetTransform (\c mat4) Initial offset transform
  96.         \param parent (\c WorldObject or \c str) Parent object or None
  97.         \param mass (\c float) Total mass
  98.         \param material (\c Material) Material class (or a sequence of materials)
  99.         \param visible (\c Bool) Visibility flag
  100.         \param linearvel (\c vec3) Linear velocity
  101.         \param angularvel (\c vec3) Angular velocity
  102.         \param auto_insert (\c bool) If True, the object is inserted into the
  103.                         scene automatically
  104.         """
  105.         exec _preInitWorldObject
  106.         _core.WorldObject.__init__(self, name)
  107.  
  108.         _initWorldObject(self, name=name,
  109.                          transform=transform, pos=pos, rot=rot,
  110.                          scale=scale, pivot=pivot,
  111.                          offsetTransform=offsetTransform,
  112.                          parent=parent,
  113.                          mass=mass, material=material,
  114.                          visible=visible,
  115.                          linearvel=linearvel, angularvel=angularvel,
  116.                          auto_insert=auto_insert)
  117.         
  118. #        if offsetTransform!=None:
  119. #            self.setOffsetTransform(offsetTransform)
  120. #        if pivot!=None:
  121. #            self.pivot = pivot
  122. #        if transform!=None:
  123. #            self.transform = transform
  124. #        if pos!=None:
  125. #            self.pos = pos
  126. #        if rot!=None:
  127. #            self.rot = rot
  128. #        if scale!=None:
  129. #            self.scale = scale
  130. #        if mass!=None:
  131. #            self.mass = mass
  132. #        if material!=None:
  133. #            self.material = material
  134.  
  135. #        if auto_insert:
  136. #            scene.getScene().insert(self)
  137.  
  138.     def protocols(self):
  139.         return [ISceneItem, ISceneItemContainer]
  140.  
  141.     def __getattr__(self, name):
  142.         if self.geom!=None and name[:2]!="__":
  143.             if hasattr(self.geom, name):
  144.                 return getattr(self.geom, name)
  145.             elif self.geom.hasSlot(name):
  146.                 return self.geom.slot(name).getValue()
  147. #        if self.geom!=None and self.geom.hasSlot(name):
  148. #            exec "res=self.geom.%s"%name
  149. #            return res
  150.         raise AttributeError, 'Object "%s" has no attribute "%s"'%(self.name, name)
  151.     
  152.     def __setattr__(self, name, val):
  153.         if self.geom!=None and self.geom.hasSlot(name):
  154. #            print "self.geom.%s=%s"%(name, val)
  155.             exec "self.geom.%s=%s"%(name, val)
  156.         else:
  157.             _core.WorldObject.__setattr__(self, name, val)
  158.         
  159.  
  160. # This string has to be executed at the beginning of a constructor
  161. # that has to initialize a _core.WorldObject object.
  162. _preInitWorldObject = """
  163. if auto_insert:
  164.     if parent==None:
  165.         parent = scene.getScene().worldRoot()
  166.     else:
  167.         if type(parent) in [str, unicode]:
  168.             parent = scene.getScene().worldObject(parent)
  169.     name = parent.makeChildNameUnique(name)
  170. """
  171.     
  172. # Common WorldObject initializations
  173. def _initWorldObject(self, name, parent, transform=None,
  174.                      pos=None, rot=None, scale=None,
  175.                      pivot=None, offsetTransform=None,
  176.                      mass=None, material=None, visible=True,
  177.                      linearvel=None, angularvel=None,
  178.                      auto_insert=True):
  179.     """Helper function for usage in constructors.
  180.     """
  181.     if offsetTransform!=None:
  182.         self.setOffsetTransform(offsetTransform)
  183.     if pivot!=None:
  184.         self.pivot = vec3(pivot)
  185.     if transform!=None:
  186.         self.transform = transform
  187.     if pos!=None:
  188.         self.pos = vec3(pos)
  189.     if rot!=None:
  190.         self.rot = mat3(rot)
  191.     if scale!=None:
  192.         self.scale = vec3(scale)
  193.     if mass!=None:
  194.         self.mass = mass
  195.     if material!=None:
  196.         try:
  197.             # Check if material is a sequence or not. If it is not a
  198.             # sequence the following line will raise an exception.
  199.             len(material)
  200.         except:
  201.             material = [material]
  202.         self.setNumMaterials(len(material))
  203.         for i,mat in enumerate(material):
  204.             self.setMaterial(mat, i)
  205.     if linearvel!=None:
  206.         self.linearvel = vec3(linearvel)
  207.     if angularvel!=None:
  208.         self.angularvel = vec3(angularvel)
  209.  
  210.     self.visible = visible
  211.  
  212.     if auto_insert:
  213.         parent.addChild(self)
  214. #        scene.getScene().insert(self)
  215.  
  216.