rendered paste body#!BPY"""Name: 'FlashGen'Blender: 237Group: 'Animation'Tip: 'Creates flashing lights replicating lightning'"""import sysimport Blenderimport mathfrom Blender import Draw, BGL, Window, Ipo, Object, Lamp, Mathutilsfrom Blender.BGL import *EVENT_radius = 10EVENT_floor = 11EVENT_ceiling = 12EVENT_intensity_fallOff = 13EVENT_light_fallOff = 14EVENT_max_intensity = 15EVENT_strike_frequency = 16EVENT_secondaryStrike_max = 17EVENT_secondaryStrike_time = 18EVENT_secondaryStrike_fallOff = 19EVENT_start_frame = 20EVENT_end_frame = 21EVENT_startFlash = 22EVENT_exit = 23EVENT_Text = 24EVENT_create_emitter = 25Object_radius = Draw.Create(0.0)Object_floor = Draw.Create(0.0)Object_ceiling = Draw.Create(0.0)Object_intensity_fallOff = Draw.Create(0.0)Object_light_fallOff = Draw.Create(0.0)Object_max_intensity = Draw.Create(0.0)Object_strike_frequency = Draw.Create(0.0)Object_secondaryStrike_max = Draw.Create(0.0)Object_secondaryStrike_time = Draw.Create(0.0)Object_secondaryStrike_fallOff = Draw.Create(0.0)Object_start_frame = Draw.Create(0.0)Object_end_frame = Draw.Create(0.0)Object_startFlash = Draw.Create(0.0)Object_exit = Draw.Create(0.0)Object_Text = Draw.Create("")def draw(): global EVENT_radius global EVENT_floor global EVENT_ceiling global EVENT_intensity_fallOff global EVENT_light_fallOff global EVENT_max_intensity global EVENT_strike_frequency global EVENT_secondaryStrike_max global EVENT_secondaryStrike_time global EVENT_secondaryStrike_fallOff global EVENT_start_frame global EVENT_end_frame global EVENT_startFlash global EVENT_exit global EVENT_Text global EVENT_create_emitter global Object_radius global Object_floor global Object_ceiling global Object_intensity_fallOff global Object_light_fallOff global Object_max_intensity global Object_strike_frequency global Object_secondaryStrike_max global Object_secondaryStrike_time global Object_secondaryStrike_fallOff global Object_start_frame global Object_end_frame global Object_startFlash global Object_exit global Object_Text global Object_create_emitter BGL.glClearColor(0.500000, 0.500000, 0.500000, 0.0) BGL.glClear(GL_COLOR_BUFFER_BIT) BGL.glColor3f(0.000000, 0.000000, 0.000000) Object_radius = Draw.Slider("Rig Radius", EVENT_radius, 24, 368, 300, 20, Object_radius.val, 0.000000, 300.000000, 1, "the radius of the circle from which flashes will be generated") Object_floor = Draw.Slider("Rig Floor", EVENT_floor, 24, 344, 300, 20, Object_floor.val, 0.000000, 300.000000, 1, "the lowest height flashes will be generated from") Object_ceiling = Draw.Slider("Rig Ceiling", EVENT_ceiling, 24, 320, 300, 20, Object_ceiling.val, 0.000000, 300.000000, 1, "the maximum height from which flashes will be generated") Object_intensity_fallOff = Draw.Slider("Height Intensity Falloff", EVENT_intensity_fallOff, 24, 288, 300, 20, Object_intensity_fallOff.val, 0.000000, 1.000000, 1, "intensity variance between floor and ceiling") Object_light_fallOff = Draw.Slider("Light FallOff Speed", EVENT_light_fallOff, 24, 264, 300, 20, Object_light_fallOff.val, 0.000000, 100.000000, 1, "the number of frames it takes for the flash intensity to drop to zero") Object_max_intensity = Draw.Slider("Primary Strike Intensity", EVENT_max_intensity, 24, 232, 300, 20, Object_max_intensity.val, 0.000000, 10.000000, 1, "maximum lamp energy for primary flashes") Object_strike_frequency = Draw.Slider("Primary Strike Frequency", EVENT_strike_frequency, 24, 208, 300, 20, Object_strike_frequency.val, 0.1, 500.000000, 1, "number of frames between primary flashes") Object_secondaryStrike_max = Draw.Slider("Secondary Strike Max.", EVENT_secondaryStrike_max, 24, 176, 300, 20, Object_secondaryStrike_max.val, 0.000000, 500.000000, 1, "the maximum number of secondary flashes between primary flashes") Object_secondaryStrike_time = Draw.Slider("Secondary Strike Inter.", EVENT_secondaryStrike_time, 24, 152, 300, 20, Object_secondaryStrike_time.val, 0.000000, 500.000000, 1, "the maximum number of frames between secondary flashes") Object_secondaryStrike_fallOff = Draw.Slider("Secondary Light Int.", EVENT_secondaryStrike_fallOff, 24, 128, 300, 20, Object_secondaryStrike_fallOff.val, 0.000000, 1.000000, 1, "the maximum intensity of the secondary flashes with respect to primary flashes") Object_start_frame = Draw.Number("Start frame", EVENT_start_frame, 24, 96, 300, 20, Object_start_frame.val, 0.000000, 1024.000000, "starting frame") Object_end_frame = Draw.Number("End Frame", EVENT_end_frame, 24, 72, 300, 20, Object_end_frame.val, 0.000000, 1024.000000, "ending frame") Object_startFlash = Draw.Button("Generate", EVENT_startFlash, 24, 40, 148, 20, "create ipos") Object_exit = Draw.Button("Exit", EVENT_exit, 176, 40, 148, 20, "stop execution") BGL.glRasterPos2i(24, 400) Object_Text = Draw.Text("Timmeh's Lightning Flash Generator") Object_create_emitter = Draw.Button("Create Emitter", EVENT_create_emitter, 24, 16, 148, 20, "Create lamp for flashes to come from")def event(event, value): if event == Draw.ESCKEY and not value: Draw.Exit()def b_event(event): global EVENT_radius global EVENT_floor global EVENT_ceiling global EVENT_intensity_fallOff global EVENT_light_fallOff global EVENT_max_intensity global EVENT_strike_frequency global EVENT_secondaryStrike_max global EVENT_secondaryStrike_time global EVENT_secondaryStrike_fallOff global EVENT_start_frame global EVENT_end_frame global EVENT_startFlash global EVENT_exit global EVENT_Text global EVENT_create_emitter global Object_radius global Object_floor global Object_ceiling global Object_intensity_fallOff global Object_light_fallOff global Object_max_intensity global Object_strike_frequency global Object_secondaryStrike_max global Object_secondaryStrike_time global Object_secondaryStrike_fallOff global Object_start_frame global Object_end_frame global Object_startFlash global Object_exit global Object_Text global Object_create_emitter if event == 0: pass elif event == EVENT_startFlash: startFlash(Object_radius.val, Object_floor.val, Object_ceiling.val, Object_light_fallOff.val, Object_intensity_fallOff.val, Object_max_intensity.val, Object_secondaryStrike_max.val, Object_secondaryStrike_fallOff.val, Object_secondaryStrike_time.val, Object_strike_frequency.val, Object_start_frame.val, Object_end_frame.val) name = "Reminder%t|Remember to assign Lamp Ipo to Emitter" result = Draw.PupMenu(name) elif event == EVENT_exit: Draw.Exit() elif event == EVENT_create_emitter: pass #createEmitter() Draw.Draw() Draw.Register(draw, event, b_event) def startFlash(radius, floor, ceiling, light_fallOff, height_fallOff, max_intensity, secondaryStrike_max, secondaryStrike_fallOff, secondaryStrike_time, strike_frequency, start_frame, end_frame): rnd = Mathutils.Rand #print radius #radius = Object_radius.val #floor = Object_floor.val #ceiling = Object_ceiling.val #light_fallOff = Object_light_fallOff.val #height_falloff = Object_intensity_fallOff.val #max_intensity = Object_max_intensity.val #secondaryStrike_max = Object_secondaryStrike_max.val #secondaryStrike_fallOff = Object_secondaryStrike_fallOff.val #secondaryStrike_time = Object_secondaryStrike_time.val #strike_frequency = Object_strike_frequency.val #start_frame = Object_start_frame.val #end_frame = Object_end_frame.val height_range = ceiling - floor frame_range = end_frame - start_frame emit = Lamp.New("Spot") emit.setDist(radius * 2) emit.col[0] = 0.8 emit.col[1] = 0.8 emit.col[2] = 1.0 emit.setSpotSize(90) emitter = Object.New("Lamp") emitter.link(emit) Blender.Scene.GetCurrent().link(emitter) tracker = Object.New("Empty") Blender.Scene.GetCurrent().link(tracker) objIpo = Ipo.New("Object","EmitObj") lampIpo = Ipo.New("Lamp","EmitLamp") xIpo = objIpo.addCurve("LocX") yIpo = objIpo.addCurve("LocY") zIpo = objIpo.addCurve("LocZ") energyIpo = lampIpo.addCurve("Energ") energyIpo.setInterpolation("Linear") number_majorStrikes = int(frame_range / strike_frequency) for strike in range(number_majorStrikes): frame = int(rnd() * frame_range + start_frame) intensity = rnd() * (max_intensity * secondaryStrike_fallOff) + (max_intensity * secondaryStrike_fallOff) direction = int(rnd() * 2 * math.pi) height = rnd() * height_range + floor x = radius * math.cos(direction) y = radius * math.sin(direction) xIpo.addBezier((frame,x)) yIpo.addBezier((frame,y)) zIpo.addBezier((frame,height)) energyIpo.addBezier((frame-1,0)) energyIpo.addBezier((frame,intensity)) energyIpo.addBezier((frame + light_fallOff,0)) sec_strikes = int(rnd() * secondaryStrike_max) for sec in range(sec_strikes): sec_frame = frame + int(rnd() * secondaryStrike_time) intensity = rnd() * max_intensity * secondaryStrike_fallOff direction = int(rnd() * 2 * math.pi) x = radius * math.cos(direction) y = radius * math.sin(direction) height = rnd() * height_range + floor xIpo.addBezier((sec_frame,x)) yIpo.addBezier((sec_frame,y)) zIpo.addBezier((sec_frame,height)) energyIpo.addBezier((sec_frame-1,0)) energyIpo.addBezier((sec_frame,intensity)) energyIpo.addBezier((sec_frame + light_fallOff,0)) try: emitter.setIpo(objIpo) except: sys.exc_clear() Draw.Exit() # emitter.getData().setIpo(lampIpo) # currently a bug in blender Blender.Redraw()