Changeset 363
- Timestamp:
- 11/06/02 15:38:55 (6 years ago)
- Files:
-
- trunk/RBRapier/RBRapier/Formats/GeoObject.py (added)
- trunk/RBRapier/RBRapier/Formats/Lightwave/Loader.py (modified) (3 diffs)
- trunk/RBRapier/RBRapier/Formats/Lightwave/MeshedObject.py (modified) (6 diffs)
- trunk/RBRapier/RBRapier/Renderer/Appearance/Materials.py (modified) (1 diff)
- trunk/RBRapier/RBRapier/Renderer/Geometry/VertexArrays.py (modified) (2 diffs)
- trunk/RBRapier/demo/Lightwave/scene.py (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBRapier/RBRapier/Formats/Lightwave/Loader.py
r354 r363 72 72 73 73 class _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 74 107 def __init__(self, Name): 75 108 self.Name = Name … … 77 110 78 111 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() 88 155 89 156 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 186 253 print "Testing..." 187 254 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')) 189 257 print "Test complete." 190 258 trunk/RBRapier/RBRapier/Formats/Lightwave/MeshedObject.py
r362 r363 26 26 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 27 27 28 import weakref29 28 import Loader 30 29 import Numeric … … 38 37 from RBRapier.Renderer.Geometry import VertexArrays 39 38 from RBRapier.Renderer.Geometry import ArrayTraversal 40 from RBRapier.Renderer import SequenceMgr 39 from RBRapier.Renderer.Appearance import Materials 40 41 from RBRapier.Formats import GeoObject 42 43 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 44 #~ Constants / Variables / Etc. 45 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 46 47 _NumericType = VertexArrays._DefautNumericType 41 48 42 49 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 44 51 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 45 52 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 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 def 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 89 59 90 60 class MeshedObjectBuilder(object): … … 93 63 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 94 64 95 GeoObjectFactory = GeoObject 65 GeoObjectFactory = GeoObject.GeoObject 96 66 IndexedTraversal = ArrayTraversal.IndexedCollectionTraversal 97 67 … … 111 81 for Group in self.SurfaceGroups: 112 82 resultgroup = result.AddGroup(Group.Name) 83 resultgroup.AddMaterial(Group.Material) 113 84 for each in Group.Traversals.itervalues(): 114 85 resultgroup.AddTraversal(each) … … 128 99 self.SimpleMesh() 129 100 101 self.ProcessSurfaces() 102 130 103 if optimizetraversal > 0: 131 104 self.OptimizeTraversals(optimizetraversal) 132 105 elif optimizetraversal == 0: 133 106 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 134 148 135 149 def Load(self, FileInFormat): trunk/RBRapier/RBRapier/Renderer/Appearance/Materials.py
r341 r363 41 41 Face = GL.GL_FRONT_AND_BACK 42 42 Shininess = None # 0. 43 Ambient = Vector.ColorVector 4Property('Ambient', lazy=1)44 Diffuse = Vector.ColorVector 4Property('Diffuse', lazy=1)45 Specular = Vector.ColorVector 4Property('Specular', lazy=1)46 Emission = Vector.ColorVector 4Property('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) 47 47 48 48 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ trunk/RBRapier/RBRapier/Renderer/Geometry/VertexArrays.py
r340 r363 28 28 29 29 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 30 #~ Constants / Variables / Etc. 31 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 32 33 _DefautNumericType = Numeric.Float32 34 35 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 30 36 #~ Definitions 31 37 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 38 44 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 39 45 40 _DefaultFormat = Numeric.Float3246 _DefaultFormat = _DefautNumericType 41 47 42 48 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ trunk/RBRapier/demo/Lightwave/scene.py
r362 r363 34 34 35 35 from RBRapier.Formats.Lightwave import MeshedObject 36 from RBRapier.Formats import GeoObject 37 from RBRapier.Renderer.Geometry import ArrayTraversal 36 38 37 39 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 59 61 self.Sequence.AddElement(self.Viewport, -2) 60 62 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) 61 66 #self.GeoObj = self.LigthwaveLWO('data/CHIP.LWO', 1, 0) 62 67 #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)65 68 66 69 #GL.glEnable(GL.GL_NORMALIZE) 67 GL.glEnable(GL.GL_COLOR_MATERIAL)70 #GL.glEnable(GL.GL_COLOR_MATERIAL) 68 71 GL.glEnable(GL.GL_LIGHTING) 69 72 GL.glEnable(GL.GL_LIGHT0) … … 72 75 #for each in self.Sequence.Elements: print each 73 76 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 74 84 def LigthwaveLWO(self, name, *args, **kw): 75 85 builder = MeshedObject.MeshedObjectBuilder() 76 77 from RBRapier.Renderer.Geometry import ArrayTraversal 78 builder.IndexedTraversal = ArrayTraversal.ColoredIndexedCollectionTraversal 79 86 builder.GeoObjectFactory = GeoObject.DefaultGeoObject 80 87 GeoObj = builder.Build(open(name, 'rb'), *args, **kw) 81 88 self.Sequence.AddElement(GeoObj) … … 87 94 GL.glMatrixMode(GL.GL_PROJECTION) 88 95 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) 91 99 GL.glMatrixMode(GL.GL_MODELVIEW) 92 100 GL.glRotatef(1., 0, 1, 0)
