1 Commits

51 changed files with 113 additions and 152 deletions

View File

@@ -2,7 +2,7 @@
[/Script/EngineSettings.GameMapsSettings] [/Script/EngineSettings.GameMapsSettings]
GameDefaultMap=/Engine/Maps/Templates/OpenWorld GameDefaultMap=/Engine/Maps/Templates/OpenWorld
EditorStartupMap=/Game/Levels/JoakemVideoClip/Joakem.Joakem EditorStartupMap=/Game/Levels/Lidinis360/Lidinis360.Lidinis360
[/Script/Engine.RendererSettings] [/Script/Engine.RendererSettings]
r.AllowStaticLighting=False r.AllowStaticLighting=False
@@ -84,12 +84,10 @@ FontDPI=72
+ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/DEV_TheStudio") +ActiveGameNameRedirects=(OldGameName="TP_Blank",NewGameName="/Script/DEV_TheStudio")
+ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/DEV_TheStudio") +ActiveGameNameRedirects=(OldGameName="/Script/TP_Blank",NewGameName="/Script/DEV_TheStudio")
bUseFixedFrameRate=True bUseFixedFrameRate=True
FixedFrameRate=25.000000 FixedFrameRate=24.000000
CustomTimeStepClassName=/Game/TheStudio/Media/Sync/BlackMagicGencode.BlackMagicGencode_C CustomTimeStepClassName=/Game/TheStudio/Media/Sync/BlackMagicGencode.BlackMagicGencode_C
TimecodeProviderClassName=/Game/TheStudio/Media/Sync/DanteAudioTimecodeProvider.DanteAudioTimecodeProvider_C TimecodeProviderClassName=/Game/TheStudio/Media/Sync/DanteAudioTimecodeProvider.DanteAudioTimecodeProvider_C
NearClipPlane=0.100000 NearClipPlane=0.100000
GenerateDefaultTimecodeFrameRate=(Numerator=25,Denominator=1)
GenerateDefaultTimecodeFrameDelay=2.000000
[/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings] [/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings]
bEnablePlugin=True bEnablePlugin=True
@@ -115,3 +113,56 @@ DefaultFrameRate=(Numerator=24,Denominator=1)
[/Script/NDIIO.NDIIOPluginSettings] [/Script/NDIIO.NDIIOPluginSettings]
bBeginBroadcastOnPlay=True bBeginBroadcastOnPlay=True
[/Script/DMXProtocol.DMXProtocolSettings]
+OutputPortConfigs=(PortName="OutputPort1",ProtocolName="Art-Net",CommunicationType=Broadcast,bAutoCompleteDeviceAddressEnabled=False,AutoCompleteDeviceAddress="192.*",DeviceAddress="10.3.3.31",DestinationAddress="None",DestinationAddresses=((DestinationAddressString="10.3.3.255")),bLoopbackToEngine=False,LocalUniverseStart=1,NumUniverses=1,ExternUniverseStart=1,bIsExternUnivereStartEditable=False,Priority=100,Delay=0.000000,DelayFrameRate=(Numerator=25,Denominator=1),PortGuid=113BD0304F0500A965A6E5A0ECC5D52F)
SendingRefreshRate=44
+FixtureCategories=Other
+FixtureCategories=Strobe
+FixtureCategories=Moving Mirror
+FixtureCategories=Moving Head
+FixtureCategories=Matrix/Pixel Bar
+FixtureCategories=Static
+Attributes=(Name="NumBeams",Keywords="")
+Attributes=(Name="Angle",Keywords="")
+Attributes=(Name="Temperature",Keywords="")
+Attributes=(Name="Launch",Keywords="")
+Attributes=(Name="Burst",Keywords="")
+Attributes=(Name="ModeStartStop",Keywords="")
+Attributes=(Name="Prism",Keywords="")
+Attributes=(Name="CIE_Y",Keywords="")
+Attributes=(Name="CIE_X",Keywords="")
+Attributes=(Name="FanMode",Keywords="")
+Attributes=(Name="HSB_Brightness",Keywords="")
+Attributes=(Name="HSB_Saturation",Keywords="")
+Attributes=(Name="HSB_Hue",Keywords="")
+Attributes=(Name="Color XF",Keywords="")
+Attributes=(Name="Tint",Keywords="")
+Attributes=(Name="CTC",Keywords="")
+Attributes=(Name="Reset",Keywords="FixtureReset, FixtureGlobalReset, GlobalReset")
+Attributes=(Name="Frost",Keywords="")
+Attributes=(Name="Effects",Keywords="Effect, Macro, Effects")
+Attributes=(Name="Shaper Rotation",Keywords="ShaperRot")
+Attributes=(Name="Color Rotation",Keywords="ColorWheelSpin")
+Attributes=(Name="Gobo Wheel Rotate",Keywords="GoboWheelSpin, GoboWheelRotate")
+Attributes=(Name="Gobo Spin",Keywords="GoboSpin")
+Attributes=(Name="Gobo",Keywords="GoboWheel, Gobo1")
+Attributes=(Name="Iris",Keywords="")
+Attributes=(Name="Focus",Keywords="")
+Attributes=(Name="Zoom",Keywords="")
+Attributes=(Name="Tilt",Keywords="")
+Attributes=(Name="Shutter",Keywords="Strobe")
+Attributes=(Name="Pan",Keywords="")
+Attributes=(Name="Dimmer",Keywords="Intensity, Strength, Brightness")
+Attributes=(Name="Amber",Keywords="ColorAdd_A")
+Attributes=(Name="White",Keywords="ColorAdd_W")
+Attributes=(Name="Yellow",Keywords="ColorAdd_Y, ColorSub_Y")
+Attributes=(Name="Magenta",Keywords="ColorAdd_M, ColorSub_M")
+Attributes=(Name="Cyan",Keywords="ColorAdd_C, ColorSub_C")
+Attributes=(Name="Blue",Keywords="ColorAdd_B")
+Attributes=(Name="Green",Keywords="ColorAdd_G")
+Attributes=(Name="Red",Keywords="ColorAdd_R")
+Attributes=(Name="Color",Keywords="ColorWheel, Color1")
bDefaultSendDMXEnabled=True
bDefaultReceiveDMXEnabled=False
bAllFixturePatchesReceiveDMXInEditor=True

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -441,6 +441,22 @@
{ {
"Name": "VPxDecoderElectra", "Name": "VPxDecoderElectra",
"Enabled": true "Enabled": true
},
{
"Name": "DMXFixtures",
"Enabled": true
},
{
"Name": "DMXDisplayCluster",
"Enabled": true
},
{
"Name": "DMXControlConsole",
"Enabled": true
},
{
"Name": "RemoteControlProtocolDMX",
"Enabled": true
} }
] ]
} }

