class LightingChecker(SceneIterator): progress_thread_action = "Checking" def __init__(self): self.valid_lighting = False self.ObjectsChecked = ExportCache("Objects") self.LampsChecked = ExportCache("Lamps") self.MaterialsChecked = ExportCache("Materials") self.CheckedDuplis = ExportCache("Duplis") def isValid(self): return self.valid_lighting def handleDuplis(self, obj, particle_system=None): if self.CheckedDuplis.have(obj): return self.CheckedDuplis.add(obj, obj) try: obj.dupli_list_create(self.scene, 'RENDER') if not obj.dupli_list: raise Exception('cannot create dupli list for object %s' % obj.name) except Exception as err: indigo_log('%s'%err) return for dupli_ob in obj.dupli_list: if dupli_ob.object.type not in self.supported_mesh_types: continue if not indigo_visible(self.scene, dupli_ob.object, is_dupli=True): continue self.handleMesh(dupli_ob.object) obj.dupli_list_clear() def handleMesh(self, obj): if self.ObjectsChecked.have(obj): return emitting_object = False for ms in obj.material_slots: if self.MaterialsChecked.have(ms.material): continue self.MaterialsChecked.add(ms.material, ms.material) if ms.material == None: continue if ms.material.indigo_material == None: continue iem = ms.material.indigo_material.indigo_material_emission mat_test = iem.emission_enabled if iem.emission_enabled: mat_test &= self.check_spectrum(iem, 'emission') if iem.emission_scale: mat_test &= (iem.emission_scale_value > 0.0) else: mat_test &= (iem.emit_power > 0.0 and iem.emit_gain_val > 0.0) mat_test &= self.scene.indigo_lightlayers.is_enabled(iem.emit_layer) mat_test &= self.scene.indigo_lightlayers.gain_for_layer(iem.emit_layer) > 0.0 emitting_object |= mat_test self.ObjectsChecked.add(obj, obj) self.valid_lighting |= emitting_object def handleLamp(self, obj): if self.LampsChecked.have(obj): return self.valid_lighting |= obj.data.type in ('SUN', 'HEMI') self.LampsChecked.add(obj, obj) def check_spectrum(self, obj, prefix): valid_sp = False sp_type = getattr(obj, '%s_SP_type' % prefix) if sp_type == 'uniform': valid_sp = getattr(obj, '%s_SP_uniform_val' % prefix) > 0.0 elif sp_type == 'rgb': valid_sp = getattr(obj, '%s_SP_rgb' % prefix).v > 0.0 elif sp_type == 'blackbody': valid_sp = getattr(obj, '%s_SP_blackbody_gain' % prefix) > 0.0 return valid_sp def canAbort(self): return self.valid_lighting