extends Node2D @export var artnet:Node @export_range(0,255,1) var master = 255 @export_range(0,1,0.01) var q = 1.0 @export_range(1,512,1) var channel_offset=1 var colormix=[ [1.0,0,0], #red [0,1.0,0], #green [0,0,1.0], #blue [1.0,1.0,1.0], #white [1.0,0.8,0], #amber ] var colorchannels=[3,4,5,6,7] #same order as colormix var values=[] func _ready() -> void: values.resize(colorchannels.size()) func _process(delta: float) -> void: var rgb=[modulate.r,modulate.g,modulate.b] values.fill(0.0) var passes=0 while rgb[0]+rgb[1]+rgb[2]>0.01: passes+=1 var cmixsums=[] for cmix in colormix: var colormix_min=matrixDivide(rgb,cmix).min() var resultrgb = matrixSubtract(rgb,matrixMult(cmix,colormix_min)) cmixsums.append(matrixSum(resultrgb)) var cmixsums_min=matrixMinIndex(cmixsums) var colormix_min=matrixDivide(rgb,colormix[cmixsums_min]).min() rgb = matrixSubtract(rgb,matrixMult(colormix[cmixsums_min],colormix_min)) values[cmixsums_min]+=colormix_min print("Result color mix:"+str(values)+" passes="+str(passes)+ " remaining error="+str(rgb[0]+rgb[1]+rgb[2])) artnet.setDMXChannel(channel_offset-1+1,master) #master dimmer artnet.setDMXChannel(channel_offset-1+2,0) #strobo artnet.setDMXChannel(channel_offset-1+8,0) #macros var vi=0 for v in values: artnet.setDMXChannel(channel_offset-1+colorchannels[vi],v*255) vi+=1 ''' artnet.setDMXChannel(channel_offset-1+3,modulate.r*255) #red artnet.setDMXChannel(channel_offset-1+4,modulate.g*255) #green artnet.setDMXChannel(channel_offset-1+5,modulate.b*255) #blue artnet.setDMXChannel(channel_offset-1+6,modulate.b*255) #white artnet.setDMXChannel(channel_offset-1+7,modulate.b*255) #amber ''' func matrixDivide(m1:Array,m2:Array) -> Array: var res=[] var i=0 for m in m1: if (m==0 and m2[i]==0): #0/0 should be inf res.append(1.0/0) else: res.append(m/m2[i]) i+=1 return res func matrixMult(m1:Array,p:float) -> Array: var res=[] for m in m1: res.append(m*p) return res func matrixSubtract(m1:Array,m2:Array) -> Array: var res=[] var i=0 for m in m1: res.append(m-m2[i]) i+=1 return res func matrixSum(m1:Array) -> float: var res=0 for m in m1: res+=m return res func matrixMinIndex(m:Array) -> int: var min=0 var i=0 for e in m: if (m[i]