X-Git-Url: https://git.ao2.it/vrm.git/blobdiff_plain/20db3c0178285331d20f3111393ce9ecb601e612..370e7d2e378c3348f51e3ef4afb8c4b2e658605b:/vrm.py diff --git a/vrm.py b/vrm.py index 7324efc..6a69a66 100755 --- a/vrm.py +++ b/vrm.py @@ -84,6 +84,8 @@ __bpydoc__ = """\ # * View frustum clipping # * Scene clipping done using bounding box instead of object center # * Fix camera type selection for blender>2.43 (Thanks to Thomas Lachmann) +# * Compatibility with python 2.3 +# * Process only object that are on visible layers. # # --------------------------------------------------------------------- @@ -93,6 +95,13 @@ from Blender.Mathutils import * from math import * import sys, time +def uniq(alist): + tmpdict = dict() + return [tmpdict.setdefault(e,e) for e in alist if e not in tmpdict] + # in python > 2.4 we ca use the following + #return [ u for u in alist if u not in locals()['_[1]'] ] + + # Constants EPS = 10e-5 @@ -684,9 +693,13 @@ class HSR: negVertList.append(V1) - # uniq - posVertList = [ u for u in posVertList if u not in locals()['_[1]'] ] - negVertList = [ u for u in negVertList if u not in locals()['_[1]'] ] + # uniq for python > 2.4 + #posVertList = [ u for u in posVertList if u not in locals()['_[1]'] ] + #negVertList = [ u for u in negVertList if u not in locals()['_[1]'] ] + + # a more portable way + posVertList = uniq(posVertList) + negVertList = uniq(negVertList) # If vertex are all on the same half-space, return @@ -1873,18 +1886,7 @@ class Renderer: # Render from the currently active camera #self.cameraObj = self._SCENE.getCurrentCamera() - # Get the list of lighting sources - obj_lst = self._SCENE.getChildren() - self.lights = [ o for o in obj_lst if o.getType() == 'Lamp'] - - # When there are no lights we use a default lighting source - # that have the same position of the camera - if len(self.lights) == 0: - l = Lamp.New('Lamp') - lobj = Object.New('Lamp') - lobj.loc = self.cameraObj.loc - lobj.link(l) - self.lights.append(lobj) + self.lights = [] ## @@ -1973,6 +1975,10 @@ class Renderer: # global processing of the scene + self._filterHiddenObjects(workScene) + + self._buildLightSetup(workScene) + self._doSceneClipping(workScene) self._doConvertGeometricObjsToMesh(workScene) @@ -1985,6 +1991,7 @@ class Renderer: # Per object activities Objects = workScene.getChildren() + print "Total Objects: %d" % len(Objects) for i,obj in enumerate(Objects): print "\n\n-------" @@ -2097,6 +2104,38 @@ class Renderer: # Scene methods + def _filterHiddenObjects(self, scene): + """Discard object that are on hidden layers in the scene. + """ + + Objects = scene.getChildren() + + visible_obj_list = [ obj for obj in Objects if + set(obj.layers).intersection(set(scene.getLayers())) ] + + for o in Objects: + if o not in visible_obj_list: + scene.unlink(o) + + scene.update() + + + + def _buildLightSetup(self, scene): + # Get the list of lighting sources + obj_lst = scene.getChildren() + self.lights = [ o for o in obj_lst if o.getType() == 'Lamp' ] + + # When there are no lights we use a default lighting source + # that have the same position of the camera + if len(self.lights) == 0: + l = Lamp.New('Lamp') + lobj = Object.New('Lamp') + lobj.loc = self.cameraObj.loc + lobj.link(l) + self.lights.append(lobj) + + def _doSceneClipping(self, scene): """Clip whole objects against the View Frustum. @@ -2114,6 +2153,7 @@ class Renderer: fovy = fovy * 360.0/pi Objects = scene.getChildren() + for o in Objects: if o.getType() != 'Mesh': continue; @@ -2158,6 +2198,7 @@ class Renderer: #geometricObjTypes = ['Mesh', 'Surf', 'Curve'] Objects = scene.getChildren() + objList = [ o for o in Objects if o.getType() in geometricObjTypes ] for obj in objList: old_obj = obj @@ -2204,6 +2245,7 @@ class Renderer: Objects = scene.getChildren() + #Objects.sort(by_obj_center_pos) Objects.sort(by_nearest_bbox_point)