godot-artnet/scripts/dmx_color.gd

120 lines
2.8 KiB
GDScript3
Raw Normal View History

2025-02-27 15:15:11 +01:00
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
2025-02-27 15:15:11 +01:00
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())
2025-02-27 15:15:11 +01:00
func _process(delta: float) -> void:
var rgb=[modulate.r,modulate.g,modulate.b]
2025-02-27 15:15:11 +01:00
values.fill(0.0)
2025-02-27 18:06:42 +01:00
# 1 0.78 0.78 <- rgb soll
# 1 1 1 = min=0.8 rgb-min*f = 0.2 0.1 0
# 1 0.9 0.9 = min=0.88
# 1 0 0 = min=1
# 0.1 1 1 = min=0.78
#print("Calculating color mix ++++++")
#print("For rgb="+str(rgb))
var passes=0
while rgb[0]+rgb[1]+rgb[2]>0.01:
passes+=1
#print("Error:"+str(rgb[0]+rgb[1]+rgb[2]))
var cmixsums=[]
for cmix in colormix:
#print(" cmix:"+str(matrixDivide(rgb,cmix)))
var colormix_min=matrixDivide(rgb,cmix).min()
var resultrgb = matrixSubtract(rgb,matrixMult(cmix,colormix_min))
cmixsums.append(matrixSum(resultrgb))
#print("cmixsums="+str(cmixsums))
var cmixsums_min=matrixMinIndex(cmixsums)
#print("cmixsums_min="+str(cmixsums_min))
var colormix_min=matrixDivide(rgb,colormix[cmixsums_min]).min()
rgb = matrixSubtract(rgb,matrixMult(colormix[cmixsums_min],colormix_min))
values[cmixsums_min]+=colormix_min
#print("new rgb="+str(rgb))
#print("new color mix:"+str(values))
#print("Remaining Error:"+str(rgb[0]+rgb[1]+rgb[2]))
print("Result color mix:"+str(values)+" passes="+str(passes)+ " remaining error="+str(rgb[0]+rgb[1]+rgb[2]))
#print("")
2025-02-27 15:15:11 +01:00
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
2025-02-27 15:15:11 +01:00
2025-02-27 18:06:42 +01:00
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
2025-02-27 18:06:42 +01:00
'''
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
2025-02-27 15:15:11 +01:00
2025-02-27 18:06:42 +01:00
func matrixSum(m1:Array) -> float:
var res=0
for m in m1:
res+=m
return res
2025-02-27 15:15:11 +01:00
2025-02-27 18:06:42 +01:00
func matrixMinIndex(m:Array) -> int:
var min=0
var i=0
for e in m:
if (m[i]<m[min]):
min=i
i+=1
return min