View File

@@ -1,153 +1,47 @@
# plugin_prelaunch.py - With connection check @echo off
from switchboard.devices.device_base import Device, DeviceStatus REM ---------------------------------------------
from switchboard.devices.device_widget_base import DeviceWidget REM Safe Switchboard External Command: Git Pull
from switchboard.switchboard_logging import LOGGER REM Discards local changes, pulls latest from current branch
from switchboard.config import IntSetting, StringSetting REM Safe to keep inside the Git repo
REM ---------------------------------------------
from PySide6 import QtCore REM Change this to your project repo path (can be inside repo)
set REPO_PATH=D:\Projects\DEV_TheStudio_Plugin
REM Name of this batch file
set BATCH_NAME=%~nx0
class DevicePreLaunch(Device): echo ------------------------------------------------
"""PreLaunch device - executes batch file on connect""" echo [%COMPUTERNAME%] Starting safe Git pull on %REPO_PATH%
echo ------------------------------------------------
csettings = { REM Navigate to the repo
'batch_file': StringSetting( cd /d "%REPO_PATH%"
attr_name="batch_file",
nice_name="Batch File Path",
value="D:\\Projects\\DEV_TheStudio_Plugin\\Source\\git_management.bat",
tool_tip="Full path to the batch file on the remote machine",
category="PreLaunch Settings",
),
'port': IntSetting(
attr_name="port",
nice_name="Listener Port",
value=2980,
tool_tip="Port of SwitchboardListener",
category="Network Settings",
),
}
def __init__(self, name, address, **kwargs): REM Ensure Git is installed
super().__init__(name, address, **kwargs) where git >nul 2>&1
LOGGER.info(f"PreLaunch device '{name}' created") IF %ERRORLEVEL% NEQ 0 (
echo ERROR: Git is not installed or not in PATH
exit /b 1
)
def device_settings(self): REM Get current branch
return super().device_settings() for /f "tokens=*" %%i in ('git rev-parse --abbrev-ref HEAD') do set CURRENT_BRANCH=%%i
echo Current branch: %CURRENT_BRANCH%
def connect(self): REM Discard any local changes (staged and unstaged)
"""Called when connect button clicked""" git reset --hard
LOGGER.info(f">>> {self.name}: connect() called!")
# First, check if listener is reachable REM Clean untracked files and directories, excluding this batch file
LOGGER.info(f">>> {self.name}: Checking listener connection...") git clean -fdX -e "%BATCH_NAME%"
# Try a simple connectivity test REM Pull latest changes from origin for current branch
try: git pull origin %CURRENT_BRANCH%
# Send a simple test message
test_message = {'command': 'state'}
success, response = self.unreal_client.send_message(test_message)
if not success: REM Show status
LOGGER.error(f">>> {self.name}: Cannot connect to listener!") git status
self.device_qt_handler.signal_device_connect_failed.emit(self)
return
LOGGER.info(f">>> {self.name}: Listener responded: {response}") echo ------------------------------------------------
echo [%COMPUTERNAME%] Git pull complete
except Exception as e: echo ------------------------------------------------
LOGGER.error(f">>> {self.name}: Connection test failed: {e}") pause
self.device_qt_handler.signal_device_connect_failed.emit(self)
return
# Set status to READY
self.status = DeviceStatus.READY
LOGGER.info(f">>> {self.name}: Status set to READY, executing batch file...")
# Execute batch file
self.execute_batch_file()
def disconnect(self):
"""Called when disconnect button clicked"""
LOGGER.info(f">>> {self.name}: disconnect() called!")
self.status = DeviceStatus.DISCONNECTED
def execute_batch_file(self):
"""Execute the batch file"""
batch_file = self.batch_file.get_value()
if not batch_file:
LOGGER.warning(f"  {self.name}: No batch file configured")
return False
LOGGER.info(f">>> {self.name}: ========== EXECUTING ==========")
LOGGER.info(f">>> {self.name}: File: {batch_file}")
LOGGER.info(f">>> {self.name}: Address: {self.address}")
LOGGER.info(f">>> {self.name}: Port: {self.port.get_value()}")
try:
message = {
'command': 'start',
'bTryKill': False,
'bUpdateWorkingDir': False,
'caller': self.name,
'name': 'cmd.exe',
'args': f'/c "{batch_file}"',
'working_dir': '',
}
LOGGER.info(f">>> {self.name}: Sending message...")
success, msg = self.unreal_client.send_message(message)
if success:
LOGGER.info(f">>>  {self.name}: SUCCESS!")
LOGGER.info(f">>> Response: {msg}")
return True
else:
LOGGER.error(f">>> L {self.name}: Send failed!")
return False
except Exception as e:
LOGGER.error(f">>> L {self.name}: ERROR: {e}")
import traceback
LOGGER.error(traceback.format_exc())
return False
class DeviceWidgetPreLaunch(DeviceWidget):
"""Widget for PreLaunch device"""
def __init__(self, name, device_hash, address, icons, parent=None):
super().__init__(name, device_hash, address, icons, parent=parent)
LOGGER.info(f"PreLaunch widget created for {name}")
def _add_control_buttons(self):
"""Add connect button"""
super()._add_control_buttons()
CONTROL_BUTTON_ICON_SIZE = QtCore.QSize(21, 21)
self.connect_button = self.add_control_button(
icon_size=CONTROL_BUTTON_ICON_SIZE,
checkable=True,
tool_tip='Connect and execute batch file',
hover_focus=False,
name='connect')
self.connect_button.clicked.connect(self.connect_button_clicked)
def connect_button_clicked(self):
"""Handle connect button click"""
if self.connect_button.isChecked():
self._connect()
else:
self._disconnect()
def _connect(self):
"""Connect"""
self.connect_button.setChecked(True)
self.signal_device_widget_connect.emit(self)
def _disconnect(self):
"""Disconnect"""
self.connect_button.setChecked(False)
self.signal_device_widget_disconnect.emit(self)