2025-02-27 15:15:11 +01:00
|
|
|
extends Node2D
|
|
|
|
|
2025-05-26 17:12:37 +02:00
|
|
|
# Direct control Colored Light.
|
|
|
|
# Only One color for whole device.
|
2025-02-27 15:15:11 +01:00
|
|
|
|
2025-05-26 17:12:37 +02:00
|
|
|
@export var artnet:Node
|
|
|
|
@export var output:bool=true
|
2025-06-18 16:36:06 +02:00
|
|
|
@export_range(0,255,1) var dimmer = 255
|
|
|
|
var dimmerchannel=1
|
2025-02-27 15:15:11 +01:00
|
|
|
|
2025-02-27 17:05:02 +01:00
|
|
|
@export_range(1,512,1) var channel_offset=1
|
|
|
|
|
2025-06-18 16:36:06 +02:00
|
|
|
enum Model {cameo_clp_flatpro_18, robtertjuliat_dalis_861_fullmode8b,martin_elp_cl_10ch}
|
2025-05-26 17:12:37 +02:00
|
|
|
@export var model: Model
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var colormix=[]
|
|
|
|
|
|
|
|
var colorchannels=[]
|
|
|
|
var colorvalues=[]
|
|
|
|
|
|
|
|
var fixedchannels=[]
|
|
|
|
var fixedvalues=[]
|
2025-02-27 17:05:02 +01:00
|
|
|
|
|
|
|
func _ready() -> void:
|
2025-05-26 17:12:37 +02:00
|
|
|
if (model==Model.cameo_clp_flatpro_18):
|
|
|
|
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.75,0], #amber
|
|
|
|
]
|
|
|
|
colorchannels=[3,4,5,6,7] #same order as colormix
|
2025-06-18 16:36:06 +02:00
|
|
|
dimmerchannel=1
|
2025-05-26 17:12:37 +02:00
|
|
|
fixedchannels=[2,8]
|
|
|
|
fixedvalues=[0,0]
|
|
|
|
elif (model==Model.robtertjuliat_dalis_861_fullmode8b):
|
|
|
|
#https://www.robertjuliat.com/PDF/Documents/DN41108200_m_DALIS_861.pdf
|
|
|
|
colormix=[
|
|
|
|
[1.0,0,0], #red
|
|
|
|
[0,1.0,0], #green
|
|
|
|
[0,1.0,1.0], #blue (looks cyan)
|
|
|
|
[0.0,0.0,1.0], #royal blue (looks more blue)
|
|
|
|
[0,1.0,0.8], #cyan (looks more green)
|
|
|
|
[1.0,0.75,0], #amber
|
|
|
|
[1.0,1.0,1.0], #white
|
|
|
|
[1.0,0.9,0.8], #warm white
|
|
|
|
]
|
|
|
|
colorchannels=[2,3,4,5,6,7,8,9] #same order as colormix
|
2025-06-18 16:36:06 +02:00
|
|
|
dimmerchannel=1
|
2025-05-26 17:12:37 +02:00
|
|
|
fixedchannels=[10,11,12,13]
|
|
|
|
fixedvalues=[0,0,255,0]
|
2025-06-18 16:36:06 +02:00
|
|
|
elif (model==Model.martin_elp_cl_10ch):
|
|
|
|
#https://www.martin.com/en/site_elements/elp-cl-user-manual page 28
|
|
|
|
colormix=[
|
|
|
|
[1.0,0,0], #red
|
|
|
|
[0,1.0,0], #green
|
|
|
|
[0,0.0,1.0], #blue
|
|
|
|
[0.75,1.0,0.0], #lime
|
|
|
|
[1.0,0.5,0], #amber
|
|
|
|
]
|
|
|
|
colorchannels=[5,6,7,8,9] #same order as colormix
|
|
|
|
dimmerchannel=2
|
|
|
|
fixedchannels=[1,3,4]
|
|
|
|
fixedvalues=[255,0,0]
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-05-26 17:12:37 +02:00
|
|
|
|
|
|
|
colorvalues.resize(colorchannels.size())
|
2025-02-27 17:05:02 +01:00
|
|
|
|
2025-02-27 15:15:11 +01:00
|
|
|
|
|
|
|
func _process(delta: float) -> void:
|
2025-02-27 17:05:02 +01:00
|
|
|
var rgb=[modulate.r,modulate.g,modulate.b]
|
2025-02-27 15:15:11 +01:00
|
|
|
|
2025-05-26 17:12:37 +02:00
|
|
|
colorvalues.fill(0.0)
|
2025-02-27 17:05:02 +01:00
|
|
|
|
2025-02-27 18:06:42 +01:00
|
|
|
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))
|
2025-05-26 17:12:37 +02:00
|
|
|
colorvalues[cmixsums_min]+=colormix_min
|
2025-02-27 18:08:26 +01:00
|
|
|
|
2025-05-26 17:12:37 +02:00
|
|
|
#print("Result color mix:"+str(colorvalues)+" passes="+str(passes)+ " remaining error="+str(rgb[0]+rgb[1]+rgb[2]))
|
2025-02-27 18:06:42 +01:00
|
|
|
|
2025-02-27 17:05:02 +01:00
|
|
|
|
2025-05-26 17:12:37 +02:00
|
|
|
if output:
|
2025-06-18 16:36:06 +02:00
|
|
|
artnet.setDMXChannel(channel_offset-1+dimmerchannel,dimmer) #master dimmer
|
2025-02-27 15:15:11 +01:00
|
|
|
|
2025-05-26 17:12:37 +02:00
|
|
|
#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
|
2025-05-26 17:12:37 +02:00
|
|
|
for v in colorvalues:
|
|
|
|
if output:
|
|
|
|
artnet.setDMXChannel(channel_offset-1+colorchannels[vi],v*255)
|
2025-02-27 18:06:42 +01:00
|
|
|
vi+=1
|
2025-05-26 17:12:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
var fi=0
|
|
|
|
for f in fixedvalues:
|
|
|
|
if output:
|
|
|
|
artnet.setDMXChannel(channel_offset-1+fixedchannels[fi],f)
|
|
|
|
fi+=1
|
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
|