Changeset - 6d8817152eb3
[Not reviewed]
default
0 2 0
drewp@bigasterisk.com - 9 years ago 2016-06-12 21:03:47
drewp@bigasterisk.com
colorScale effect setting that multiplies all outgoing colors by your note color
Ignore-this: 263e941be8242978b2a7f033e0b3d2f9
2 files changed with 22 insertions and 7 deletions:
0 comments (0 inline, 0 general)
light9/effect/effecteval.py
Show inline comments
 
@@ -25,13 +25,19 @@ def scale(value, strength):
 
    if isinstance(value, Decimal):
 
        value = float(value)
 
        
 
    if isinstance(value, basestring):
 
        if value[0] == '#':
 
            r,g,b = hex_to_rgb(value)
 
            return rgb_to_hex([r * strength, g * strength, b * strength])
 
            if isinstance(strength, Literal):
 
                strength = strength.toPython()
 
            if isinstance(strength, basestring):
 
                sr, sg, sb = [v/255 for v in hex_to_rgb(strength)]
 
            else:
 
                sr = sg = sb = strength
 
            return rgb_to_hex([int(r * sr), int(g * sg), int(b * sb)])
 
    elif isinstance(value, (int, float)):
 
        return value * strength
 
    else:
 
        raise NotImplementedError(repr(value))
 
    
 
class EffectEval(object):
 
@@ -78,13 +84,14 @@ class EffectEval(object):
 
        strength = float(effectSettings[L9['strength']])
 
        if strength <= 0:
 
            return []
 

	
 
        out = {} # (dev, attr): value
 

	
 
        out.update(self.simpleOutput(strength))
 
        out.update(self.simpleOutput(strength,
 
                                     effectSettings.get(L9['colorScale'], None)))
 

	
 
        if self.effect.startswith(L9['effect/']):
 
            tail = 'effect_' + self.effect[len(L9['effect/']):]
 
            try:
 
                func = globals()[tail]
 
            except KeyError:
 
@@ -95,18 +102,20 @@ class EffectEval(object):
 
        # todo: callers should prefer the dict form too
 
        outList = [(d, a, v) for (d, a), v in out.iteritems()]
 
        outList.sort()
 
        #import pprint; pprint.pprint(outList, width=170)
 
        return outList
 
                            
 
    def simpleOutput(self, strength):
 
    def simpleOutput(self, strength, colorScale):
 
        out = {}
 
        for dev, attr, value, isScaled in self.effectOutputs.get(self.effect, []):
 
        for dev, devAttr, value, isScaled in self.effectOutputs.get(self.effect, []):
 
            if isScaled:
 
                value = scale(value, strength)
 
            out[(dev, attr)] = value
 
            if colorScale is not None and devAttr == L9['color']:
 
                value = scale(value, colorScale)
 
            out[(dev, devAttr)] = value
 
        return out
 
        
 

	
 

	
 
    
 

	
light9/effect/sequencer.py
Show inline comments
 
@@ -35,12 +35,17 @@ def sendToCollector(client, session, set
 
class Note(object):
 
    def __init__(self, graph, uri, effectevalModule):
 
        g = self.graph = graph
 
        self.uri = uri
 
        self.effectEval = effectevalModule.EffectEval(
 
            graph, g.value(uri, L9['effectClass']))
 
        self.baseEffectSettings = {}  # {effectAttr: value}
 
        for s in g.objects(uri, L9['setting']):
 
            ea = g.value(s, L9['effectAttr'])
 
            self.baseEffectSettings[ea] = g.value(s, L9['value'])
 
            
 
        floatVal = lambda s, p: float(g.value(s, p).toPython())
 
        originTime = floatVal(uri, L9['originTime'])
 
        self.points = []
 
        for curve in g.objects(uri, L9['curve']):
 
            if g.value(curve, L9['attr']) != L9['strength']:
 
                continue
 
@@ -69,14 +74,15 @@ class Note(object):
 
        return y
 
        
 
    def outputSettings(self, t):
 
        """
 
        list of (device, attr, value)
 
        """
 
        effectSettings = [(L9['strength'], self.evalCurve(t))]
 
        return self.effectEval.outputFromEffect(effectSettings, t)
 
        effectSettings = self.baseEffectSettings.copy()
 
        effectSettings[L9['strength']] = self.evalCurve(t)
 
        return self.effectEval.outputFromEffect(effectSettings.items(), t)
 

	
 

	
 
class CodeWatcher(object):
 
    def __init__(self, onChange):
 
        self.onChange = onChange
 

	
0 comments (0 inline, 0 general)