Changeset 363

Show
Ignore:
Timestamp:
11/06/02 15:38:55 (6 years ago)
Author:
sholloway
Message:

*** empty log message ***

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBRapier/RBRapier/Formats/Lightwave/Loader.py

    r354 r363  
    7272 
    7373class _LWOSurface(object): 
     74    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     75    #~ Constants / Variables / Etc.  
     76    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     77 
     78    #BaseColor = (255, 255, 255, 0) 
     79    #Flag = 0 
     80 
     81    #iLuminous = 0 
     82    #iDiffuse = 0 
     83    #iSpecular = 0 
     84    #iReflection = 0 
     85    #iTransparency = 0 
     86 
     87    #Luminous = 0. 
     88    #Diffuse = 0. 
     89    #Specular = 0. 
     90    #Reflection = 0. 
     91    #Transparency = 0. 
     92 
     93    #Shininess = 1 
     94 
     95    #ReflectiveMode = 3 
     96    #ReflectiveImage = '' 
     97    #ReflectiveSeamAngle = 0. 
     98    #ReflectiveIndex = 1. 
     99 
     100    #EdgeTransparency = 1. 
     101    #SmoothingAngle = math.pi/2. 
     102 
     103    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     104    #~ Public Methods  
     105    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     106 
    74107    def __init__(self, Name): 
    75108        self.Name = Name 
     
    77110 
    78111    def ReadFormat(self, SurfaceDefChunk): 
    79         print self.Name 
    80         print "TODO: read materials" 
    81         SurfaceDefChunk.skip() 
    82         #try: 
    83         #    while 1: 
    84         #        SubChunk = _LWOSubChunk(SurfaceDefChunk) 
    85         #        print SubChunk.getname(), SubChunk.getsize(), `SubChunk.read()` 
    86         #except EOFError: 
    87         #    pass # end of chunk 
     112        FormatMap = { 
     113            'COLR': ('BaseColor', '>BBBB'), 
     114            'FLAG': ('Flag', '>H'), 
     115 
     116            'LUMI': ('iLuminous', '>h'), 
     117            'DIFF': ('iDiffuse', '>h'), 
     118            'SPEC': ('iSpecular', '>h'), 
     119            'REFL': ('iReflection', '>h'), 
     120            'TRAN': ('iTransparency', '>h'), 
     121 
     122            'VLUM': ('Luminous', '>f'), 
     123            'VDIF': ('Diffuse', '>f'), 
     124            'VSPC': ('Specular', '>f'), 
     125            'VRFL': ('Reflection', '>f'), 
     126            'VTRN': ('Transparency', '>f'), 
     127 
     128            'GLOS': ('Shininess', '>h'), 
     129 
     130            'RFLT': ('ReflectiveMode', '>h'), 
     131            'RIMG': ('ReflectiveImage', _ReadChunkString), 
     132            'RSAN': ('ReflectiveSeamAngle', '>f'), 
     133            'RIND': ('ReflectiveIndex', '>f'), 
     134 
     135            'EDGE': ('EdgeTransparency', '>f'), 
     136            'SMAN': ('SmoothingAngle', '>f'), 
     137            } 
     138        try: 
     139            while 1: 
     140                SubChunk = _LWOSubChunk(SurfaceDefChunk) 
     141                name, fmt = FormatMap.get(SubChunk.getname(), (None, None)) 
     142                if isinstance(fmt, str): 
     143                    value = struct.unpack(fmt, SubChunk.read(SubChunk.getsize())) 
     144                    if len(value) == 1: value = value[0] 
     145                elif callable(fmt): 
     146                    value = fmt(SubChunk) 
     147                else: 
     148                    print "[%s] UNKNOWN: %s %r" % (self.Name, SubChunk.getname(), SubChunk.read()) 
     149                    SubChunk.skip() 
     150                    continue 
     151                if name: setattr(self, name, value) 
     152        except EOFError: 
     153            pass # end of chunk 
     154            #print vars(self).keys() 
    88155 
    89156#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    186253    print "Testing..." 
    187254    test = LightwaveLWOLoader() 
    188     test.ReadFormat(open('data/ki162a.lwo', 'rb')) 
     255    #test.ReadFormat(open('data/ki162a.lwo', 'rb')) 
     256    test.ReadFormat(open('data/fi110a.lwo', 'rb')) 
    189257    print "Test complete." 
    190258 
  • trunk/RBRapier/RBRapier/Formats/Lightwave/MeshedObject.py

    r362 r363  
    2626#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    2727 
    28 import weakref 
    2928import Loader 
    3029import Numeric 
     
    3837from RBRapier.Renderer.Geometry import VertexArrays 
    3938from RBRapier.Renderer.Geometry import ArrayTraversal 
    40 from RBRapier.Renderer import SequenceMgr 
     39from RBRapier.Renderer.Appearance import Materials 
     40 
     41from RBRapier.Formats import GeoObject 
     42 
     43#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     44#~ Constants / Variables / Etc.  
     45#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     46 
     47_NumericType = VertexArrays._DefautNumericType 
    4148 
    4249#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    4451#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    4552 
    46 class GeoObject(SequenceMgr.Sequence): 
    47     class GeoSubGroup(object): 
    48         def __init__(self, geoobj, name): 
    49             self.Traversals = [] 
    50             self.geoobj = weakref.proxy(geoobj) 
    51             self.name = name 
    52  
    53         def AddTraversal(self, traversal): 
    54             self.Traversals.append(traversal) 
    55             self.geoobj.AddElement(traversal) 
    56  
    57         def LoadFinalized(self): 
    58             pass 
    59  
    60     def SetVertices(self, Vertices): 
    61         try: self.RemoveElement(self.Vertices) 
    62         except AttributeError: pass 
    63         self.Vertices = Vertices 
    64         self.AddElement(self.Vertices.Select, -1) 
    65  
    66     def SetNormals(self, Normals): 
    67         try: self.RemoveElement(self.Normals) 
    68         except AttributeError: pass 
    69         self.Normals = Normals 
    70         self.AddElement(self.Normals.Select, -1) 
    71  
    72     def SetTextureCoords(self, TexCoords): 
    73         try: self.RemoveElement(self.TexCoords) 
    74         except AttributeError: pass 
    75         self.TexCoords = TexCoords 
    76         self.AddElement(self.TexCoords.Select, -1) 
    77  
    78     def AddGroup(self, name): 
    79         group = self.GeoSubGroup(self, name) 
    80         try: self.Groups.append(group) 
    81         except AttributeError:  
    82             self.Groups = [group] 
    83         return group 
    84  
    85     def LoadFinalized(self): 
    86         pass 
    87  
    88 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     53def copyattr(From, FromName, To, ToName='', call=lambda x:x): 
     54    ToName = ToName or FromName 
     55    try: value = getattr(From, FromName) 
     56    except AttributeError: return 0 
     57    setattr(To, ToName, call(value)) 
     58    return 1 
    8959 
    9060class MeshedObjectBuilder(object): 
     
    9363    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    9464 
    95     GeoObjectFactory = GeoObject 
     65    GeoObjectFactory = GeoObject.GeoObject 
    9666    IndexedTraversal = ArrayTraversal.IndexedCollectionTraversal 
    9767 
     
    11181            for Group in self.SurfaceGroups: 
    11282                resultgroup = result.AddGroup(Group.Name) 
     83                resultgroup.AddMaterial(Group.Material) 
    11384                for each in Group.Traversals.itervalues(): 
    11485                    resultgroup.AddTraversal(each) 
     
    12899            self.SimpleMesh() 
    129100 
     101        self.ProcessSurfaces() 
     102 
    130103        if optimizetraversal > 0: 
    131104            self.OptimizeTraversals(optimizetraversal) 
    132105        elif optimizetraversal == 0: 
    133106            self.SimpleTraversals() 
     107 
     108    def ProcessSurfaces(self): 
     109        for Group in self.SurfaceGroups: 
     110            Group.Material = Materials.Material() 
     111 
     112            try: 
     113                BaseColor = Numeric.asarray(getattr(Group, 'BaseColor'), _NumericType) 
     114                BaseColor /= Numeric.asarray([255.], _NumericType) 
     115                try: # Convert Transparency to alpha 
     116                    scale = getattr(Group, 'Transparency', None) 
     117                    if scale is None: 
     118                        scale = getattr(Group, 'iTransparency') / 256. 
     119                    BaseColor[3] = 1. - scale 
     120                except AttributeError: pass 
     121 
     122                # Set the ambient color 
     123                Group.Material.Ambient = BaseColor 
     124 
     125                try: # Try to get the diffuse color 
     126                    scale = getattr(Group, 'Diffuse', None) 
     127                    if scale is None: 
     128                        scale = getattr(Group, 'iDiffuse') / 256. 
     129                    Group.Material.Diffuse = BaseColor * scale 
     130                except AttributeError: pass 
     131 
     132                try: # Try to get the Specular color 
     133                    scale = getattr(Group, 'Specular', None) 
     134                    if scale is None: 
     135                        scale = getattr(Group, 'iSpecular') / 256. 
     136                    Group.Material.Specular = BaseColor * scale 
     137                    copyattr(Group, 'Shininess', Group.Material) 
     138                except AttributeError: pass 
     139 
     140                try: # Try to get the Luminous color -- Emissive I'm guessing 
     141                    scale = getattr(Group, 'Luminous', None) 
     142                    if scale is None: 
     143                        scale = getattr(Group, 'iLuminous') / 256. 
     144                    Group.Material.Emission = BaseColor * scale 
     145                except AttributeError: pass 
     146            except AttributeError:  
     147                pass 
    134148 
    135149    def Load(self, FileInFormat): 
  • trunk/RBRapier/RBRapier/Renderer/Appearance/Materials.py

    r341 r363  
    4141    Face = GL.GL_FRONT_AND_BACK 
    4242    Shininess = None # 0. 
    43     Ambient = Vector.ColorVector4Property('Ambient', lazy=1) 
    44     Diffuse = Vector.ColorVector4Property('Diffuse', lazy=1) 
    45     Specular = Vector.ColorVector4Property('Specular', lazy=1) 
    46     Emission = Vector.ColorVector4Property('Emission', lazy=1) 
     43    Ambient = Vector.ColorVectorProperty('Ambient', lazy=1) 
     44    Diffuse = Vector.ColorVectorProperty('Diffuse', lazy=1) 
     45    Specular = Vector.ColorVectorProperty('Specular', lazy=1) 
     46    Emission = Vector.ColorVectorProperty('Emission', lazy=1) 
    4747 
    4848    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  • trunk/RBRapier/RBRapier/Renderer/Geometry/VertexArrays.py

    r340 r363  
    2828 
    2929#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     30#~ Constants / Variables / Etc.  
     31#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     32 
     33_DefautNumericType = Numeric.Float32 
     34 
     35#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    3036#~ Definitions  
    3137#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    3844    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    3945 
    40     _DefaultFormat = Numeric.Float32 
     46    _DefaultFormat = _DefautNumericType  
    4147 
    4248    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
  • trunk/RBRapier/demo/Lightwave/scene.py

    r362 r363  
    3434 
    3535from RBRapier.Formats.Lightwave import MeshedObject 
     36from RBRapier.Formats import GeoObject 
     37from RBRapier.Renderer.Geometry import ArrayTraversal 
    3638 
    3739#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    5961        self.Sequence.AddElement(self.Viewport, -2) 
    6062 
     63        self.GeoObj = self.LigthwaveLWO('data/ki162a.lwo', 1, 3) 
     64        #self.GeoObj = self.LigthwaveLWO('data/fi110a.lwo', 1, 3) 
     65        #self.GeoObj = self.LigthwaveLWO('data/ga102a.lwo', 1, 0) 
    6166        #self.GeoObj = self.LigthwaveLWO('data/CHIP.LWO', 1, 0) 
    6267        #self.GeoObj = self.LigthwaveLWO('data/SIM.LWO', 1, 3) 
    63         #self.GeoObj = self.LigthwaveLWO('data/ki162a.lwo', 1, 3) 
    64         self.GeoObj = self.LigthwaveLWO('data/fi110a.lwo', 1, 3) 
    6568 
    6669        #GL.glEnable(GL.GL_NORMALIZE) 
    67         GL.glEnable(GL.GL_COLOR_MATERIAL) 
     70        #GL.glEnable(GL.GL_COLOR_MATERIAL) 
    6871        GL.glEnable(GL.GL_LIGHTING) 
    6972        GL.glEnable(GL.GL_LIGHT0) 
     
    7275        #for each in self.Sequence.Elements: print each 
    7376 
     77    def StripColoredLigthwaveLWO(self, name, *args, **kw): 
     78        builder = MeshedObject.MeshedObjectBuilder() 
     79        builder.IndexedTraversal = ArrayTraversal.ColoredIndexedCollectionTraversal 
     80        GeoObj = builder.Build(open(name, 'rb'), *args, **kw) 
     81        self.Sequence.AddElement(GeoObj) 
     82        return GeoObj 
     83 
    7484    def LigthwaveLWO(self, name, *args, **kw): 
    7585        builder = MeshedObject.MeshedObjectBuilder() 
    76  
    77         from RBRapier.Renderer.Geometry import ArrayTraversal 
    78         builder.IndexedTraversal = ArrayTraversal.ColoredIndexedCollectionTraversal 
    79  
     86        builder.GeoObjectFactory = GeoObject.DefaultGeoObject 
    8087        GeoObj = builder.Build(open(name, 'rb'), *args, **kw) 
    8188        self.Sequence.AddElement(GeoObj) 
     
    8794        GL.glMatrixMode(GL.GL_PROJECTION) 
    8895        GL.glLoadIdentity() 
    89         #GL.glOrtho(-.02,.02,-0.01,.02,-5,5) 
    90         GL.glOrtho(-.2,.2,-0.1,.2,-5,5) 
     96        #GL.glOrtho(-.01,.01,-0.005,.01,-5,5) 
     97        GL.glOrtho(-.1,.1,-.1,.2,-5,5) 
     98        #GL.glOrtho(-1,1,-0.5,1,-5,5) 
    9199        GL.glMatrixMode(GL.GL_MODELVIEW) 
    92100        GL.glRotatef(1., 0, 1, 0)