This commit is contained in:
2021-10-14 13:47:35 +02:00
commit 6625a8dfaa
4026 changed files with 844291 additions and 0 deletions
@@ -0,0 +1,75 @@
PROJECT(openvibe-ssvep-demo)
SET(PROJECT_VERSION_MAJOR ${OV_GLOBAL_VERSION_MAJOR})
SET(PROJECT_VERSION ${OV_GLOBAL_VERSION_STRING})
INCLUDE("FindThirdPartyVRPN_Check")
IF(NOT PATH_VRPN)
MESSAGE(STATUS " --> Not building ${PROJECT_NAME}")
RETURN()
ENDIF(NOT PATH_VRPN)
INCLUDE("FindThirdPartyCEGUI_Check")
IF(NOT CEGUI_FOUND OR NOT OgreCEGUIRenderer_FOUND)
MESSAGE(STATUS " --> Not building ${PROJECT_NAME}")
RETURN()
ENDIF(NOT CEGUI_FOUND OR NOT OgreCEGUIRenderer_FOUND)
FILE(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl)
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_FILES})
SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER})
INCLUDE("FindOpenViBE")
INCLUDE("FindOpenViBECommon")
INCLUDE("FindOpenViBEToolkit")
INCLUDE("FindOpenViBEModuleEBML")
INCLUDE("FindOpenViBEModuleFS")
INCLUDE("FindThirdPartyCEGUI") # CEGUI + CEGUIOgreRender included
INCLUDE("FindThirdPartyVRPN")
INCLUDE("FindThirdPartyOgre3D") # OGRE + OIS included, pulls boost thread
INCLUDE("FindThirdPartyBoost") # Using Ogre headers on Win32 causes dependency to Boost thread library
INCLUDE("FindThirdPartyBoost_Thread") # Note that this is a potential issue on Windows, as the dependencies/ogre/boost and dependencies/boost are not the same at the time of writing this.
INCLUDE("FindThirdPartyBoost_System") # Note that this is a potential issue on Windows, as the dependencies/ogre/boost and dependencies/boost are not the same at the time of writing this.
# ---------------------------------
# Finds standard library pthread
# Adds library to target
# Adds include path
# ---------------------------------
IF(UNIX)
FIND_LIBRARY(LIB_STANDARD_MODULE_PTHREAD pthread)
IF(LIB_STANDARD_MODULE_PTHREAD)
MESSAGE(STATUS " Found pthread...")
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_PTHREAD})
ELSE(LIB_STANDARD_MODULE_PTHREAD)
MESSAGE(STATUS " FAILED to find pthread...")
ENDIF(LIB_STANDARD_MODULE_PTHREAD)
ENDIF(UNIX)
# ---------------------------------
# ---------------------------------
# ----------------------
# Generate launch script
# ----------------------
OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-ssvep-demo-trainer" EXECUTABLE_NAME ${PROJECT_NAME} PARAMETERS "trainer")
OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-ssvep-demo-shooter" EXECUTABLE_NAME ${PROJECT_NAME} PARAMETERS "shooter")
# -----------------------------
# Install files
# -----------------------------
INSTALL(TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION ${DIST_BINDIR}
LIBRARY DESTINATION DESTINATION ${DIST_LIBDIR}
ARCHIVE DESTINATION DESTINATION ${DIST_LIBDIR})
INSTALL(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/ssvep-demo)
INSTALL(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/)
INSTALL(DIRECTORY bci-examples DESTINATION ${DIST_DATADIR}/openvibe/scenarios/)
@@ -0,0 +1,3 @@
The scenario will record its configuration here.
@@ -0,0 +1,3 @@
The scenario will record its configuration here.
@@ -0,0 +1,9 @@
<OpenViBE-SettingsOverride>
<SettingValue>${Player_ScenarioDirectory}/scripts/configuration-experiment-settings.lua</SettingValue>
<SettingValue>100,0,0</SettingValue>
<SettingValue>10,10,10</SettingValue>
<SettingValue>20;15;12</SettingValue>
<SettingValue>0.5</SettingValue>
<SettingValue>0.1</SettingValue>
<SettingValue>0.250</SettingValue>
</OpenViBE-SettingsOverride>
@@ -0,0 +1,5 @@
<OpenViBE-SettingsOverride>
<SettingValue>${Player_ScenarioDirectory}/scripts/shooter-controller.lua</SettingValue>
<SettingValue>0 3 5 7 2 6 4 1</SettingValue>
<SettingValue>0.01</SettingValue>
</OpenViBE-SettingsOverride>
@@ -0,0 +1,9 @@
<OpenViBE-SettingsOverride>
<SettingValue>${Player_ScenarioDirectory}/scripts/training-acquisition-controller.lua</SettingValue>
<SettingValue>0 2 3 1 2 1 0 3 1 2 3 0 2 0 3 1 0 3 1 2 3 0 1 2 1 3 2 0 3 2 0 1 </SettingValue>
<SettingValue>7.000000</SettingValue>
<SettingValue>4.000000</SettingValue>
<SettingValue>1.000000</SettingValue>
<SettingValue>0.3;0.3</SettingValue>
<SettingValue>(0.0;0.0);(0.0;0.5);(-0.5;0.0);(0.5;0.0)</SettingValue>
</OpenViBE-SettingsOverride>
@@ -0,0 +1,43 @@
flip_count = 0
switched_flip_count = 0
flips = {}
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
flip_count = box:get_input_count()
for i = 1, flip_count do
flips[i] = false
end
end
function uninitialize(box)
end
function process(box)
while box:keep_processing() and switched_flip_count < flip_count do
for i = 1, flip_count do
if box:get_stimulation_count(i) > 0 then
box:remove_stimulation(i, 1)
if not flips[i] then
switched_flip_count = switched_flip_count + 1
flips[i] = true
io.write("Flip ", i, " of ", flip_count, " switched\n")
end
end
end
box:sleep()
end
box:send_stimulation(1, OVTK_StimulationId_Label_00, box:get_current_time())
end
@@ -0,0 +1,62 @@
targets = {}
non_targets = {}
sent_stimulation = 0
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
-- read the parameters of the box
s_targets = box:get_setting(2)
for t in s_targets:gmatch("%d+") do
targets[t + 0] = true
end
s_non_targets = box:get_setting(3)
for t in s_non_targets:gmatch("%d+") do
non_targets[t + 0] = true
end
sent_stimulation = _G[box:get_setting(4)]
end
function uninitialize(box)
end
function process(box)
finished = false
while box:keep_processing() and not finished do
time = box:get_current_time()
while box:get_stimulation_count(1) > 0 do
s_code, s_date, s_duration = box:get_stimulation(1, 1)
box:remove_stimulation(1, 1)
if s_code >= OVTK_StimulationId_Label_00 and s_code <= OVTK_StimulationId_Label_1F then
received_stimulation = s_code - OVTK_StimulationId_Label_00
if targets[received_stimulation] ~= nil then
box:send_stimulation(1, sent_stimulation, time)
elseif non_targets[received_stimulation] ~= nil then
box:send_stimulation(2, sent_stimulation, time)
end
elseif s_code == OVTK_StimulationId_ExperimentStop then
finished = true
end
end
box:sleep()
end
end
@@ -0,0 +1,132 @@
stimulation_frequencies = {}
frequency_count = 0
target_light_color = {}
target_dark_color = {}
training_target_size = {}
training_targets_positions = {}
processing_epoch_duration = nil
processing_epoch_interval = nil
processing_frequency_tolerance = nil
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
for value in box:get_setting(2):gmatch("%d+") do
table.insert(target_light_color, value)
end
for value in box:get_setting(3):gmatch("%d+") do
table.insert(target_dark_color, value)
end
for value in box:get_setting(4):gmatch("%d+[.]?%d*") do
table.insert(stimulation_frequencies, value)
frequency_count = frequency_count + 1
end
processing_epoch_duration = box:get_setting(5)
processing_epoch_interval = box:get_setting(6)
processing_frequency_tolerance = box:get_setting(7)
end
function uninitialize(box)
end
function process(box)
while box:keep_processing() and box:get_stimulation_count(1) == 0 do
box:sleep()
end
box:log("Info", box:get_config("Writing additional configuration to '${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo${CustomConfigurationSuffix${OperatingSystem}}'"))
cfg_file = assert(io.open(box:get_config("${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo${CustomConfigurationSuffix${OperatingSystem}}"), "a"))
success = true
success = success and cfg_file:write("SSVEP_TargetLightColourRed = ", target_light_color[1] / 100, "\n")
success = success and cfg_file:write("SSVEP_TargetLightColourGreen = ", target_light_color[2] / 100, "\n")
success = success and cfg_file:write("SSVEP_TargetLightColourBlue = ", target_light_color[3] / 100, "\n")
success = success and cfg_file:write("SSVEP_TargetDarkColourRed = ", target_dark_color[1] / 100, "\n")
success = success and cfg_file:write("SSVEP_TargetDarkColourGreen = ", target_dark_color[2] / 100, "\n")
success = success and cfg_file:write("SSVEP_TargetDarkColourBlue = ", target_dark_color[3] / 100, "\n")
for i=1,frequency_count do
success = success and cfg_file:write("SSVEP_Frequency_", i, " = ", string.format("%g", stimulation_frequencies[i]), "\n")
end
cfg_file:close()
if (success == false) then
box:log("Error", box:get_config("Write error"))
return false
end
-- create configuration files for temporal filters
scenario_path = box:get_config("${Player_ScenarioDirectory}")
for i=1,frequency_count do
cfg_file_name = scenario_path .. string.format("/configuration/temporal-filter-freq-%d.cfg", i)
box:log("Info", "Writing file '" .. cfg_file_name .. "'")
cfg_file = io.open(cfg_file_name, "w")
if cfg_file == nil then
box:log("Error", "Cannot write to [" .. cfg_file_name .. "]")
box:log("Error", "Please copy the scenario folder to a directory with write access and use from there.")
return false
end
success = true
success = success and cfg_file:write("<OpenViBE-SettingsOverride>\n")
success = success and cfg_file:write("<SettingValue>Butterworth</SettingValue>\n")
success = success and cfg_file:write("<SettingValue>Band pass</SettingValue>\n")
success = success and cfg_file:write("<SettingValue>4</SettingValue>\n")
success = success and cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", stimulation_frequencies[i] - processing_frequency_tolerance))
success = success and cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", stimulation_frequencies[i] + processing_frequency_tolerance))
success = success and cfg_file:write("<SettingValue>0.500000</SettingValue>\n")
success = success and cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
if (success == false) then
box:log("Error", box:get_config("Write error"))
return false
end
end
-- create configuration file for time based epoching
cfg_file_name = scenario_path .. "/configuration/time-based-epoching.cfg";
box:log("Info", "Writing file '" .. cfg_file_name .. "'")
cfg_file = io.open(cfg_file_name, "w")
if cfg_file == nil then
box:log("Error", "Cannot write to [" .. cfg_file_name .. "]")
box:log("Error", "Please copy the scenario folder to a directory with write access and use from there.")
return false
end
success = true
success = success and cfg_file:write("<OpenViBE-SettingsOverride>\n")
success = success and cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", processing_epoch_duration))
success = success and cfg_file:write(string.format("<SettingValue>%g</SettingValue>\n", processing_epoch_interval))
success = success and cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
if (success == false) then
box:log("Error", box:get_config("Write error"))
return false
end
-- notify the scenario that the configuration process is complete
box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0)
end
@@ -0,0 +1,33 @@
vrpn_host = nil
vrpn_port = nil
screen_refresh_rate = nil
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
screen_refresh_rate = box:get_setting(2)
end
function uninitialize(box)
end
function process(box)
box:log("Info", box:get_config("Generating '${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo${CustomConfigurationSuffix${OperatingSystem}}'"))
cfg_file = assert(io.open(box:get_config("${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo${CustomConfigurationSuffix${OperatingSystem}}"), "w"))
success = true
success = success and cfg_file:write("# This file was automatically generated!\n\n")
success = success and cfg_file:write("# If you want to change the SSVEP configuration\n")
success = success and cfg_file:write("# please use the provided ssvep-configuration scenario.\n")
success = success and cfg_file:write("SSVEP_ScreenRefreshRate = ", screen_refresh_rate, "\n")
if (success == false) then
box:log("Error", box:get_config("Write error"))
end
cfg_file:close()
box:send_stimulation(1, OVTK_StimulationId_TrainCompleted, box:get_current_time() + 0.2, 0)
end
@@ -0,0 +1,35 @@
buffer = {}
function initialize(box)
end
function uninitialize(box)
end
-- This script receives stimulations and lets pass only every other one
-- for each stimulation code
-- Useful to remove "key up" events of keyboard stimulator
function process(box)
while box:keep_processing() do
for index = 1, box:get_stimulation_count(1) do
stimulation = box:get_stimulation(1, index)
if buffer[stimulation] == nil then
box:send_stimulation(1, stimulation, box:get_current_time(), 0)
buffer[stimulation] = 1
else
buffer[stimulation] = nil
end
box:remove_stimulation(1, 1)
end
box:sleep()
end
end
@@ -0,0 +1,46 @@
class_count = 0
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
class_count = box:get_setting(2)
end
function uninitialize(box)
end
function process(box)
while box:keep_processing() do
time = box:get_current_time()
while box:keep_processing() and box:get_stimulation_count(1) > 0 do
local decision = 0
local decided = false
-- check each input
for i = 1, class_count do
-- if the frequency is considered as stimulated
if (box:get_stimulation(i, 1) - OVTK_StimulationId_Label_00 == 1) then
if not decided then
decision = i
decided = true
else
decision = 0
end
end
box:remove_stimulation(i, 1)
end
if decision ~= 0 then
box:send_stimulation(1, OVTK_StimulationId_Label_00 + decision - 1, box:get_current_time() + 0.01, 0)
end
end
box:sleep()
end
end
@@ -0,0 +1,66 @@
sequence = {}
flickeringDelay = nil
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
s_sequence = box:get_setting(2)
angular_speed = box:get_setting(3)
box:log("Info", string.format("Target Sequence : [%s]\n", s_sequence))
for target in s_sequence:gmatch("%d+") do
table.insert(sequence, target)
end
box:log("Info", string.format("Angular Speed : %g\n", angular_speed))
-- create the configuration file for the shooter application
cfg_file = io.open(box:get_config("${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo-shooter${CustomConfigurationSuffix${OperatingSystem}}"), "w")
cfg_file:write("# This file was automatically generated!\n\n")
cfg_file:write("# If you want to change the SSVEP online shooter configuration\n")
cfg_file:write("# please use the box settings in the shooter scenario.\n\n")
cfg_file:write("SSVEP_ShipAngularSpeed = ", angular_speed, "\n")
cfg_file:close()
end
function uninitialize(box)
end
function process(box)
-- while targets are available, send a stimulation with new target
-- position for each request
while box:keep_processing() do
if box:get_stimulation_count(1) > 0 then
identifier, date, duration = box:get_stimulation(1, 1)
if identifier == OVTK_StimulationId_Target then
current_time = box:get_current_time() + 1
-- if no targets are available, quit the game
if # sequence == 0 then
box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0)
break
end
next_target = sequence[1]
table.remove(sequence, 1)
box:send_stimulation(1, OVTK_StimulationId_Label_00 + next_target , current_time, 0)
end
box:remove_stimulation(1, 1)
end
box:sleep()
end
end
@@ -0,0 +1,21 @@
delay = 1
function initialize(box)
s_delay = box:get_setting(2);
io.write(string.format("Delay : [%s]\n", s_delay))
if (s_delay:find("^%d+$") ~= nil) then
delay = tonumber(s_delay)
else
io.write("[ERROR] The parameter should be a numeric value\n")
end
end
function uninitialize(box)
end
function process(box)
box:send_stimulation(1, 0x00008001, delay, 0)
end
@@ -0,0 +1,176 @@
sequence = {}
number_of_cycles = 0
stimulation_duration = nil
break_duration = nil
flickering_delay = nil
target_width = nil
target_height = nil
target_positions = {}
number_of_targets = {}
stimulationLabels = {
0x00008100,
0x00008101,
0x00008102,
0x00008103,
0x00008104,
0x00008105,
0x00008106,
0x00008107
}
function initialize(box)
dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua")
-- load the goal sequence
s_sequence = box:get_setting(2)
for target in s_sequence:gmatch("%d+") do
table.insert(sequence, target)
number_of_cycles = number_of_cycles + 1
end
box:log("Info", string.format("Number of goals in sequence: [%d]", number_of_cycles))
-- get the duration of a stimulation sequence
s_stimulation_duration = box:get_setting(3)
if (s_stimulation_duration:find("^%d+[.]?%d*$") ~= nil) then
stimulation_duration = tonumber(s_stimulation_duration)
box:log("Info", string.format("Stimulation Duration : [%g]", stimulation_duration))
else
box:log("Error", "The parameter 'stimulation duration' must be a numeric value\n")
error()
end
-- get the duration of a break between stimulations
s_break_duration = box:get_setting(4)
if (s_break_duration:find("^%d+[.]?%d*$") ~= nil) then
break_duration = tonumber(s_break_duration)
box:log("Info", string.format("Break Duration : [%s]", s_break_duration))
else
box:log("Error", "The parameter 'break duration' must be a numeric value\n")
error()
end
-- get the delay between the appearance of the marker and the start of flickering
s_flickering_delay = box:get_setting(5)
if (s_flickering_delay:find("^%d+[.]?%d*$") ~= nil) then
flickering_delay = tonumber(s_flickering_delay)
box:log("Info", string.format("Flickering Delay : [%s]", s_flickering_delay))
else
box:log("Error", "The parameter 'flickering delay' must be a numeric value\n")
error()
end
-- get the target size
s_targetSize = box:get_setting(6)
s_width, s_height = s_targetSize:match("^(%d+[.]?%d*);(%d+[.]?%d*)$")
target_width = tonumber(s_width)
target_height = tonumber(s_height)
if s_width ~= nil and s_height ~= nil then
box:log("Info", string.format("Target dimensions : width = %g, height = %g", target_width, target_height))
else
box:log("Error", "The parameter 'target size' must be in format float;float")
error()
end
-- get the targets' positions
s_targetPositions = box:get_setting(7)
number_of_targets = 0
for s_target_x, s_target_y in s_targetPositions:gmatch("(-?%d+[.]?%d*);(-?%d+[.]?%d*)") do
box:log("Info", string.format("Target %d : x = %g y = %g", number_of_targets, tonumber(s_target_x), tonumber(s_target_y)))
table.insert(target_positions, {tonumber(s_target_x), tonumber(s_target_y)})
number_of_targets = number_of_targets + 1
end
-- create the configuration file for the stimulation-based-epoching
-- this file is used during classifier training only
cfg_file_name = box:get_config("${Player_ScenarioDirectory}/configuration/stimulation-based-epoching.cfg")
cfg_file = io.open(cfg_file_name, "w")
if cfg_file == nil then
box:log("Error", "Cannot write to [" .. cfg_file_name .. "]")
box:log("Error", "Please copy the scenario folder to a directory with write access and use from there.")
return false
end
cfg_file:write("<OpenViBE-SettingsOverride>\n")
cfg_file:write(" <SettingValue>", stimulation_duration, "</SettingValue>\n")
cfg_file:write(" <SettingValue>", flickering_delay, "</SettingValue>\n")
cfg_file:write(" <SettingValue>OVTK_StimulationId_Target</SettingValue>\n")
cfg_file:write("</OpenViBE-SettingsOverride>\n")
cfg_file:close()
-- create the configuration file for the training program
cfg_file = io.open(box:get_config("${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo-training${CustomConfigurationSuffix${OperatingSystem}}"), "w")
cfg_file:write("# This file was automatically generated!\n\n")
cfg_file:write("# If you want to change the SSVEP trainer configuration\n")
cfg_file:write("# please use the box settings in the training scenario.\n\n")
cfg_file:write("SSVEP_TargetCount = ", number_of_targets, "\n")
cfg_file:write("SSVEP_TargetWidth = ", target_width, "\n")
cfg_file:write("SSVEP_TargetHeight = ", target_height, "\n")
for target_index, position in ipairs(target_positions) do
cfg_file:write("SSVEP_Target_X_", target_index - 1, " = ", position[1], "\n")
cfg_file:write("SSVEP_Target_Y_", target_index - 1, " = ", position[2], "\n")
end
cfg_file:close()
end
function uninitialize(box)
end
function process(box)
while box:keep_processing() and box:get_stimulation_count(1) == 0 do
box:sleep()
end
current_time = box:get_current_time() + 1
box:send_stimulation(1, OVTK_StimulationId_ExperimentStart, current_time, 0)
current_time = current_time + 2
for i,target in ipairs(sequence) do
box:log("Info", string.format("Goal no %d is %d at %d", i, target, current_time))
-- mark goal
box:send_stimulation(2, OVTK_StimulationId_LabelStart + target, current_time, 0)
-- wait for Flickering_delay seconds
current_time = current_time + flickering_delay
-- start flickering
box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStart, current_time, 0)
-- wait for Stimulation_duration seconds
current_time = current_time + stimulation_duration
-- unmark goal and stop flickering
box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStop, current_time, 0)
-- wait for Break_duration seconds
current_time = current_time + break_duration
end
box:send_stimulation(1, OVTK_StimulationId_ExperimentStop, current_time, 0)
box:sleep()
end
@@ -0,0 +1,3 @@
The scenario will record its signals here.
@@ -0,0 +1,852 @@
<OpenViBE-Scenario>
<FormatVersion>1</FormatVersion>
<Creator>OpenVIBE</Creator>
<CreatorVersion>0.1.99</CreatorVersion>
<Settings></Settings>
<Inputs></Inputs>
<Outputs></Outputs>
<Boxes>
<Box>
<Identifier>(0x000003a4, 0x00000114)</Identifier>
<Name>Temporal filter</Name>
<AlgorithmClassIdentifier>(0xb4f9d042, 0x9d79f2e5)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Input signal</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Filtered signal</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x2f2c606c, 0x8512ed68)</TypeIdentifier>
<Name>Filter method</Name>
<DefaultValue>Butterworth</DefaultValue>
<Value>Butterworth</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0xfa20178e, 0x4cba62e9)</TypeIdentifier>
<Name>Filter type</Name>
<DefaultValue>Band pass</DefaultValue>
<Value>Band pass</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>Filter order</Name>
<DefaultValue>4</DefaultValue>
<Value>4</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Low cut frequency (Hz)</Name>
<DefaultValue>29</DefaultValue>
<Value>6.000000</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>High cut frequency (Hz)</Name>
<DefaultValue>40</DefaultValue>
<Value>40.000000</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Pass band ripple (dB)</Name>
<DefaultValue>0.5</DefaultValue>
<Value>0.500000</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>368</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>864</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x27a4ceec, 0x876d6384)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x02ad4f5c)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>6</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00000745, 0x000050af)</Identifier>
<Name>Spectral analysis</Name>
<AlgorithmClassIdentifier>(0x84218ff8, 0xa87e7995)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Input signal</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Amplitude</Name>
</Output>
<Output>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Phase</Name>
</Output>
<Output>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Real Part</Name>
</Output>
<Output>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Imag Part</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Amplitude</Name>
<DefaultValue>true</DefaultValue>
<Value>true</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Phase</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Real Part</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Imaginary Part</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>560</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>864</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x4e5c55a0, 0xe69eb7db)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x018a760d)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>4</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x000018bc, 0x000002fa)</Identifier>
<Name>Raw</Name>
<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Data</Name>
</Input>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Input>
<Input>
<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
<Name>Channel Units</Name>
</Input>
</Inputs>
<Settings>
<Setting>
<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
<Name>Display Mode</Name>
<DefaultValue>Scan</DefaultValue>
<Value>Scan</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
<Name>Auto vertical scale</Name>
<DefaultValue>Per channel</DefaultValue>
<Value>Per channel</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Scale refresh interval (secs)</Name>
<DefaultValue>5</DefaultValue>
<Value>5</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Vertical Scale</Name>
<DefaultValue>100</DefaultValue>
<Value>100</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Vertical Offset</Name>
<DefaultValue>0</DefaultValue>
<Value>0</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Time Scale</Name>
<DefaultValue>10</DefaultValue>
<Value>10</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Horizontal ruler</Name>
<DefaultValue>true</DefaultValue>
<Value>true</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Vertical ruler</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Multiview</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>352.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>464.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x92c056a7, 0x2dc71aff)</Value>
</Attribute>
<Attribute>
<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x0144bb15)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
<Value>false</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>9</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>3</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x0000291a, 0x00002562)</Identifier>
<Name>Time based epoching</Name>
<AlgorithmClassIdentifier>(0x00777fa0, 0x5dc3f560)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Input signal</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Epoched signal 1</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Epoch 1 duration (in sec)</Name>
<DefaultValue>1</DefaultValue>
<Value>2.000000</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Epoch 1 intervals (in sec)</Name>
<DefaultValue>0.5</DefaultValue>
<Value>0.500000</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>432</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>864</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xc5ff41e9, 0xccc59a01)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x011e96bd)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>2</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00004602, 0x00007a29)</Identifier>
<Name>Identity</Name>
<AlgorithmClassIdentifier>(0x5dffe431, 0x35215c50)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Input stream 1</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Output stream 1</Name>
</Output>
</Outputs>
<Attributes>
<Attribute>
<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>64</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>528</Value>
</Attribute>
<Attribute>
<Identifier>(0x30a4e5c9, 0x83502953)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xa8ffe2a3, 0x27038f03)</Value>
</Attribute>
<Attribute>
<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x00ce91c6)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xfba64161, 0x65304e21)</Identifier>
<Value></Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x00007112, 0x00006485)</Identifier>
<Name>Acquisition client</Name>
<AlgorithmClassIdentifier>(0x35d225cb, 0x3e6e3a5f)</AlgorithmClassIdentifier>
<Outputs>
<Output>
<TypeIdentifier>(0x403488e7, 0x565d70b6)</TypeIdentifier>
<Name>Experiment information</Name>
</Output>
<Output>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Signal stream</Name>
</Output>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Output>
<Output>
<TypeIdentifier>(0x013df452, 0xa3a8879a)</TypeIdentifier>
<Name>Channel localisation</Name>
</Output>
<Output>
<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
<Name>Channel units</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
<Name>Acquisition server hostname</Name>
<DefaultValue>${AcquisitionServer_HostName}</DefaultValue>
<Value>${AcquisitionServer_HostName}</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>Acquisition server port</Name>
<DefaultValue>1024</DefaultValue>
<Value>1024</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>-48.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>528.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x0d4656c0, 0xc95b1fa8)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x01e4a38d)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
<Value>false</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>5</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>2</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x000077dd, 0x000055e4)</Identifier>
<Name>Filtered</Name>
<AlgorithmClassIdentifier>(0x0055be5f, 0x087bdd12)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier>
<Name>Data</Name>
</Input>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Input>
<Input>
<TypeIdentifier>(0x6ab26b81, 0x0f8c02f3)</TypeIdentifier>
<Name>Channel Units</Name>
</Input>
</Inputs>
<Settings>
<Setting>
<TypeIdentifier>(0x5de046a6, 0x086340aa)</TypeIdentifier>
<Name>Display Mode</Name>
<DefaultValue>Scan</DefaultValue>
<Value>Scan</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x33a30739, 0x00d5299b)</TypeIdentifier>
<Name>Auto vertical scale</Name>
<DefaultValue>Per channel</DefaultValue>
<Value>Per channel</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Scale refresh interval (secs)</Name>
<DefaultValue>5</DefaultValue>
<Value>5</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Vertical Scale</Name>
<DefaultValue>100</DefaultValue>
<Value>100</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Vertical Offset</Name>
<DefaultValue>0</DefaultValue>
<Value>0</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Time Scale</Name>
<DefaultValue>10</DefaultValue>
<Value>10</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Horizontal ruler</Name>
<DefaultValue>true</DefaultValue>
<Value>true</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Vertical ruler</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Multiview</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>464.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>640.000000</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x92c056a7, 0x2dc71aff)</Value>
</Attribute>
<Attribute>
<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier>
<Value>(0x00000000, 0x01122317)</Value>
</Attribute>
<Attribute>
<Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier>
<Value>false</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>9</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>3</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x338f2b3b, 0x49719bcc)</Identifier>
<Name>Instant Bars</Name>
<AlgorithmClassIdentifier>(0xecb46081, 0x96da0d49)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x1f261c0a, 0x593bf6bd)</TypeIdentifier>
<Name>Matrix</Name>
</Input>
</Inputs>
<Settings>
<Setting>
<TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier>
<Name>Channel Localisation</Name>
<DefaultValue>${AdvancedViz_ChannelLocalisation}</DefaultValue>
<Value>${AdvancedViz_ChannelLocalisation}</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier>
<Name>Positive Data Only ?</Name>
<DefaultValue>false</DefaultValue>
<Value>false</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Gain</Name>
<DefaultValue>1</DefaultValue>
<Value>1</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
<Name>Caption</Name>
<DefaultValue></DefaultValue>
<Value></Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Translucency</Name>
<DefaultValue>1</DefaultValue>
<Value>1</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x3d3c7c7f, 0xef0e7129)</TypeIdentifier>
<Name>Color</Name>
<DefaultValue>${AdvancedViz_DefaultColorGradient}</DefaultValue>
<Value>${AdvancedViz_DefaultColorGradient}</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>672</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>848</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x6b60e2b2, 0xf4839b7d)</Value>
</Attribute>
<Attribute>
<Identifier>(0x527ad68d, 0x16d746a0)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>6</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
</Boxes>
<Links>
<Link>
<Identifier>(0x000032b9, 0x00004e09)</Identifier>
<Source>
<BoxIdentifier>(0x00007112, 0x00006485)</BoxIdentifier>
<BoxOutputIndex>1</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00004602, 0x00007a29)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x00004d15, 0x00007560)</Identifier>
<Source>
<BoxIdentifier>(0x0000291a, 0x00002562)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x00000745, 0x000050af)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x00004fd5, 0x0000009d)</Identifier>
<Source>
<BoxIdentifier>(0x00004602, 0x00007a29)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x000003a4, 0x00000114)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x00006003, 0x00006d3a)</Identifier>
<Source>
<BoxIdentifier>(0x000003a4, 0x00000114)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x0000291a, 0x00002562)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x00007abb, 0x0000009e)</Identifier>
<Source>
<BoxIdentifier>(0x000003a4, 0x00000114)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x000077dd, 0x000055e4)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x00007f52, 0x00002722)</Identifier>
<Source>
<BoxIdentifier>(0x00004602, 0x00007a29)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x000018bc, 0x000002fa)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
<Link>
<Identifier>(0x1792528d, 0x6f582a19)</Identifier>
<Source>
<BoxIdentifier>(0x00000745, 0x000050af)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x338f2b3b, 0x49719bcc)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
</Link>
</Links>
<Comments>
<Comment>
<Identifier>(0x00002b05, 0x000047ad)</Identifier>
<Text>&lt;b&gt;&lt;big&gt;Acquisition test&lt;/big&gt;&lt;/b&gt;
Scenario used for testing data acquisition. The signal quality should
always be checked before training.
</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>880</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>32</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x00007f52, 0x000053c0)</Identifier>
<Text>You can browse each box' documentation by selecting the box and pressing &lt;b&gt;F1&lt;/b&gt;</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>528</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>-112</Value>
</Attribute>
</Attributes>
</Comment>
</Comments>
<Metadata>
<Entry>
<Identifier>(0x0000775c, 0x000078ff)</Identifier>
<Type>(0x3bcce5d2, 0x43f2d968)</Type>
<Data>[{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":776,"identifier":"(0x00006e4a, 0x000001fd)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":753},{"boxIdentifier":"(0x338f2b3b, 0x49719bcc)","childCount":0,"identifier":"(0x5392a425, 0x23169e14)","parentIdentifier":"(0xffffffff, 0xffffffff)","type":3},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003980, 0x0000094e)","index":0,"name":"Default tab","parentIdentifier":"(0x00006e4a, 0x000001fd)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":171,"identifier":"(0x00006c8e, 0x0000570f)","index":0,"maxDividerPosition":731,"name":"Vertical split","parentIdentifier":"(0x00003980, 0x0000094e)","type":4},{"boxIdentifier":"(0x000018bc, 0x000002fa)","childCount":0,"identifier":"(0x00001f89, 0x00001e76)","index":0,"parentIdentifier":"(0x00006c8e, 0x0000570f)","type":3},{"boxIdentifier":"(0x000077dd, 0x000055e4)","childCount":0,"identifier":"(0x0000185e, 0x000017b8)","index":1,"parentIdentifier":"(0x00006c8e, 0x0000570f)","type":3}]</Data>
</Entry>
</Metadata>
<Attributes>
<Attribute>
<Identifier>(0x790d75b8, 0x3bb90c33)</Identifier>
<Value>Jozef Leg&#233;ny</Value>
</Attribute>
<Attribute>
<Identifier>(0x8c1fc55b, 0x7b433dc2)</Identifier>
<Value>1.0</Value>
</Attribute>
<Attribute>
<Identifier>(0x9f5c4075, 0x4a0d3666)</Identifier>
<Value>SSVEP Acquisition Test</Value>
</Attribute>
<Attribute>
<Identifier>(0xf36a1567, 0xd13c53da)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xf6b2e3fa, 0x7bd43926)</Identifier>
<Value>SSVEP</Value>
</Attribute>
<Attribute>
<Identifier>(0xf8034a49, 0x8b3f37cc)</Identifier>
<Value>Inria</Value>
</Attribute>
</Attributes>
</OpenViBE-Scenario>
@@ -0,0 +1,453 @@
<OpenViBE-Scenario>
<FormatVersion>1</FormatVersion>
<Creator>OpenVIBE</Creator>
<CreatorVersion>0.0.2</CreatorVersion>
<Boxes>
<Box>
<Identifier>(0x0de6da7d, 0x3a63884e)</Identifier>
<Name>Player Controller</Name>
<AlgorithmClassIdentifier>(0x5f426dce, 0x08456e13)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Input>
</Inputs>
<Settings>
<Setting>
<TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier>
<Name>Stimulation name</Name>
<DefaultValue>OVTK_StimulationId_Label_00</DefaultValue>
<Value>OVTK_StimulationId_TrainCompleted</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0xcc14d8d6, 0xf27ecb73)</TypeIdentifier>
<Name>Action to perform</Name>
<DefaultValue>Pause</DefaultValue>
<Value>Stop</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>528</Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
<Value>27</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>352</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0x568d148e, 0x650792b3)</Value>
</Attribute>
<Attribute>
<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
<Value>134</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>2</Value>
</Attribute>
<Attribute>
<Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier>
<Value>1</Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x643a57e6, 0x5db6b5a5)</Identifier>
<Name>Experiment Settings</Name>
<AlgorithmClassIdentifier>(0x0b5a2787, 0x02750621)</AlgorithmClassIdentifier>
<Inputs>
<Input>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>New input</Name>
</Input>
</Inputs>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0xb0d0db45, 0x49cbc34a)</TypeIdentifier>
<Name>Lua Script</Name>
<DefaultValue></DefaultValue>
<Value>${Player_ScenarioDirectory}/scripts/configuration-experiment-settings.lua</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x7f45a2a9, 0x7db12219)</TypeIdentifier>
<Name>Target Light Color</Name>
<DefaultValue>100,0,0</DefaultValue>
<Value>100,0,0</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x7f45a2a9, 0x7db12219)</TypeIdentifier>
<Name>Target Dark Color</Name>
<DefaultValue>0,0,0</DefaultValue>
<Value>10,10,10</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier>
<Name>Stimulation Frequencies</Name>
<DefaultValue>20;15;12</DefaultValue>
<Value>20;15;12</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Processing Epoch Duration</Name>
<DefaultValue>0.5</DefaultValue>
<Value>0.5</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Processing Epoch Interval</Name>
<DefaultValue>0.1</DefaultValue>
<Value>0.1</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier>
<Name>Processing Frequency Tolerance</Name>
<DefaultValue>0.250</DefaultValue>
<Value>0.250</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>272</Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
<Value>57</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>352</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xd6e3f48b, 0xbee3523a)</Value>
</Attribute>
<Attribute>
<Identifier>(0x61d11811, 0x71e65362)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
<Value>158</Value>
</Attribute>
<Attribute>
<Identifier>(0xc67a01dc, 0x28ce06c1)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xf191c1c8, 0xa0123976)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xfba64161, 0x65304e21)</Identifier>
<Value></Value>
</Attribute>
</Attributes>
</Box>
<Box>
<Identifier>(0x7e8245e4, 0x41dbf359)</Identifier>
<Name>Peripheral Settings</Name>
<AlgorithmClassIdentifier>(0x0b5a2787, 0x02750621)</AlgorithmClassIdentifier>
<Outputs>
<Output>
<TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier>
<Name>Stimulations</Name>
</Output>
</Outputs>
<Settings>
<Setting>
<TypeIdentifier>(0xb0d0db45, 0x49cbc34a)</TypeIdentifier>
<Name>Lua Script</Name>
<DefaultValue></DefaultValue>
<Value>${Player_ScenarioDirectory}/scripts/configuration-peripheral-settings.lua</Value>
<Modifiability>false</Modifiability>
</Setting>
<Setting>
<TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier>
<Name>Screen Refresh Rate</Name>
<DefaultValue>60</DefaultValue>
<Value>60</Value>
<Modifiability>false</Modifiability>
</Setting>
</Settings>
<Attributes>
<Attribute>
<Identifier>(0x17ee7c08, 0x94c14893)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier>
<Value>0</Value>
</Attribute>
<Attribute>
<Identifier>(0x1fa963f5, 0x1a638cd4)</Identifier>
<Value>57</Value>
</Attribute>
<Attribute>
<Identifier>(0x207c9054, 0x3c841b63)</Identifier>
<Value>352</Value>
</Attribute>
<Attribute>
<Identifier>(0x4e7b798a, 0x183beafb)</Identifier>
<Value>(0xd6e3f48b, 0xbee3523a)</Value>
</Attribute>
<Attribute>
<Identifier>(0x61d11811, 0x71e65362)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xad100179, 0xa3c984ab)</Identifier>
<Value>149</Value>
</Attribute>
<Attribute>
<Identifier>(0xc80ce8af, 0xf699f813)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xce18836a, 0x9c0eb403)</Identifier>
<Value>1</Value>
</Attribute>
<Attribute>
<Identifier>(0xf191c1c8, 0xa0123976)</Identifier>
<Value></Value>
</Attribute>
<Attribute>
<Identifier>(0xfba64161, 0x65304e21)</Identifier>
<Value></Value>
</Attribute>
</Attributes>
</Box>
</Boxes>
<Links>
<Link>
<Identifier>(0x0c266f90, 0x7fc31cc9)</Identifier>
<Source>
<BoxIdentifier>(0x643a57e6, 0x5db6b5a5)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x0de6da7d, 0x3a63884e)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
<Attributes>
<Attribute>
<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
<Value>307</Value>
</Attribute>
<Attribute>
<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
<Value>352</Value>
</Attribute>
<Attribute>
<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
<Value>510</Value>
</Attribute>
<Attribute>
<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
<Value>352</Value>
</Attribute>
</Attributes>
</Link>
<Link>
<Identifier>(0x1e9366aa, 0x1443b0fb)</Identifier>
<Source>
<BoxIdentifier>(0x7e8245e4, 0x41dbf359)</BoxIdentifier>
<BoxOutputIndex>0</BoxOutputIndex>
</Source>
<Target>
<BoxIdentifier>(0x643a57e6, 0x5db6b5a5)</BoxIdentifier>
<BoxInputIndex>0</BoxInputIndex>
</Target>
<Attributes>
<Attribute>
<Identifier>(0x1b32c44c, 0x1905e0e9)</Identifier>
<Value>35</Value>
</Attribute>
<Attribute>
<Identifier>(0x358ae8b5, 0x0f8bacd1)</Identifier>
<Value>352</Value>
</Attribute>
<Attribute>
<Identifier>(0x3f0a3b27, 0x570913d2)</Identifier>
<Value>239</Value>
</Attribute>
<Attribute>
<Identifier>(0x6267b5c5, 0x676e3e42)</Identifier>
<Value>352</Value>
</Attribute>
</Attributes>
</Link>
</Links>
<Comments>
<Comment>
<Identifier>(0x05488892, 0x66346878)</Identifier>
<Text>&lt;big&gt;&lt;b&gt;Peripheral Settings&lt;/b&gt;&lt;/big&gt;
Settings in this box must match your hardware configuration.
Currently, the only supported setting is the screen refresh rate.
&lt;b&gt;Screen Refresh Rate : &lt;/b&gt; The refresh rate of your screen,
refer to your screen's user manual to find this value.
&lt;span color="red"&gt;Important notice&lt;/span&gt;
Your screen will be able to reproduce only frequencies which
are result of division of your screen refresh rate by an
integer. </Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>-32</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>-48</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x3974ed1f, 0x29aa94c8)</Identifier>
<Text>&lt;big&gt;&lt;b&gt;Scenario description&lt;/b&gt;&lt;/big&gt;
&lt;b&gt;&lt;span color="red"&gt;This scenario must be run at least once before
running any further SSVEP scenarios&lt;/span&gt;&lt;/b&gt;
This is a scenario where you can configure your SSVEP experiment. There
are two boxes containing configuration parameters:
&lt;b&gt;Peripheral Settings&lt;/b&gt;
&lt;b&gt;Experiment Settings&lt;/b&gt;
For more detailed description please refer to the SSVEP
documentation page.</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>352</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>-336</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x5604a66d, 0x71c42d00)</Identifier>
<Text> &lt;b&gt;&lt;span color="#2060ff"&gt;Configurable box&lt;/span&gt;&lt;/b&gt;
</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>352</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>0</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x60f812bd, 0x313894cf)</Identifier>
<Text>&lt;big&gt;&lt;b&gt;Experiment Settings&lt;/b&gt;&lt;/big&gt;
Settings concerning the SSVEP experiment in general.
&lt;b&gt;Target Light Color&lt;/b&gt; and &lt;b&gt;Target Dark Color&lt;/b&gt; represent
the two colors which will be used to generate the flickering of
the targets. The notation Light and Dark is arbitrary, however on
frequencies using odd number of frames will use more frames to
represent the Light color.
&lt;b&gt;Stimulation Frequencies&lt;/b&gt; A comma separated list of
frequencies used for the stimulation. Refer to the documentation
for more details.
&lt;b&gt;Processing Epoch Duration&lt;/b&gt; The length of the slice of the signal
which will be used to find SSVEP response. With longer duration precision
will increase at the detriment of the lag.
&lt;b&gt;Processing Epoch Interval&lt;/b&gt; The speed interval between slices of the
signal.
&lt;b&gt;Processing Frequency Tolerance&lt;/b&gt; The width of the frequency band
around the stimulation frequency used for classification.</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>-32</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>304</Value>
</Attribute>
</Attributes>
</Comment>
<Comment>
<Identifier>(0x6a410d4e, 0x61696337)</Identifier>
<Text> &lt;b&gt;&lt;span color="#2060ff"&gt;Configurable box&lt;/span&gt;&lt;/b&gt;
</Text>
<Attributes>
<Attribute>
<Identifier>(0x473d9a43, 0x97fc0a97)</Identifier>
<Value>352</Value>
</Attribute>
<Attribute>
<Identifier>(0x7234b86b, 0x2b8651a5)</Identifier>
<Value>272</Value>
</Attribute>
</Attributes>
</Comment>
</Comments>
<Metadata>
<Entry>
<Identifier>(0x0000775c, 0x000078ff)</Identifier>
<Type>(0x3bcce5d2, 0x43f2d968)</Type>
<Data>[{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x48715606, 0x15ba4f24)","index":0,"name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x3683b3e2, 0x7c4b4806)","index":0,"name":"Default tab","parentIdentifier":"(0x48715606, 0x15ba4f24)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x1fb42682, 0x45866d35)","index":0,"name":"Empty","parentIdentifier":"(0x3683b3e2, 0x7c4b4806)","type":0}]</Data>
</Entry>
</Metadata>
</OpenViBE-Scenario>
@@ -0,0 +1,43 @@
Kernel_3DVisualizationEnabled = true
Kernel_3DVisualizationOgreStatisticsOverlayEnabled = false
Kernel_3DVisualizationOgreConfiguration = ${Path_Data}/kernel/ogre.cfg
Kernel_3DVisualizationOgreResources = ${Path_Data}/kernel/resources.cfg
Kernel_3DVisualizationOgrePluginsLinux = ${Path_Data}/openvibe-ogre-plugins.cfg
Kernel_3DVisualizationOgrePluginsWindowsSubDirectoryRelease = release
Kernel_3DVisualizationOgrePluginsWindowsSubDirectoryDebug = debug
Kernel_3DVisualizationOgrePluginsWindowsPostFixDebug = _d
Kernel_3DVisualizationOgrePluginsWindowsPostFixRelease =
Kernel_3DVisualizationOgrePluginsWindows = $Environment{OGRE_HOME}/bin/${Kernel_3DVisualizationOgrePluginsWindowsSubDirectory${BuildType}}/Plugins${Kernel_3DVisualizationOgrePluginsWindowsPostFix${BuildType}}.cfg
Kernel_3DVisualizationOgrePlugins = ${Kernel_3DVisualizationOgrePlugins${OperatingSystem}}
Kernel_3DVisualizationOgreLogLevel = Debug
Kernel_3DVisualizationOgreLogPath = ${Path_Log}/${ApplicationName}-ogre.log
SSVEP_VRPNServerPort = 1337
SSVEP_VRPNHost = localhost
SSVEP_ScreenRefreshRate = 60
SSVEP_EpochDuration = 0.5
SSVEP_EpochInterval = 0.1
SSVEP_Frequency_1 = 20
SSVEP_Frequency_2 = 15
SSVEP_Frequency_3 = 12
SSVEP_Frequency_4 = 10
SSVEP_Ogre_LogToConsole = false
SSVEP_TargetLightColourRed = 1.0
SSVEP_TargetLightColourGreen = 0.0
SSVEP_TargetLightColourBlue = 0.0
SSVEP_TargetDarkColourRed = 0.0
SSVEP_TargetDarkColourGreen = 0.0
SSVEP_TargetDarkColourBlue = 0.0
Include = ${Path_Data}/applications/ssvep-demo/${SSVEP_ApplicationDescriptor}.conf
Include = ${CustomConfigurationApplication}
Include = ${CustomConfigurationPrefix${OperatingSystem}}-ssvep-demo-${SSVEP_ApplicationDescriptor}${CustomConfigurationSuffix${OperatingSystem}}
@@ -0,0 +1,7 @@
material BasicSurface/Diffuse
{
technique
{
pass { lighting off }
}
}
@@ -0,0 +1,245 @@
<?xml version="1.0" ?>
<Imageset name="TaharezLook" imagefile="TaharezLook.tga" nativeHorzRes="800" nativeVertRes="600" autoScaled="true" version="2">
<Image name="ClientBrush" xPos="2" yPos="2" width="64" height="64" />
<Image name="GenericBrush" xPos="9" yPos="71" width="1" height="1" />
<Image name="WindowLeftEdge" xPos="6" yPos="95" width="1" height="22" xOffset="4" />
<Image name="WindowRightEdge" xPos="34" yPos="95" width="1" height="22" xOffset="-5" />
<Image name="WindowTopEdge" xPos="9" yPos="68" width="23" height="1" />
<Image name="WindowBottomEdge" xPos="9" yPos="143" width="23" height="1" />
<Image name="WindowTopLeft" xPos="2" yPos="68" width="5" height="24" />
<Image name="WindowTopRight" xPos="34" yPos="68" width="5" height="24" />
<Image name="WindowBottomLeft" xPos="2" yPos="120" width="5" height="24" />
<Image name="WindowBottomRight" xPos="34" yPos="120" width="5" height="24" />
<Image name="ButtonLeftNormal" xPos="68" yPos="20" width="12" height="16" />
<Image name="ButtonMiddleNormal" xPos="82" yPos="20" width="12" height="16" />
<Image name="ButtonRightNormal" xPos="96" yPos="20" width="12" height="16" />
<Image name="ButtonLeftPushed" xPos="68" yPos="38" width="12" height="16" />
<Image name="ButtonMiddlePushed" xPos="82" yPos="38" width="12" height="16" />
<Image name="ButtonRightPushed" xPos="96" yPos="38" width="12" height="16" />
<Image name="ButtonLeftHighlight" xPos="68" yPos="56" width="12" height="16" />
<Image name="ButtonMiddleHighlight" xPos="82" yPos="56" width="12" height="16" />
<Image name="ButtonRightHighlight" xPos="96" yPos="56" width="12" height="16" />
<Image name="CheckboxNormal" xPos="110" yPos="2" width="12" height="12" />
<Image name="CheckboxHover" xPos="110" yPos="30" width="12" height="12" />
<Image name="CheckboxMark" xPos="110" yPos="16" width="12" height="12" />
<Image name="RadioButtonNormal" xPos="124" yPos="2" width="12" height="12" />
<Image name="RadioButtonHover" xPos="124" yPos="30" width="12" height="12" />
<Image name="RadioButtonMark" xPos="124" yPos="16" width="12" height="12" />
<Image name="TitlebarLeft" xPos="68" yPos="2" width="8" height="16" />
<Image name="TitlebarMiddle" xPos="78" yPos="2" width="8" height="16" />
<Image name="TitlebarRight" xPos="88" yPos="2" width="8" height="16" />
<Image name="NewTitlebarLeft" xPos="61" yPos="127" width="13" height="16" />
<Image name="NewTitlebarMiddle" xPos="77" yPos="127" width="12" height="16" />
<Image name="NewTitlebarRight" xPos="92" yPos="127" width="12" height="16" />
<Image name="SysAreaMiddle" xPos="107" yPos="127" width="12" height="16" />
<Image name="SysAreaRight" xPos="122" yPos="127" width="13" height="16" />
<Image name="StaticLeft" xPos="41" yPos="89" width="6" height="6" />
<Image name="StaticRight" xPos="63" yPos="89" width="6" height="6" />
<Image name="StaticTop" xPos="52" yPos="78" width="6" height="6" />
<Image name="StaticBottom" xPos="52" yPos="100" width="6" height="6" />
<Image name="StaticTopLeft" xPos="41" yPos="78" width="6" height="6" />
<Image name="StaticTopRight" xPos="63" yPos="78" width="6" height="6" />
<Image name="StaticBottomLeft" xPos="41" yPos="100" width="6" height="6" />
<Image name="StaticBottomRight" xPos="63" yPos="100" width="6" height="6" />
<Image name="StaticBackdrop" xPos="52" yPos="89" width="6" height="6" />
<Image name="ProgressBarLeft" xPos="71" yPos="74" width="7" height="12" />
<Image name="ProgressBarMiddle" xPos="80" yPos="74" width="6" height="12" />
<Image name="ProgressBarRight" xPos="88" yPos="74" width="6" height="12" />
<Image name="ProgressBarDimSegment" xPos="96" yPos="74" width="8" height="12" />
<Image name="ProgressBarLitSegment" xPos="106" yPos="74" width="8" height="12" />
<Image name="EditBoxLeft" xPos="41" yPos="108" width="4" height="18" />
<Image name="EditBoxMiddle" xPos="47" yPos="108" width="4" height="18" />
<Image name="EditBoxRight" xPos="53" yPos="108" width="4" height="18" />
<Image name="EditBoxCaret" xPos="60" yPos="108" width="4" height="18" />
<Image name="SpinnerUpNormal" xPos="68" yPos="110" width="10" height="6" />
<Image name="SpinnerDownNormal" xPos="68" yPos="118" width="10" height="6" />
<Image name="SpinnerUpHover" xPos="82" yPos="110" width="10" height="6" />
<Image name="SpinnerDownHover" xPos="82" yPos="118" width="10" height="6" />
<Image name="TextSelectionBrush" xPos="8" yPos="70" width="16" height="16" />
<Image name="VertScrollTop" xPos="182" yPos="2" width="20" height="8" />
<Image name="VertScrollMiddle" xPos="182" yPos="12" width="20" height="8" />
<Image name="VertScrollBottom" xPos="182" yPos="22" width="20" height="8" />
<Image name="VertScrollBarSegment" xPos="206" yPos="2" width="4" height="10" />
<Image name="VertScrollThumbNormal" xPos="214" yPos="2" width="8" height="24" />
<Image name="VertScrollThumbHover" xPos="224" yPos="2" width="8" height="24" />
<Image name="VertScrollUpNormal" xPos="196" yPos="32" width="12" height="12" />
<Image name="VertScrollDownNormal" xPos="182" yPos="32" width="12" height="12" />
<Image name="VertScrollUpHover" xPos="196" yPos="46" width="12" height="12" />
<Image name="VertScrollDownHover" xPos="182" yPos="46" width="12" height="12" />
<Image name="MiniVertScrollBarSegment" xPos="207" yPos="60" width="4" height="10" />
<Image name="MiniVertScrollThumbNormal" xPos="214" yPos="59" width="7" height="22" />
<Image name="MiniVertScrollThumbTopNormal" xPos="214" yPos="59" width="7" height="5" />
<Image name="MiniVertScrollThumbMiddleNormal" xPos="214" yPos="65" width="7" height="5" />
<Image name="MiniVertScrollThumbBottomNormal" xPos="214" yPos="76" width="7" height="5" />
<Image name="MiniVertScrollThumbTopHover" xPos="223" yPos="59" width="7" height="5" />
<Image name="MiniVertScrollThumbMiddleHover" xPos="223" yPos="65" width="7" height="5" />
<Image name="MiniVertScrollThumbBottomHover" xPos="223" yPos="76" width="7" height="5" />
<Image name="MiniVertScrollThumbHover" xPos="223" yPos="59" width="7" height="22" />
<Image name="MiniVertScrollUpNormal" xPos="194" yPos="60" width="10" height="9" />
<Image name="MiniVertScrollDownNormal" xPos="182" yPos="59" width="10" height="9" />
<Image name="MiniVertScrollUpHover" xPos="194" yPos="70" width="10" height="9" />
<Image name="MiniVertScrollDownHover" xPos="182" yPos="69" width="10" height="9" />
<Image name="VertSliderBody" xPos="234" yPos="2" width="9" height="48" />
<Image name="VertSliderThumbNormal" xPos="217" yPos="28" width="15" height="6" />
<Image name="VertSliderThumbHover" xPos="217" yPos="36" width="15" height="6" />
<Image name="MiniHorzScrollBarSegment" xPos="244" yPos="80" width="10" height="4" />
<Image name="MiniHorzScrollThumbNormal" xPos="233" yPos="87" width="22" height="7" />
<Image name="MiniHorzScrollThumbLeftNormal" xPos="233" yPos="87" width="5" height="7" />
<Image name="MiniHorzScrollThumbMiddleNormal" xPos="239" yPos="87" width="5" height="7" />
<Image name="MiniHorzScrollThumbRightNormal" xPos="250" yPos="87" width="5" height="7" />
<Image name="MiniHorzScrollThumbHover" xPos="233" yPos="96" width="22" height="7" />
<Image name="MiniHorzScrollThumbLeftHover" xPos="233" yPos="96" width="5" height="7" />
<Image name="MiniHorzScrollThumbMiddleHover" xPos="239" yPos="96" width="5" height="7" />
<Image name="MiniHorzScrollThumbRightHover" xPos="250" yPos="96" width="5" height="7" />
<Image name="MiniHorzScrollLeftNormal" xPos="246" yPos="55" width="9" height="10" />
<Image name="MiniHorzScrollRightNormal" xPos="245" yPos="67" width="9" height="10" />
<Image name="MiniHorzScrollLeftHover" xPos="236" yPos="55" width="9" height="10" />
<Image name="MiniHorzScrollRightHover" xPos="235" yPos="67" width="9" height="10" />
<Image name="ListboxLeft" xPos="41" yPos="89" width="7" height="6" />
<Image name="ListboxRight" xPos="62" yPos="89" width="7" height="6" />
<Image name="ListboxTop" xPos="52" yPos="78" width="6" height="7" />
<Image name="ListboxBottom" xPos="52" yPos="99" width="6" height="7" />
<Image name="ListboxTopLeft" xPos="41" yPos="78" width="7" height="7" />
<Image name="ListboxTopRight" xPos="62" yPos="78" width="7" height="7" />
<Image name="ListboxBottomLeft" xPos="41" yPos="99" width="7" height="7" />
<Image name="ListboxBottomRight" xPos="62" yPos="99" width="7" height="7" />
<Image name="ListboxBackdrop" xPos="52" yPos="89" width="6" height="6" />
<Image name="ListboxSelectionBrush" xPos="8" yPos="70" width="16" height="16" />
<Image name="ComboboxEditLeft" xPos="138" yPos="2" width="8" height="16" />
<Image name="ComboboxEditMiddle" xPos="148" yPos="2" width="8" height="16" />
<Image name="ComboboxListButtonNormal" xPos="158" yPos="2" width="16" height="16" />
<Image name="ComboboxListButtonHover" xPos="158" yPos="20" width="16" height="16" />
<Image name="ComboboxListLeft" xPos="138" yPos="48" width="8" height="8" />
<Image name="ComboboxListRight" xPos="158" yPos="48" width="8" height="8" />
<Image name="ComboboxListTop" xPos="148" yPos="48" width="8" height="8" />
<Image name="ComboboxListBottom" xPos="148" yPos="58" width="8" height="8" />
<Image name="ComboboxListTopLeft" xPos="138" yPos="38" width="8" height="8" />
<Image name="ComboboxListTopRight" xPos="158" yPos="38" width="8" height="8" />
<Image name="ComboboxListBottomLeft" xPos="138" yPos="58" width="8" height="8" />
<Image name="ComboboxListBottomRight" xPos="158" yPos="58" width="8" height="8" />
<Image name="ComboboxListBackdrop" xPos="148" yPos="48" width="8" height="8" />
<Image name="ComboboxSelectionBrush" xPos="8" yPos="70" width="16" height="16" />
<Image name="ComboboxDividerLeft" xPos="138" yPos="68" width="14" height="1" />
<Image name="ComboboxDividerMiddle" xPos="154" yPos="68" width="8" height="1" />
<Image name="ComboboxDividerRight" xPos="164" yPos="68" width="14" height="1" />
<Image name="HeaderBarBackdropNormal" xPos="230" yPos="163" width="10" height="12" />
<Image name="HeaderBarBackdropHover" xPos="230" yPos="163" width="10" height="12" />
<Image name="HeaderBarSplitterNormal" xPos="225" yPos="92" width="3" height="16" />
<Image name="HeaderBarSplitterHover" xPos="200" yPos="92" width="3" height="16" />
<Image name="HeaderBarSortUp" xPos="233" yPos="178" width="8" height="8" />
<Image name="HeaderBarSortDown" xPos="244" yPos="178" width="8" height="8" />
<Image name="MultiListLeft" xPos="170" yPos="92" width="7" height="6" />
<Image name="MultiListRight" xPos="191" yPos="92" width="7" height="6" />
<Image name="MultiListTop" xPos="181" yPos="81" width="6" height="7" />
<Image name="MultiListBottom" xPos="181" yPos="102" width="6" height="7" />
<Image name="MultiListTopLeft" xPos="170" yPos="81" width="7" height="7" />
<Image name="MultiListTopRight" xPos="191" yPos="81" width="7" height="7" />
<Image name="MultiListBottomLeft" xPos="170" yPos="102" width="7" height="7" />
<Image name="MultiListBottomRight" xPos="191" yPos="102" width="7" height="7" />
<Image name="MultiListBackdrop" xPos="181" yPos="92" width="6" height="6" />
<Image name="MultiListSelectionBrush" xPos="9" yPos="71" width="14" height="14" />
<Image name="AltProgressLeft" xPos="71" yPos="88" width="8" height="12" />
<Image name="AltProgressMiddle" xPos="81" yPos="88" width="8" height="12" />
<Image name="AltProgressRight" xPos="91" yPos="88" width="8" height="12" />
<Image name="AltProgressQuarter" xPos="102" yPos="89" width="3" height="4" />
<Image name="AltProgressHalf" xPos="109" yPos="89" width="4" height="5" />
<Image name="AltProgressLight1" xPos="100" yPos="97" width="4" height="8" />
<Image name="AltProgressLight2" xPos="106" yPos="97" width="4" height="8" />
<Image name="AltProgressLight3" xPos="112" yPos="97" width="4" height="8" />
<Image name="AltProgressLight4" xPos="118" yPos="97" width="4" height="8" />
<Image name="AltProgressLight5" xPos="124" yPos="97" width="4" height="8" />
<Image name="AltProgressLight6" xPos="130" yPos="97" width="4" height="8" />
<Image name="AltProgressLight7" xPos="136" yPos="97" width="4" height="8" />
<Image name="AltProgressLight8" xPos="142" yPos="97" width="4" height="8" />
<Image name="AltProgressLight9" xPos="148" yPos="97" width="4" height="8" />
<Image name="AltProgressLight10" xPos="154" yPos="97" width="4" height="8" />
<Image name="CloseButtonNormal" xPos="41" yPos="128" width="16" height="16" />
<Image name="CloseButtonHover" xPos="41" yPos="146" width="16" height="16" />
<Image name="CloseButtonPressed" xPos="41" yPos="164" width="16" height="16" />
<Image name="NewCloseButtonNormal" xPos="90" yPos="146" width="10" height="10" />
<Image name="NewCloseButtonHover" xPos="90" yPos="146" width="10" height="10" />
<Image name="NewCloseButtonPressed" xPos="90" yPos="146" width="10" height="10" />
<Image name="MultiLineEditboxLeft" xPos="41" yPos="89" width="6" height="6" />
<Image name="MultiLineEditboxRight" xPos="63" yPos="89" width="6" height="6" />
<Image name="MultiLineEditboxTop" xPos="52" yPos="78" width="6" height="6" />
<Image name="MultiLineEditboxBottom" xPos="52" yPos="100" width="6" height="6" />
<Image name="MultiLineEditboxTopLeft" xPos="41" yPos="78" width="6" height="6" />
<Image name="MultiLineEditboxTopRight" xPos="63" yPos="78" width="6" height="6" />
<Image name="MultiLineEditboxBottomLeft" xPos="41" yPos="100" width="6" height="6" />
<Image name="MultiLineEditboxBottomRight" xPos="63" yPos="100" width="6" height="6" />
<Image name="MultiLineEditboxBackdrop" xPos="52" yPos="89" width="6" height="6" />
<Image name="MultiLineEditboxSelectionBrush" xPos="9" yPos="71" width="14" height="14" />
<Image name="MouseTarget" xPos="182" yPos="127" width="17" height="17" xOffset="-8" yOffset="-8" />
<Image name="MouseArrow" xPos="138" yPos="127" width="31" height="25" xOffset="0" yOffset="0" />
<Image name="MouseMoveCursor" xPos="201" yPos="127" width="18" height="18" xOffset="-8" yOffset="-8" />
<Image name="MouseNoSoCursor" xPos="221" yPos="127" width="8" height="18" xOffset="-3" yOffset="-8" />
<Image name="MouseEsWeCursor" xPos="182" yPos="150" width="18" height="8" xOffset="-8" yOffset="-3" />
<Image name="MouseNeSwCursor" xPos="201" yPos="147" width="14" height="14" xOffset="-7" yOffset="-7" />
<Image name="MouseNwSeCursor" xPos="230" yPos="126" width="14" height="14" xOffset="-7" yOffset="-7" />
<Image name="MouseTextBar" xPos="173" yPos="127" width="7" height="18" xOffset="-2" yOffset="-9" />
<Image name="TabHorizontalFiller" xPos="197" yPos="201" width="7" height="1" />
<Image name="TabContentPaneUpperLeft" xPos="41" yPos="78" width="7" height="7" />
<Image name="TabContentPaneUpper" xPos="52" yPos="78" width="6" height="7" />
<Image name="TabContentPaneUpperRight" xPos="62" yPos="78" width="7" height="7" />
<Image name="TabContentPaneLeft" xPos="41" yPos="89" width="7" height="6" />
<Image name="TabContentPaneRight" xPos="62" yPos="89" width="7" height="6" />
<Image name="TabContentPaneLower" xPos="52" yPos="99" width="6" height="7" />
<Image name="TabContentPaneLowerLeft" xPos="41" yPos="99" width="7" height="7" />
<Image name="TabContentPaneLowerRight" xPos="62" yPos="99" width="7" height="7" />
<Image name="TabContentPaneMiddle" xPos="52" yPos="89" width="6" height="6" />
<Image name="TabButtonScrollLeftNormal" xPos="97" yPos="108" width="16" height="17" />
<Image name="TabButtonScrollRightNormal" xPos="112" yPos="108" width="16" height="17" />
<Image name="TabButtonScrollLeftHover" xPos="127" yPos="108" width="16" height="17" />
<Image name="TabButtonScrollRightHover" xPos="142" yPos="108" width="16" height="17" />
<Image name="TabButtonLeftNormal" xPos="41" yPos="89" width="7" height="6" />
<Image name="TabButtonRightNormal" xPos="62" yPos="89" width="7" height="6" />
<Image name="TabButtonUpperNormal" xPos="52" yPos="78" width="6" height="7" />
<Image name="TabButtonLowerNormal" xPos="52" yPos="99" width="6" height="7" />
<Image name="TabButtonUpperLeftNormal" xPos="41" yPos="78" width="7" height="7" />
<Image name="TabButtonUpperLeft2Normal" xPos="186" yPos="164" width="7" height="7" />
<Image name="TabButtonUpperRightNormal" xPos="62" yPos="78" width="7" height="7" />
<Image name="TabButtonLowerLeftNormal" xPos="41" yPos="99" width="7" height="7" />
<Image name="TabButtonLowerRightNormal" xPos="62" yPos="99" width="7" height="7" />
<Image name="TabButtonLowerRight2Normal" xPos="187" yPos="195" width="7" height="7" />
<Image name="TabButtonMiddleNormal" xPos="52" yPos="89" width="6" height="6" />
<Image name="TabButtonLeftSelected" xPos="41" yPos="89" width="7" height="6" />
<Image name="TabButtonRightSelected" xPos="62" yPos="89" width="7" height="6" />
<Image name="TabButtonUpperSelected" xPos="52" yPos="78" width="6" height="7" />
<Image name="TabButtonLowerSelected" xPos="52" yPos="89" width="6" height="6" />
<Image name="TabButtonUpperLeftSelected" xPos="41" yPos="78" width="7" height="7" />
<Image name="TabButtonUpperRightSelected" xPos="62" yPos="78" width="7" height="7" />
<Image name="TabButtonLowerLeftSelected" xPos="41" yPos="99" width="7" height="7" />
<Image name="TabButtonLowerRightSelected" xPos="62" yPos="99" width="7" height="7" />
<Image name="TabButtonMiddleSelected" xPos="52" yPos="89" width="6" height="6" />
<Image name="TooltipTopLeft" xPos="61" yPos="160" width="4" height="4" />
<Image name="TooltipTopRight" xPos="85" yPos="160" width="5" height="4" />
<Image name="TooltipBottomLeft" xPos="61" yPos="184" width="4" height="5" />
<Image name="TooltipBottomRight" xPos="85" yPos="184" width="5" height="5" />
<Image name="TooltipLeftEdge" xPos="61" yPos="171" width="4" height="6" />
<Image name="TooltipRightEdge" xPos="85" yPos="171" width="5" height="6" />
<Image name="TooltipTopEdge" xPos="72" yPos="160" width="6" height="4" />
<Image name="TooltipBottomEdge" xPos="72" yPos="184" width="6" height="5" />
<Image name="TooltipMiddle" xPos="72" yPos="171" width="6" height="6" />
<Image name="MenuTopLeft" xPos="166" yPos="204" width="2" height="2" />
<Image name="MenuTopRight" xPos="175" yPos="204" width="3" height="2" />
<Image name="MenuBottomLeft" xPos="166" yPos="213" width="2" height="3" />
<Image name="MenuBottomRight" xPos="175" yPos="213" width="3" height="3" />
<Image name="MenuLeft" xPos="166" yPos="209" width="2" height="1" />
<Image name="MenuRight" xPos="175" yPos="209" width="3" height="1" />
<Image name="MenuTop" xPos="171" yPos="204" width="1" height="2" />
<Image name="MenuBottom" xPos="171" yPos="213" width="1" height="3" />
<Image name="MenuMiddle" xPos="171" yPos="209" width="1" height="1" />
<Image name="PopupMenuFrameTopLeft" xPos="186" yPos="204" width="2" height="2" />
<Image name="PopupMenuFrameTopRight" xPos="195" yPos="204" width="4" height="2" />
<Image name="PopupMenuFrameBottomLeft" xPos="186" yPos="213" width="2" height="4" />
<Image name="PopupMenuFrameBottomRight" xPos="195" yPos="213" width="4" height="4" />
<Image name="PopupMenuFrameLeft" xPos="186" yPos="209" width="2" height="1" />
<Image name="PopupMenuFrameRight" xPos="195" yPos="209" width="4" height="1" />
<Image name="PopupMenuFrameTop" xPos="191" yPos="204" width="1" height="2" />
<Image name="PopupMenuFrameBottom" xPos="191" yPos="213" width="1" height="4" />
<Image name="PopupMenuMiddle" xPos="191" yPos="209" width="1" height="1" />
<Image name="PopupMenuArrowRight" xPos="179" yPos="204" width="5" height="5" />
<Image name="PopupMenuArrowLeft" xPos="179" yPos="210" width="5" height="5" />
<Image name="TreeListClosed" xPos="175" yPos="111" width="7" height="11" xOffset="8" yOffset="2" />
<Image name="TreeListOpened" xPos="164" yPos="111" width="11" height="7" xOffset="8" yOffset="2"/>
</Imageset>
@@ -0,0 +1,54 @@
<?xml version="1.0" ?>
<GUIScheme version="5" name="TaharezLook">
<Imageset filename="TaharezLook-0.8.imageset" />
<Font filename="bluehighway-8-0.8.font" />
<Font filename="bluehighway-10-0.8.font" />
<Font filename="bluehighway-12-0.8.font" />
<Font filename="bluehighway-24-0.8.font" />
<LookNFeel filename="TaharezLook-0.8.looknfeel" />
<WindowRendererSet filename="CEGUICoreWindowRendererSet" />
<FalagardMapping windowType="TaharezLook/Button" targetType="CEGUI/PushButton" renderer="Core/Button" lookNFeel="TaharezLook/Button" />
<FalagardMapping windowType="TaharezLook/Checkbox" targetType="CEGUI/Checkbox" renderer="Core/ToggleButton" lookNFeel="TaharezLook/Checkbox" />
<FalagardMapping windowType="TaharezLook/ImageButton" targetType="CEGUI/PushButton" renderer="Core/Button" lookNFeel="TaharezLook/ImageButton" />
<FalagardMapping windowType="TaharezLook/RadioButton" targetType="CEGUI/RadioButton" renderer="Core/ToggleButton" lookNFeel="TaharezLook/RadioButton" />
<FalagardMapping windowType="TaharezLook/FrameWindow" targetType="CEGUI/FrameWindow" renderer="Core/FrameWindow" lookNFeel="TaharezLook/FrameWindow" />
<FalagardMapping windowType="TaharezLook/Titlebar" targetType="CEGUI/Titlebar" renderer="Core/Titlebar" lookNFeel="TaharezLook/Titlebar" />
<FalagardMapping windowType="TaharezLook/SystemButton" targetType="CEGUI/PushButton" renderer="Core/Button" lookNFeel="TaharezLook/Button" />
<FalagardMapping windowType="TaharezLook/Editbox" targetType="CEGUI/Editbox" renderer="Core/Editbox" lookNFeel="TaharezLook/Editbox" />
<FalagardMapping windowType="TaharezLook/MultiLineEditbox" targetType="CEGUI/MultiLineEditbox" renderer="Core/MultiLineEditbox" lookNFeel="TaharezLook/MultiLineEditbox" />
<FalagardMapping windowType="TaharezLook/Menubar" targetType="CEGUI/Menubar" renderer="Core/Menubar" lookNFeel="TaharezLook/Menubar" />
<FalagardMapping windowType="TaharezLook/PopupMenu" targetType="CEGUI/PopupMenu" renderer="Core/PopupMenu" lookNFeel="TaharezLook/PopupMenu" />
<FalagardMapping windowType="TaharezLook/MenuItem" targetType="CEGUI/MenuItem" renderer="Core/MenuItem" lookNFeel="TaharezLook/MenuItem" />
<FalagardMapping windowType="TaharezLook/AlternateProgressBar" targetType="CEGUI/ProgressBar" renderer="Core/ProgressBar" lookNFeel="TaharezLook/AltProgressBar" />
<FalagardMapping windowType="TaharezLook/ProgressBar" targetType="CEGUI/ProgressBar" renderer="Core/ProgressBar" lookNFeel="TaharezLook/ProgressBar" />
<FalagardMapping windowType="TaharezLook/VUMeter" targetType="CEGUI/ProgressBar" renderer="Core/ProgressBar" lookNFeel="TaharezLook/VUMeter" />
<FalagardMapping windowType="TaharezLook/VerticalScrollbar" targetType="CEGUI/Scrollbar" renderer="Core/Scrollbar" lookNFeel="TaharezLook/VerticalScrollbar" />
<FalagardMapping windowType="TaharezLook/HorizontalScrollbar" targetType="CEGUI/Scrollbar" renderer="Core/Scrollbar" lookNFeel="TaharezLook/HorizontalScrollbar" />
<FalagardMapping windowType="TaharezLook/VerticalScrollbarThumb" targetType="CEGUI/Thumb" renderer="Core/Button" lookNFeel="TaharezLook/VerticalScrollbarThumb" />
<FalagardMapping windowType="TaharezLook/HorizontalScrollbarThumb" targetType="CEGUI/Thumb" renderer="Core/Button" lookNFeel="TaharezLook/HorizontalScrollbarThumb" />
<FalagardMapping windowType="TaharezLook/LargeVerticalScrollbar" targetType="CEGUI/Scrollbar" renderer="Core/Scrollbar" lookNFeel="TaharezLook/LargeVerticalScrollbar" />
<FalagardMapping windowType="TaharezLook/LargeVerticalScrollbarThumb" targetType="CEGUI/Thumb" renderer="Core/Button" lookNFeel="TaharezLook/LargeVerticalScrollbarThumb" />
<FalagardMapping windowType="TaharezLook/TabButton" targetType="CEGUI/TabButton" renderer="Core/TabButton" lookNFeel="TaharezLook/TabButton" />
<FalagardMapping windowType="TaharezLook/TabControl" targetType="CEGUI/TabControl" renderer="Core/TabControl" lookNFeel="TaharezLook/TabControl" />
<FalagardMapping windowType="TaharezLook/TabContentPane" targetType="DefaultWindow" renderer="Core/Default" lookNFeel="TaharezLook/TabContentPane" />
<FalagardMapping windowType="TaharezLook/TabButtonPane" targetType="DefaultWindow" renderer="Core/Default" lookNFeel="TaharezLook/TabButtonPane" />
<FalagardMapping windowType="TaharezLook/ComboDropList" targetType="CEGUI/ComboDropList" renderer="Core/Listbox" lookNFeel="TaharezLook/ComboDropList" />
<FalagardMapping windowType="TaharezLook/ComboEditbox" targetType="CEGUI/Editbox" renderer="Core/Editbox" lookNFeel="TaharezLook/ComboEditbox" />
<FalagardMapping windowType="TaharezLook/Combobox" targetType="CEGUI/Combobox" renderer="Core/Default" lookNFeel="TaharezLook/Combobox" />
<FalagardMapping windowType="TaharezLook/Listbox" targetType="CEGUI/Listbox" renderer="Core/Listbox" lookNFeel="TaharezLook/Listbox" />
<FalagardMapping windowType="TaharezLook/ListHeader" targetType="CEGUI/ListHeader" renderer="Core/ListHeader" lookNFeel="TaharezLook/ListHeader" />
<FalagardMapping windowType="TaharezLook/ListHeaderSegment" targetType="CEGUI/ListHeaderSegment" renderer="Core/ListHeaderSegment" lookNFeel="TaharezLook/ListHeaderSegment" />
<FalagardMapping windowType="TaharezLook/MultiColumnList" targetType="CEGUI/MultiColumnList" renderer="Core/MultiColumnList" lookNFeel="TaharezLook/MultiColumnList" />
<FalagardMapping windowType="TaharezLook/Slider" targetType="CEGUI/Slider" renderer="Core/Slider" lookNFeel="TaharezLook/Slider" />
<FalagardMapping windowType="TaharezLook/SliderThumb" targetType="CEGUI/Thumb" renderer="Core/Button" lookNFeel="TaharezLook/SliderThumb" />
<FalagardMapping windowType="TaharezLook/ScrollablePane" targetType="CEGUI/ScrollablePane" renderer="Core/ScrollablePane" lookNFeel="TaharezLook/ScrollablePane" />
<FalagardMapping windowType="TaharezLook/Spinner" targetType="CEGUI/Spinner" renderer="Core/Default" lookNFeel="TaharezLook/Spinner" />
<FalagardMapping windowType="TaharezLook/Tooltip" targetType="CEGUI/Tooltip" renderer="Core/Tooltip" lookNFeel="TaharezLook/Tooltip" />
<FalagardMapping windowType="TaharezLook/StaticImage" targetType="DefaultWindow" renderer="Core/StaticImage" lookNFeel="TaharezLook/StaticImage" />
<FalagardMapping windowType="TaharezLook/StaticText" targetType="DefaultWindow" renderer="Core/StaticText" lookNFeel="TaharezLook/StaticText" />
<FalagardMapping windowType="TaharezLook/ItemListbox" targetType="CEGUI/ItemListbox" renderer="Core/ItemListbox" lookNFeel="TaharezLook/ItemListbox" />
<FalagardMapping windowType="TaharezLook/ListboxItem" targetType="CEGUI/ItemEntry" renderer="Core/ItemEntry" lookNFeel="TaharezLook/ListboxItem" />
<FalagardMapping windowType="TaharezLook/GroupBox" targetType="CEGUI/GroupBox" renderer="Core/Default" lookNFeel="TaharezLook/GroupBox" />
<FalagardMapping windowType="TaharezLook/Tree" targetType="CEGUI/Tree" renderer="Core/Tree" lookNFeel="TaharezLook/Tree" />
</GUIScheme>
@@ -0,0 +1,53 @@
<?xml version="1.0" ?>
<GUIScheme Name="TaharezLook">
<Imageset Filename="TaharezLook.imageset" />
<Font Filename="bluehighway-8.font" />
<Font Filename="bluehighway-10.font" />
<Font Filename="bluehighway-12.font" />
<Font Filename="bluehighway-24.font" />
<LookNFeel Filename="TaharezLook.looknfeel" />
<WindowRendererSet Filename="CEGUIFalagardWRBase" />
<FalagardMapping WindowType="TaharezLook/Button" TargetType="CEGUI/PushButton" Renderer="Falagard/Button" LookNFeel="TaharezLook/Button" />
<FalagardMapping WindowType="TaharezLook/Checkbox" TargetType="CEGUI/Checkbox" Renderer="Falagard/ToggleButton" LookNFeel="TaharezLook/Checkbox" />
<FalagardMapping WindowType="TaharezLook/ImageButton" TargetType="CEGUI/PushButton" Renderer="Falagard/Button" LookNFeel="TaharezLook/ImageButton" />
<FalagardMapping WindowType="TaharezLook/RadioButton" TargetType="CEGUI/RadioButton" Renderer="Falagard/ToggleButton" LookNFeel="TaharezLook/RadioButton" />
<FalagardMapping WindowType="TaharezLook/FrameWindow" TargetType="CEGUI/FrameWindow" Renderer="Falagard/FrameWindow" LookNFeel="TaharezLook/FrameWindow" />
<FalagardMapping WindowType="TaharezLook/Titlebar" TargetType="CEGUI/Titlebar" Renderer="Falagard/Titlebar" LookNFeel="TaharezLook/Titlebar" />
<FalagardMapping WindowType="TaharezLook/SystemButton" TargetType="CEGUI/PushButton" Renderer="Falagard/Button" LookNFeel="TaharezLook/Button" />
<FalagardMapping WindowType="TaharezLook/Editbox" TargetType="CEGUI/Editbox" Renderer="Falagard/Editbox" LookNFeel="TaharezLook/Editbox" />
<FalagardMapping WindowType="TaharezLook/MultiLineEditbox" TargetType="CEGUI/MultiLineEditbox" Renderer="Falagard/MultiLineEditbox" LookNFeel="TaharezLook/MultiLineEditbox" />
<FalagardMapping WindowType="TaharezLook/Menubar" TargetType="CEGUI/Menubar" Renderer="Falagard/Menubar" LookNFeel="TaharezLook/Menubar" />
<FalagardMapping WindowType="TaharezLook/PopupMenu" TargetType="CEGUI/PopupMenu" Renderer="Falagard/PopupMenu" LookNFeel="TaharezLook/PopupMenu" />
<FalagardMapping WindowType="TaharezLook/MenuItem" TargetType="CEGUI/MenuItem" Renderer="Falagard/MenuItem" LookNFeel="TaharezLook/MenuItem" />
<FalagardMapping WindowType="TaharezLook/AlternateProgressBar" TargetType="CEGUI/ProgressBar" Renderer="Falagard/ProgressBar" LookNFeel="TaharezLook/AltProgressBar" />
<FalagardMapping WindowType="TaharezLook/ProgressBar" TargetType="CEGUI/ProgressBar" Renderer="Falagard/ProgressBar" LookNFeel="TaharezLook/ProgressBar" />
<FalagardMapping WindowType="TaharezLook/VUMeter" TargetType="CEGUI/ProgressBar" Renderer="Falagard/ProgressBar" LookNFeel="TaharezLook/VUMeter" />
<FalagardMapping WindowType="TaharezLook/VerticalScrollbar" TargetType="CEGUI/Scrollbar" Renderer="Falagard/Scrollbar" LookNFeel="TaharezLook/VerticalScrollbar" />
<FalagardMapping WindowType="TaharezLook/HorizontalScrollbar" TargetType="CEGUI/Scrollbar" Renderer="Falagard/Scrollbar" LookNFeel="TaharezLook/HorizontalScrollbar" />
<FalagardMapping WindowType="TaharezLook/VerticalScrollbarThumb" TargetType="CEGUI/Thumb" Renderer="Falagard/Button" LookNFeel="TaharezLook/VerticalScrollbarThumb" />
<FalagardMapping WindowType="TaharezLook/HorizontalScrollbarThumb" TargetType="CEGUI/Thumb" Renderer="Falagard/Button" LookNFeel="TaharezLook/HorizontalScrollbarThumb" />
<FalagardMapping WindowType="TaharezLook/LargeVerticalScrollbar" TargetType="CEGUI/Scrollbar" Renderer="Falagard/Scrollbar" LookNFeel="TaharezLook/LargeVerticalScrollbar" />
<FalagardMapping WindowType="TaharezLook/LargeVerticalScrollbarThumb" TargetType="CEGUI/Thumb" Renderer="Falagard/Button" LookNFeel="TaharezLook/LargeVerticalScrollbarThumb" />
<FalagardMapping WindowType="TaharezLook/TabButton" TargetType="CEGUI/TabButton" Renderer="Falagard/TabButton" LookNFeel="TaharezLook/TabButton" />
<FalagardMapping WindowType="TaharezLook/TabControl" TargetType="CEGUI/TabControl" Renderer="Falagard/TabControl" LookNFeel="TaharezLook/TabControl" />
<FalagardMapping WindowType="TaharezLook/TabContentPane" TargetType="DefaultWindow" Renderer="Falagard/Default" LookNFeel="TaharezLook/TabContentPane" />
<FalagardMapping WindowType="TaharezLook/TabButtonPane" TargetType="DefaultWindow" Renderer="Falagard/Default" LookNFeel="TaharezLook/TabButtonPane" />
<FalagardMapping WindowType="TaharezLook/ComboDropList" TargetType="CEGUI/ComboDropList" Renderer="Falagard/Listbox" LookNFeel="TaharezLook/ComboDropList" />
<FalagardMapping WindowType="TaharezLook/ComboEditbox" TargetType="CEGUI/Editbox" Renderer="Falagard/Editbox" LookNFeel="TaharezLook/ComboEditbox" />
<FalagardMapping WindowType="TaharezLook/Combobox" TargetType="CEGUI/Combobox" Renderer="Falagard/Default" LookNFeel="TaharezLook/Combobox" />
<FalagardMapping WindowType="TaharezLook/Listbox" TargetType="CEGUI/Listbox" Renderer="Falagard/Listbox" LookNFeel="TaharezLook/Listbox" />
<FalagardMapping WindowType="TaharezLook/ListHeader" TargetType="CEGUI/ListHeader" Renderer="Falagard/ListHeader" LookNFeel="TaharezLook/ListHeader" />
<FalagardMapping WindowType="TaharezLook/ListHeaderSegment" TargetType="CEGUI/ListHeaderSegment" Renderer="Falagard/ListHeaderSegment" LookNFeel="TaharezLook/ListHeaderSegment" />
<FalagardMapping WindowType="TaharezLook/MultiColumnList" TargetType="CEGUI/MultiColumnList" Renderer="Falagard/MultiColumnList" LookNFeel="TaharezLook/MultiColumnList" />
<FalagardMapping WindowType="TaharezLook/Slider" TargetType="CEGUI/Slider" Renderer="Falagard/Slider" LookNFeel="TaharezLook/Slider" />
<FalagardMapping WindowType="TaharezLook/SliderThumb" TargetType="CEGUI/Thumb" Renderer="Falagard/Button" LookNFeel="TaharezLook/SliderThumb" />
<FalagardMapping WindowType="TaharezLook/ScrollablePane" TargetType="CEGUI/ScrollablePane" Renderer="Falagard/ScrollablePane" LookNFeel="TaharezLook/ScrollablePane" />
<FalagardMapping WindowType="TaharezLook/Spinner" TargetType="CEGUI/Spinner" Renderer="Falagard/Default" LookNFeel="TaharezLook/Spinner" />
<FalagardMapping WindowType="TaharezLook/Tooltip" TargetType="CEGUI/Tooltip" Renderer="Falagard/Tooltip" LookNFeel="TaharezLook/Tooltip" />
<FalagardMapping WindowType="TaharezLook/StaticImage" TargetType="DefaultWindow" Renderer="Falagard/StaticImage" LookNFeel="TaharezLook/StaticImage" />
<FalagardMapping WindowType="TaharezLook/StaticText" TargetType="DefaultWindow" Renderer="Falagard/StaticText" LookNFeel="TaharezLook/StaticText" />
<FalagardMapping WindowType="TaharezLook/ItemListbox" TargetType="CEGUI/ItemListbox" Renderer="Falagard/ItemListbox" LookNFeel="TaharezLook/ItemListbox" />
<FalagardMapping WindowType="TaharezLook/ListboxItem" TargetType="CEGUI/ItemEntry" Renderer="Falagard/ItemEntry" LookNFeel="TaharezLook/ListboxItem" />
<FalagardMapping WindowType="TaharezLook/GroupBox" TargetType="CEGUI/GroupBox" Renderer="Falagard/Default" LookNFeel="TaharezLook/GroupBox" />
<FalagardMapping WindowType="TaharezLook/Tree" TargetType="CEGUI/Tree" Renderer="Falagard/Tree" LookNFeel="TaharezLook/Tree" />
</GUIScheme>
@@ -0,0 +1,245 @@
<?xml version="1.0" ?>
<Imageset Name="TaharezLook" Imagefile="TaharezLook.tga" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true">
<Image Name="ClientBrush" XPos="2" YPos="2" Width="64" Height="64" />
<Image Name="GenericBrush" XPos="9" YPos="71" Width="1" Height="1" />
<Image Name="WindowLeftEdge" XPos="6" YPos="95" Width="1" Height="22" XOffset="4" />
<Image Name="WindowRightEdge" XPos="34" YPos="95" Width="1" Height="22" XOffset="-5" />
<Image Name="WindowTopEdge" XPos="9" YPos="68" Width="23" Height="1" />
<Image Name="WindowBottomEdge" XPos="9" YPos="143" Width="23" Height="1" />
<Image Name="WindowTopLeft" XPos="2" YPos="68" Width="5" Height="24" />
<Image Name="WindowTopRight" XPos="34" YPos="68" Width="5" Height="24" />
<Image Name="WindowBottomLeft" XPos="2" YPos="120" Width="5" Height="24" />
<Image Name="WindowBottomRight" XPos="34" YPos="120" Width="5" Height="24" />
<Image Name="ButtonLeftNormal" XPos="68" YPos="20" Width="12" Height="16" />
<Image Name="ButtonMiddleNormal" XPos="82" YPos="20" Width="12" Height="16" />
<Image Name="ButtonRightNormal" XPos="96" YPos="20" Width="12" Height="16" />
<Image Name="ButtonLeftPushed" XPos="68" YPos="38" Width="12" Height="16" />
<Image Name="ButtonMiddlePushed" XPos="82" YPos="38" Width="12" Height="16" />
<Image Name="ButtonRightPushed" XPos="96" YPos="38" Width="12" Height="16" />
<Image Name="ButtonLeftHighlight" XPos="68" YPos="56" Width="12" Height="16" />
<Image Name="ButtonMiddleHighlight" XPos="82" YPos="56" Width="12" Height="16" />
<Image Name="ButtonRightHighlight" XPos="96" YPos="56" Width="12" Height="16" />
<Image Name="CheckboxNormal" XPos="110" YPos="2" Width="12" Height="12" />
<Image Name="CheckboxHover" XPos="110" YPos="30" Width="12" Height="12" />
<Image Name="CheckboxMark" XPos="110" YPos="16" Width="12" Height="12" />
<Image Name="RadioButtonNormal" XPos="124" YPos="2" Width="12" Height="12" />
<Image Name="RadioButtonHover" XPos="124" YPos="30" Width="12" Height="12" />
<Image Name="RadioButtonMark" XPos="124" YPos="16" Width="12" Height="12" />
<Image Name="TitlebarLeft" XPos="68" YPos="2" Width="8" Height="16" />
<Image Name="TitlebarMiddle" XPos="78" YPos="2" Width="8" Height="16" />
<Image Name="TitlebarRight" XPos="88" YPos="2" Width="8" Height="16" />
<Image Name="NewTitlebarLeft" XPos="61" YPos="127" Width="13" Height="16" />
<Image Name="NewTitlebarMiddle" XPos="77" YPos="127" Width="12" Height="16" />
<Image Name="NewTitlebarRight" XPos="92" YPos="127" Width="12" Height="16" />
<Image Name="SysAreaMiddle" XPos="107" YPos="127" Width="12" Height="16" />
<Image Name="SysAreaRight" XPos="122" YPos="127" Width="13" Height="16" />
<Image Name="StaticLeft" XPos="41" YPos="89" Width="6" Height="6" />
<Image Name="StaticRight" XPos="63" YPos="89" Width="6" Height="6" />
<Image Name="StaticTop" XPos="52" YPos="78" Width="6" Height="6" />
<Image Name="StaticBottom" XPos="52" YPos="100" Width="6" Height="6" />
<Image Name="StaticTopLeft" XPos="41" YPos="78" Width="6" Height="6" />
<Image Name="StaticTopRight" XPos="63" YPos="78" Width="6" Height="6" />
<Image Name="StaticBottomLeft" XPos="41" YPos="100" Width="6" Height="6" />
<Image Name="StaticBottomRight" XPos="63" YPos="100" Width="6" Height="6" />
<Image Name="StaticBackdrop" XPos="52" YPos="89" Width="6" Height="6" />
<Image Name="ProgressBarLeft" XPos="71" YPos="74" Width="7" Height="12" />
<Image Name="ProgressBarMiddle" XPos="80" YPos="74" Width="6" Height="12" />
<Image Name="ProgressBarRight" XPos="88" YPos="74" Width="6" Height="12" />
<Image Name="ProgressBarDimSegment" XPos="96" YPos="74" Width="8" Height="12" />
<Image Name="ProgressBarLitSegment" XPos="106" YPos="74" Width="8" Height="12" />
<Image Name="EditBoxLeft" XPos="41" YPos="108" Width="4" Height="18" />
<Image Name="EditBoxMiddle" XPos="47" YPos="108" Width="4" Height="18" />
<Image Name="EditBoxRight" XPos="53" YPos="108" Width="4" Height="18" />
<Image Name="EditBoxCarat" XPos="60" YPos="108" Width="4" Height="18" />
<Image Name="SpinnerUpNormal" XPos="68" YPos="110" Width="10" Height="6" />
<Image Name="SpinnerDownNormal" XPos="68" YPos="118" Width="10" Height="6" />
<Image Name="SpinnerUpHover" XPos="82" YPos="110" Width="10" Height="6" />
<Image Name="SpinnerDownHover" XPos="82" YPos="118" Width="10" Height="6" />
<Image Name="TextSelectionBrush" XPos="8" YPos="70" Width="16" Height="16" />
<Image Name="VertScrollTop" XPos="182" YPos="2" Width="20" Height="8" />
<Image Name="VertScrollMiddle" XPos="182" YPos="12" Width="20" Height="8" />
<Image Name="VertScrollBottom" XPos="182" YPos="22" Width="20" Height="8" />
<Image Name="VertScrollBarSegment" XPos="206" YPos="2" Width="4" Height="10" />
<Image Name="VertScrollThumbNormal" XPos="214" YPos="2" Width="8" Height="24" />
<Image Name="VertScrollThumbHover" XPos="224" YPos="2" Width="8" Height="24" />
<Image Name="VertScrollUpNormal" XPos="196" YPos="32" Width="12" Height="12" />
<Image Name="VertScrollDownNormal" XPos="182" YPos="32" Width="12" Height="12" />
<Image Name="VertScrollUpHover" XPos="196" YPos="46" Width="12" Height="12" />
<Image Name="VertScrollDownHover" XPos="182" YPos="46" Width="12" Height="12" />
<Image Name="MiniVertScrollBarSegment" XPos="207" YPos="60" Width="4" Height="10" />
<Image Name="MiniVertScrollThumbNormal" XPos="214" YPos="59" Width="7" Height="22" />
<Image Name="MiniVertScrollThumbTopNormal" XPos="214" YPos="59" Width="7" Height="5" />
<Image Name="MiniVertScrollThumbMiddleNormal" XPos="214" YPos="65" Width="7" Height="5" />
<Image Name="MiniVertScrollThumbBottomNormal" XPos="214" YPos="76" Width="7" Height="5" />
<Image Name="MiniVertScrollThumbTopHover" XPos="223" YPos="59" Width="7" Height="5" />
<Image Name="MiniVertScrollThumbMiddleHover" XPos="223" YPos="65" Width="7" Height="5" />
<Image Name="MiniVertScrollThumbBottomHover" XPos="223" YPos="76" Width="7" Height="5" />
<Image Name="MiniVertScrollThumbHover" XPos="223" YPos="59" Width="7" Height="22" />
<Image Name="MiniVertScrollUpNormal" XPos="194" YPos="60" Width="10" Height="9" />
<Image Name="MiniVertScrollDownNormal" XPos="182" YPos="59" Width="10" Height="9" />
<Image Name="MiniVertScrollUpHover" XPos="194" YPos="70" Width="10" Height="9" />
<Image Name="MiniVertScrollDownHover" XPos="182" YPos="69" Width="10" Height="9" />
<Image Name="VertSliderBody" XPos="234" YPos="2" Width="9" Height="48" />
<Image Name="VertSliderThumbNormal" XPos="217" YPos="28" Width="15" Height="6" />
<Image Name="VertSliderThumbHover" XPos="217" YPos="36" Width="15" Height="6" />
<Image Name="MiniHorzScrollBarSegment" XPos="244" YPos="80" Width="10" Height="4" />
<Image Name="MiniHorzScrollThumbNormal" XPos="233" YPos="87" Width="22" Height="7" />
<Image Name="MiniHorzScrollThumbLeftNormal" XPos="233" YPos="87" Width="5" Height="7" />
<Image Name="MiniHorzScrollThumbMiddleNormal" XPos="239" YPos="87" Width="5" Height="7" />
<Image Name="MiniHorzScrollThumbRightNormal" XPos="250" YPos="87" Width="5" Height="7" />
<Image Name="MiniHorzScrollThumbHover" XPos="233" YPos="96" Width="22" Height="7" />
<Image Name="MiniHorzScrollThumbLeftHover" XPos="233" YPos="96" Width="5" Height="7" />
<Image Name="MiniHorzScrollThumbMiddleHover" XPos="239" YPos="96" Width="5" Height="7" />
<Image Name="MiniHorzScrollThumbRightHover" XPos="250" YPos="96" Width="5" Height="7" />
<Image Name="MiniHorzScrollLeftNormal" XPos="246" YPos="55" Width="9" Height="10" />
<Image Name="MiniHorzScrollRightNormal" XPos="245" YPos="67" Width="9" Height="10" />
<Image Name="MiniHorzScrollLeftHover" XPos="236" YPos="55" Width="9" Height="10" />
<Image Name="MiniHorzScrollRightHover" XPos="235" YPos="67" Width="9" Height="10" />
<Image Name="ListboxLeft" XPos="41" YPos="89" Width="7" Height="6" />
<Image Name="ListboxRight" XPos="62" YPos="89" Width="7" Height="6" />
<Image Name="ListboxTop" XPos="52" YPos="78" Width="6" Height="7" />
<Image Name="ListboxBottom" XPos="52" YPos="99" Width="6" Height="7" />
<Image Name="ListboxTopLeft" XPos="41" YPos="78" Width="7" Height="7" />
<Image Name="ListboxTopRight" XPos="62" YPos="78" Width="7" Height="7" />
<Image Name="ListboxBottomLeft" XPos="41" YPos="99" Width="7" Height="7" />
<Image Name="ListboxBottomRight" XPos="62" YPos="99" Width="7" Height="7" />
<Image Name="ListboxBackdrop" XPos="52" YPos="89" Width="6" Height="6" />
<Image Name="ListboxSelectionBrush" XPos="8" YPos="70" Width="16" Height="16" />
<Image Name="ComboboxEditLeft" XPos="138" YPos="2" Width="8" Height="16" />
<Image Name="ComboboxEditMiddle" XPos="148" YPos="2" Width="8" Height="16" />
<Image Name="ComboboxListButtonNormal" XPos="158" YPos="2" Width="16" Height="16" />
<Image Name="ComboboxListButtonHover" XPos="158" YPos="20" Width="16" Height="16" />
<Image Name="ComboboxListLeft" XPos="138" YPos="48" Width="8" Height="8" />
<Image Name="ComboboxListRight" XPos="158" YPos="48" Width="8" Height="8" />
<Image Name="ComboboxListTop" XPos="148" YPos="48" Width="8" Height="8" />
<Image Name="ComboboxListBottom" XPos="148" YPos="58" Width="8" Height="8" />
<Image Name="ComboboxListTopLeft" XPos="138" YPos="38" Width="8" Height="8" />
<Image Name="ComboboxListTopRight" XPos="158" YPos="38" Width="8" Height="8" />
<Image Name="ComboboxListBottomLeft" XPos="138" YPos="58" Width="8" Height="8" />
<Image Name="ComboboxListBottomRight" XPos="158" YPos="58" Width="8" Height="8" />
<Image Name="ComboboxListBackdrop" XPos="148" YPos="48" Width="8" Height="8" />
<Image Name="ComboboxSelectionBrush" XPos="8" YPos="70" Width="16" Height="16" />
<Image Name="ComboboxDividerLeft" XPos="138" YPos="68" Width="14" Height="1" />
<Image Name="ComboboxDividerMiddle" XPos="154" YPos="68" Width="8" Height="1" />
<Image Name="ComboboxDividerRight" XPos="164" YPos="68" Width="14" Height="1" />
<Image Name="HeaderBarBackdropNormal" XPos="230" YPos="163" Width="10" Height="12" />
<Image Name="HeaderBarBackdropHover" XPos="230" YPos="163" Width="10" Height="12" />
<Image Name="HeaderBarSplitterNormal" XPos="225" YPos="92" Width="3" Height="16" />
<Image Name="HeaderBarSplitterHover" XPos="200" YPos="92" Width="3" Height="16" />
<Image Name="HeaderBarSortUp" XPos="233" YPos="178" Width="8" Height="8" />
<Image Name="HeaderBarSortDown" XPos="244" YPos="178" Width="8" Height="8" />
<Image Name="MultiListLeft" XPos="170" YPos="92" Width="7" Height="6" />
<Image Name="MultiListRight" XPos="191" YPos="92" Width="7" Height="6" />
<Image Name="MultiListTop" XPos="181" YPos="81" Width="6" Height="7" />
<Image Name="MultiListBottom" XPos="181" YPos="102" Width="6" Height="7" />
<Image Name="MultiListTopLeft" XPos="170" YPos="81" Width="7" Height="7" />
<Image Name="MultiListTopRight" XPos="191" YPos="81" Width="7" Height="7" />
<Image Name="MultiListBottomLeft" XPos="170" YPos="102" Width="7" Height="7" />
<Image Name="MultiListBottomRight" XPos="191" YPos="102" Width="7" Height="7" />
<Image Name="MultiListBackdrop" XPos="181" YPos="92" Width="6" Height="6" />
<Image Name="MultiListSelectionBrush" XPos="9" YPos="71" Width="14" Height="14" />
<Image Name="AltProgressLeft" XPos="71" YPos="88" Width="8" Height="12" />
<Image Name="AltProgressMiddle" XPos="81" YPos="88" Width="8" Height="12" />
<Image Name="AltProgressRight" XPos="91" YPos="88" Width="8" Height="12" />
<Image Name="AltProgressQuarter" XPos="102" YPos="89" Width="3" Height="4" />
<Image Name="AltProgressHalf" XPos="109" YPos="89" Width="4" Height="5" />
<Image Name="AltProgressLight1" XPos="100" YPos="97" Width="4" Height="8" />
<Image Name="AltProgressLight2" XPos="106" YPos="97" Width="4" Height="8" />
<Image Name="AltProgressLight3" XPos="112" YPos="97" Width="4" Height="8" />
<Image Name="AltProgressLight4" XPos="118" YPos="97" Width="4" Height="8" />
<Image Name="AltProgressLight5" XPos="124" YPos="97" Width="4" Height="8" />
<Image Name="AltProgressLight6" XPos="130" YPos="97" Width="4" Height="8" />
<Image Name="AltProgressLight7" XPos="136" YPos="97" Width="4" Height="8" />
<Image Name="AltProgressLight8" XPos="142" YPos="97" Width="4" Height="8" />
<Image Name="AltProgressLight9" XPos="148" YPos="97" Width="4" Height="8" />
<Image Name="AltProgressLight10" XPos="154" YPos="97" Width="4" Height="8" />
<Image Name="CloseButtonNormal" XPos="41" YPos="128" Width="16" Height="16" />
<Image Name="CloseButtonHover" XPos="41" YPos="146" Width="16" Height="16" />
<Image Name="CloseButtonPressed" XPos="41" YPos="164" Width="16" Height="16" />
<Image Name="NewCloseButtonNormal" XPos="90" YPos="146" Width="10" Height="10" />
<Image Name="NewCloseButtonHover" XPos="90" YPos="146" Width="10" Height="10" />
<Image Name="NewCloseButtonPressed" XPos="90" YPos="146" Width="10" Height="10" />
<Image Name="MultiLineEditboxLeft" XPos="41" YPos="89" Width="6" Height="6" />
<Image Name="MultiLineEditboxRight" XPos="63" YPos="89" Width="6" Height="6" />
<Image Name="MultiLineEditboxTop" XPos="52" YPos="78" Width="6" Height="6" />
<Image Name="MultiLineEditboxBottom" XPos="52" YPos="100" Width="6" Height="6" />
<Image Name="MultiLineEditboxTopLeft" XPos="41" YPos="78" Width="6" Height="6" />
<Image Name="MultiLineEditboxTopRight" XPos="63" YPos="78" Width="6" Height="6" />
<Image Name="MultiLineEditboxBottomLeft" XPos="41" YPos="100" Width="6" Height="6" />
<Image Name="MultiLineEditboxBottomRight" XPos="63" YPos="100" Width="6" Height="6" />
<Image Name="MultiLineEditboxBackdrop" XPos="52" YPos="89" Width="6" Height="6" />
<Image Name="MultiLineEditboxSelectionBrush" XPos="9" YPos="71" Width="14" Height="14" />
<Image Name="MouseTarget" XPos="182" YPos="127" Width="17" Height="17" XOffset="-8" YOffset="-8" />
<Image Name="MouseArrow" XPos="138" YPos="127" Width="31" Height="25" XOffset="0" YOffset="0" />
<Image Name="MouseMoveCursor" XPos="201" YPos="127" Width="18" Height="18" XOffset="-8" YOffset="-8" />
<Image Name="MouseNoSoCursor" XPos="221" YPos="127" Width="8" Height="18" XOffset="-3" YOffset="-8" />
<Image Name="MouseEsWeCursor" XPos="182" YPos="150" Width="18" Height="8" XOffset="-8" YOffset="-3" />
<Image Name="MouseNeSwCursor" XPos="201" YPos="147" Width="14" Height="14" XOffset="-7" YOffset="-7" />
<Image Name="MouseNwSeCursor" XPos="230" YPos="126" Width="14" Height="14" XOffset="-7" YOffset="-7" />
<Image Name="MouseTextBar" XPos="173" YPos="127" Width="7" Height="18" XOffset="-2" YOffset="-9" />
<Image Name="TabHorizontalFiller" XPos="197" YPos="201" Width="7" Height="1" />
<Image Name="TabContentPaneUpperLeft" XPos="41" YPos="78" Width="7" Height="7" />
<Image Name="TabContentPaneUpper" XPos="52" YPos="78" Width="6" Height="7" />
<Image Name="TabContentPaneUpperRight" XPos="62" YPos="78" Width="7" Height="7" />
<Image Name="TabContentPaneLeft" XPos="41" YPos="89" Width="7" Height="6" />
<Image Name="TabContentPaneRight" XPos="62" YPos="89" Width="7" Height="6" />
<Image Name="TabContentPaneLower" XPos="52" YPos="99" Width="6" Height="7" />
<Image Name="TabContentPaneLowerLeft" XPos="41" YPos="99" Width="7" Height="7" />
<Image Name="TabContentPaneLowerRight" XPos="62" YPos="99" Width="7" Height="7" />
<Image Name="TabContentPaneMiddle" XPos="52" YPos="89" Width="6" Height="6" />
<Image Name="TabButtonScrollLeftNormal" XPos="97" YPos="108" Width="16" Height="17" />
<Image Name="TabButtonScrollRightNormal" XPos="112" YPos="108" Width="16" Height="17" />
<Image Name="TabButtonScrollLeftHover" XPos="127" YPos="108" Width="16" Height="17" />
<Image Name="TabButtonScrollRightHover" XPos="142" YPos="108" Width="16" Height="17" />
<Image Name="TabButtonLeftNormal" XPos="41" YPos="89" Width="7" Height="6" />
<Image Name="TabButtonRightNormal" XPos="62" YPos="89" Width="7" Height="6" />
<Image Name="TabButtonUpperNormal" XPos="52" YPos="78" Width="6" Height="7" />
<Image Name="TabButtonLowerNormal" XPos="52" YPos="99" Width="6" Height="7" />
<Image Name="TabButtonUpperLeftNormal" XPos="41" YPos="78" Width="7" Height="7" />
<Image Name="TabButtonUpperLeft2Normal" XPos="186" YPos="164" Width="7" Height="7" />
<Image Name="TabButtonUpperRightNormal" XPos="62" YPos="78" Width="7" Height="7" />
<Image Name="TabButtonLowerLeftNormal" XPos="41" YPos="99" Width="7" Height="7" />
<Image Name="TabButtonLowerRightNormal" XPos="62" YPos="99" Width="7" Height="7" />
<Image Name="TabButtonLowerRight2Normal" XPos="187" YPos="195" Width="7" Height="7" />
<Image Name="TabButtonMiddleNormal" XPos="52" YPos="89" Width="6" Height="6" />
<Image Name="TabButtonLeftSelected" XPos="41" YPos="89" Width="7" Height="6" />
<Image Name="TabButtonRightSelected" XPos="62" YPos="89" Width="7" Height="6" />
<Image Name="TabButtonUpperSelected" XPos="52" YPos="78" Width="6" Height="7" />
<Image Name="TabButtonLowerSelected" XPos="52" YPos="89" Width="6" Height="6" />
<Image Name="TabButtonUpperLeftSelected" XPos="41" YPos="78" Width="7" Height="7" />
<Image Name="TabButtonUpperRightSelected" XPos="62" YPos="78" Width="7" Height="7" />
<Image Name="TabButtonLowerLeftSelected" XPos="41" YPos="99" Width="7" Height="7" />
<Image Name="TabButtonLowerRightSelected" XPos="62" YPos="99" Width="7" Height="7" />
<Image Name="TabButtonMiddleSelected" XPos="52" YPos="89" Width="6" Height="6" />
<Image Name="TooltipTopLeft" XPos="61" YPos="160" Width="4" Height="4" />
<Image Name="TooltipTopRight" XPos="85" YPos="160" Width="5" Height="4" />
<Image Name="TooltipBottomLeft" XPos="61" YPos="184" Width="4" Height="5" />
<Image Name="TooltipBottomRight" XPos="85" YPos="184" Width="5" Height="5" />
<Image Name="TooltipLeftEdge" XPos="61" YPos="171" Width="4" Height="6" />
<Image Name="TooltipRightEdge" XPos="85" YPos="171" Width="5" Height="6" />
<Image Name="TooltipTopEdge" XPos="72" YPos="160" Width="6" Height="4" />
<Image Name="TooltipBottomEdge" XPos="72" YPos="184" Width="6" Height="5" />
<Image Name="TooltipMiddle" XPos="72" YPos="171" Width="6" Height="6" />
<Image Name="MenuTopLeft" XPos="166" YPos="204" Width="2" Height="2" />
<Image Name="MenuTopRight" XPos="175" YPos="204" Width="3" Height="2" />
<Image Name="MenuBottomLeft" XPos="166" YPos="213" Width="2" Height="3" />
<Image Name="MenuBottomRight" XPos="175" YPos="213" Width="3" Height="3" />
<Image Name="MenuLeft" XPos="166" YPos="209" Width="2" Height="1" />
<Image Name="MenuRight" XPos="175" YPos="209" Width="3" Height="1" />
<Image Name="MenuTop" XPos="171" YPos="204" Width="1" Height="2" />
<Image Name="MenuBottom" XPos="171" YPos="213" Width="1" Height="3" />
<Image Name="MenuMiddle" XPos="171" YPos="209" Width="1" Height="1" />
<Image Name="PopupMenuFrameTopLeft" XPos="186" YPos="204" Width="2" Height="2" />
<Image Name="PopupMenuFrameTopRight" XPos="195" YPos="204" Width="4" Height="2" />
<Image Name="PopupMenuFrameBottomLeft" XPos="186" YPos="213" Width="2" Height="4" />
<Image Name="PopupMenuFrameBottomRight" XPos="195" YPos="213" Width="4" Height="4" />
<Image Name="PopupMenuFrameLeft" XPos="186" YPos="209" Width="2" Height="1" />
<Image Name="PopupMenuFrameRight" XPos="195" YPos="209" Width="4" Height="1" />
<Image Name="PopupMenuFrameTop" XPos="191" YPos="204" Width="1" Height="2" />
<Image Name="PopupMenuFrameBottom" XPos="191" YPos="213" Width="1" Height="4" />
<Image Name="PopupMenuMiddle" XPos="191" YPos="209" Width="1" Height="1" />
<Image Name="PopupMenuArrowRight" XPos="179" YPos="204" Width="5" Height="5" />
<Image Name="PopupMenuArrowLeft" XPos="179" YPos="210" Width="5" Height="5" />
<Image Name="TreeListClosed" XPos="175" YPos="111" Width="7" Height="11" XOffset="8" YOffset="2" />
<Image Name="TreeListOpened" XPos="164" YPos="111" Width="11" Height="7" XOffset="8" YOffset="2"/>
</Imageset>
Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

@@ -0,0 +1,2 @@
<?xml version="1.0" ?>
<Font version="3" name="BlueHighway-10" filename="bluehigh.ttf" type="FreeType" size="10" nativeHorzRes="1024" nativeVertRes="768" autoScaled="false" antiAlias="true" />
@@ -0,0 +1,2 @@
<?xml version="1.0" ?>
<Font Name="BlueHighway-10" Filename="bluehigh.ttf" Type="FreeType" Size="10" NativeHorzRes="1024" NativeVertRes="768" AutoScaled="false" AntiAlias="true" />
@@ -0,0 +1,2 @@
<?xml version="1.0" ?>
<Font version="3" name="BlueHighway-12" filename="bluehigh.ttf" type="FreeType" size="12" nativeHorzRes="800" nativeVertRes="600" autoScaled="true"/>
@@ -0,0 +1,2 @@
<?xml version="1.0" ?>
<Font Name="BlueHighway-12" Filename="bluehigh.ttf" Type="FreeType" Size="12" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true"/>
@@ -0,0 +1,2 @@
<?xml version="1.0" ?>
<Font version="3" name="BlueHighway-24" filename="bluehigh.ttf" type="FreeType" size="24" nativeHorzRes="800" nativeVertRes="600" autoScaled="true"/>
@@ -0,0 +1,2 @@
<?xml version="1.0" ?>
<Font Name="BlueHighway-24" Filename="bluehigh.ttf" Type="FreeType" Size="24" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true"/>
@@ -0,0 +1,2 @@
<?xml version="1.0" ?>
<Font version="3" name="BlueHighway-8" filename="bluehigh.ttf" type="FreeType" size="8" nativeHorzRes="1024" nativeVertRes="768" autoScaled="true" antiAlias="true" />
@@ -0,0 +1,2 @@
<?xml version="1.0" ?>
<Font Name="BlueHighway-8" Filename="bluehigh.ttf" Type="FreeType" Size="8" NativeHorzRes="1024" NativeVertRes="768" AutoScaled="true" AntiAlias="true" />
@@ -0,0 +1 @@
SSVEP_ApplicationType = shooter
@@ -0,0 +1,17 @@
SSVEP_ApplicationType = trainer
SSVEP_TargetCount = 4
SSVEP_TargetWidth = 0.3
SSVEP_TargetHeight = 0.3
SSVEP_Target_X_0 = 0.0
SSVEP_Target_Y_0 = 0.0
SSVEP_Target_X_1 = 0.0
SSVEP_Target_Y_1 = 0.5
SSVEP_Target_X_2 = -0.4
SSVEP_Target_Y_2 = 0.0
SSVEP_Target_X_3 = 0.4
SSVEP_Target_Y_3 = 0.0
@@ -0,0 +1,32 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepCCommandShipControl.h"
#include "ovassvepCShooterApplication.h"
namespace OpenViBE {
namespace SSVEP {
CCommandShipControl::CCommandShipControl(CShooterApplication* application) : ICommandVRPNButton(application, "SSVEP_VRPN_ShipControl") {}
void CCommandShipControl::execute(const int button, const int /*state*/)
{
CShooterApplication* shooterApplication = dynamic_cast<CShooterApplication*>(m_application);
switch (button)
{
case 0:
shooterApplication->getShip()->shoot();
break;
case 1:
shooterApplication->getShip()->rotate(-6);
break;
case 2:
shooterApplication->getShip()->rotate(6);
break;
default: break;
}
}
} // namespace SSVEP
} // namespace OpenViBE
#endif
@@ -0,0 +1,18 @@
#pragma once
#include "../ovassvepICommandVRPNButton.h"
namespace OpenViBE {
namespace SSVEP {
class CShooterApplication;
class CCommandShipControl final : public ICommandVRPNButton
{
public:
explicit CCommandShipControl(CShooterApplication* application);
~CCommandShipControl() override {}
void execute(const int button, const int state) override;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,44 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepCCommandTargetControl.h"
#include "ovassvepCShooterApplication.h"
namespace OpenViBE {
namespace SSVEP {
CCommandTargetControl::CCommandTargetControl(CShooterApplication* application)
: ICommandVRPNButton(application, "SSVEP_VRPN_ShooterTarget")
{
m_vrpnServer = CVRPNServer::getInstance(application);
m_vrpnServer->addButton("SSVEP_VRPN_TargetRequest", 1);
}
void CCommandTargetControl::processFrame()
{
CShooterApplication* application = dynamic_cast<CShooterApplication*>(m_application);
ICommandVRPNButton::processFrame();
if (application->m_TargetRequest)
{
m_application->getLogManager() << Kernel::LogLevel_Info << "Requesting target\n";
m_vrpnServer->changeButtonState("SSVEP_VRPN_TargetRequest", 0, 1);
application->m_TargetRequest = false;
}
else { m_vrpnServer->changeButtonState("SSVEP_VRPN_TargetRequest", 0, 0); }
m_vrpnServer->processFrame();
}
void CCommandTargetControl::execute(const int button, const int state)
{
if (state == 1)
{
m_application->getLogManager() << Kernel::LogLevel_Info << "Target created at position " << button << "\n";
dynamic_cast<CShooterApplication*>(m_application)->addTarget(button);
}
}
} // namespace SSVEP
} // namespace OpenViBE
#endif
@@ -0,0 +1,23 @@
#pragma once
#include "../ovassvepICommandVRPNButton.h"
#include "../ovassvepCVRPNServer.h"
namespace OpenViBE {
namespace SSVEP {
class CShooterApplication;
class CCommandTargetControl final : public ICommandVRPNButton
{
public:
explicit CCommandTargetControl(CShooterApplication* application);
~CCommandTargetControl() override {}
void execute(const int button, const int state) override;
void processFrame() override;
private:
CVRPNServer* m_vrpnServer = nullptr;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,114 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepCShooterApplication.h"
#include "../ovassvepCCommandStartStop.h"
#include "../ovassvepCCommandStimulatorControl.h"
#include "ovassvepCCommandTargetControl.h"
#include "ovassvepCCommandShipControl.h"
namespace OpenViBE {
namespace SSVEP {
#if !((CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8))
namespace CEGUI
{
typedef CEGUI::UVector2 USize;
};
#endif
CShooterApplication::~CShooterApplication()
{
(*m_logManager) << Kernel::LogLevel_Debug << "- m_ship\n";
delete m_ship;
}
bool CShooterApplication::setup(Kernel::IKernelContext* kernelCtx)
{
if (!CApplication::setup(kernelCtx))
{
// If setup failed, logmanager may be in an unusable state, use cout
std::cout << "Error: Base application setup failed\n";
return false;
}
// Create the StarShip object
(*m_logManager) << Kernel::LogLevel_Debug << "+ m_ship = new CStarShip(...)\n";
m_ship = new CStarShip(this, m_sceneNode, 0.3F, &m_oFrequencies);
// Initialize the Target class
CShooterTarget::initialize(m_painter, m_sceneNode);
// draw the initial text
m_instructionsReady = m_guiManager->createWindow("TaharezLook/StaticImage", "InstructionsReady");
m_instructionsReady->setPosition(CEGUI::UVector2(cegui_reldim(0.0F), cegui_reldim(0.0F)));
m_instructionsReady->setSize(CEGUI::USize(CEGUI::UDim(0.0F, 640.F), CEGUI::UDim(0.0F, 32.F)));
#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8)
m_sheet->addChild(m_instructionsReady);
CEGUI::ImageManager::getSingleton().addFromImageFile("InstructionsReady", "InstructionText-Start.png");
m_instructionsReady->setProperty("Image", "InstructionsReady");
#else
m_sheet->addChildWindow(m_instructionsReady);
CEGUI::ImagesetManager::getSingleton().createFromImageFile("InstructionsReady", "InstructionText-Start.png");
m_instructionsReady->setProperty("Image", "set:InstructionsReady image:full_image");
#endif
m_instructionsReady->setProperty("FrameEnabled", "False");
m_instructionsReady->setProperty("BackgroundEnabled", "False");
m_instructionsReady->setVisible(true);
// Create commands
(*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandStartStop(...)\n";
this->addCommand(new CCommandStartStop(this));
(*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandStimulatorControl(...))\n";
this->addCommand(new CCommandStimulatorControl(this));
(*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandTargetControl(...)\n";
this->addCommand(new CCommandTargetControl(this));
(*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandShipControl(...))\n";
this->addCommand(new CCommandShipControl(this));
return true;
}
void CShooterApplication::processFrame(const size_t frame)
{
CApplication::processFrame(frame);
m_ship->processFrame(frame);
if (m_ship->isShooting())
{
for (auto it = m_targets.begin(); it != m_targets.end(); ++it)
{
if ((*it)->collidesWith(m_ship->getShotCoordinates()))
{
delete *it;
m_targets.erase(it);
m_TargetRequest = true;
break;
}
}
}
}
void CShooterApplication::addTarget(const size_t targetPosition)
{
m_targets.push_back(CShooterTarget::createTarget(Ogre::Radian(Ogre::Math::PI * 2 / 360 * 45 * targetPosition)));
}
void CShooterApplication::startExperiment()
{
m_TargetRequest = true;
CApplication::startExperiment();
m_instructionsReady->setVisible(false);
}
} // namespace SSVEP
} // namespace OpenViBE
#endif
@@ -0,0 +1,33 @@
#pragma once
#include <openvibe/ov_all.h>
#include <toolkit/ovtk_all.h>
#include "../ovassvepCApplication.h"
#include "ovassvepCShooterTarget.h"
#include "ovassvepCStarShip.h"
namespace OpenViBE {
namespace SSVEP {
class CShooterApplication final : public CApplication
{
public:
CShooterApplication() : CApplication() {}
~CShooterApplication() override;
bool setup(Kernel::IKernelContext* kernelCtx) override;
CStarShip* getShip() const { return m_ship; }
void startExperiment() override;
void addTarget(size_t targetPosition);
bool m_TargetRequest = false;
private:
void processFrame(const size_t frame) override;
CEGUI::Window* m_instructionsReady = nullptr;
CStarShip* m_ship = nullptr;
std::vector<CShooterTarget*> m_targets;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,57 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepCShooterTarget.h"
namespace OpenViBE {
namespace SSVEP {
Ogre::SceneNode* CShooterTarget::m_parentNode = nullptr;
CBasicPainter* CShooterTarget::m_painter = nullptr;
void CShooterTarget::initialize(CBasicPainter* painter, Ogre::SceneNode* parentNode)
{
m_painter = painter;
m_parentNode = parentNode;
}
CShooterTarget* CShooterTarget::createTarget(const Ogre::Radian angle)
{
if (m_painter == nullptr)
{
std::cerr << "The CShooterTarget was not initialized" << std::endl;
return nullptr;
}
return new CShooterTarget(angle);
}
CShooterTarget::CShooterTarget(const Ogre::Radian angle)
{
m_targetNode = m_parentNode->createChildSceneNode();
Ogre::MovableObject* targetObject = m_painter->paintCircle(0.0F, 1.0F - 1.0F * SSVEP_SHOOTER_TARGET_SIZE, SSVEP_SHOOTER_TARGET_SIZE,
Ogre::ColourValue(1.0F, 1.0F, 1.0F));
targetObject->setVisible(true);
m_targetNode->attachObject(targetObject);
m_targetNode->roll(angle);
}
CShooterTarget::~CShooterTarget()
{
m_targetNode->removeAndDestroyAllChildren();
m_targetNode->getCreator()->destroySceneNode(m_targetNode);
}
bool CShooterTarget::collidesWith(const std::pair<Ogre::Real, Ogre::Real> point) const
{
const Ogre::Radian theta = (m_targetNode->getOrientation()).getRoll();
const Ogre::Real targetDist = 1.0F - 2 * SSVEP_SHOOTER_TARGET_SIZE;
const Ogre::Real dist = sqrt(pow(point.first + Ogre::Math::Sin(theta) * targetDist, 2) + pow(point.second - Ogre::Math::Cos(theta) * targetDist, 2));
return dist <= SSVEP_SHOOTER_TARGET_SIZE;
}
} // namespace SSVEP
} // namespace OpenViBE
#endif
@@ -0,0 +1,29 @@
#pragma once
#include <Ogre.h>
#include "../ovassvepCBasicPainter.h"
#define SSVEP_SHOOTER_TARGET_SIZE 0.15f
namespace OpenViBE {
namespace SSVEP {
class CShooterTarget
{
public:
static CShooterTarget* createTarget(Ogre::Radian angle);
static void initialize(CBasicPainter* painter, Ogre::SceneNode* parentNode);
~CShooterTarget();
bool collidesWith(std::pair<Ogre::Real, Ogre::Real> point) const;
private:
static Ogre::SceneNode* m_parentNode;
static CBasicPainter* m_painter;
Ogre::SceneNode* m_targetNode = nullptr;
explicit CShooterTarget(Ogre::Radian angle);
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,152 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepCStarShip.h"
#include "../ovassvepCApplication.h"
#include "../ovassvepCSSVEPFlickeringObject.h"
#define SSVEP_SHIP_HULL_COLOUR Ogre::ColourValue(0.0F, 0.5F, 0.5F)
#define SIGN(x) ( (x) < 0 ? -1 : 1 )
namespace OpenViBE {
namespace SSVEP {
CStarShip::CStarShip(CApplication* application, Ogre::SceneNode* parentNode, const Ogre::Real radius, std::vector<std::pair<size_t, size_t>>* frequencies)
{
// get configuration and controlling objects
Kernel::IConfigurationManager* configManager = application->getConfigurationManager();
CBasicPainter* painter = application->getPainter();
m_angularSpeed = Ogre::Real(configManager->expandAsFloat(
"${SSVEP_ShipAngularSpeed}", Ogre::Math::PI / 60.0F));
application->getLogManager() << Kernel::LogLevel_Info << "Ship Angluar Speed : " << m_angularSpeed << "\n";
const Ogre::ColourValue lightColor = Ogre::ColourValue(float(configManager->expandAsFloat("${SSVEP_TargetLightColourRed}", 1.0F)),
float(configManager->expandAsFloat("${SSVEP_TargetLightColourGreen}", 1.0F)),
float(configManager->expandAsFloat("${SSVEP_TargetLightColourBlue}", 1.0F)));
const Ogre::ColourValue darkColor = Ogre::ColourValue(float(configManager->expandAsFloat("${SSVEP_TargetDarkColourRed}", 0.0F)),
float(configManager->expandAsFloat("${SSVEP_TargetDarkColourGreen}", 0.0F)),
float(configManager->expandAsFloat("${SSVEP_TargetDarkColourBlue}", 0.0F)));
// draw the ship scene objects
m_shipNode = parentNode->createChildSceneNode();
m_shotNode = m_shipNode->createChildSceneNode();
Ogre::MovableObject* shipHull = painter->paintCircle(0.0F, 0.0F, radius, SSVEP_SHIP_HULL_COLOUR, false, 2);
m_shipNode->attachObject(shipHull);
shipHull->setVisible(true);
// Ogre::RealRect wingRectangle = { - radius * 0.4f, radius * 0.4f, radius * 0.4f, -radius * 0.4f };
const Ogre::RealRect wingRectangle(-radius * 0.4F, radius * 0.4F, radius * 0.4F, -radius * 0.4F);
// paint the cannon
Ogre::SceneNode* drawnObjectNode = m_shipNode->createChildSceneNode();
Ogre::MovableObject* drawnObject = painter->paintTriangle(Point(0.0F, radius * 0.4F), Point(- radius * 0.4F, -radius * 0.4F),
Point(radius * 0.4F, -radius * 0.4F), lightColor);
drawnObject->setVisible(true);
drawnObjectNode->attachObject(drawnObject);
drawnObject = painter->paintTriangle(Point(0.0F, radius * 0.4F), Point(- radius * 0.4F, -radius * 0.4F), Point(radius * 0.4F, -radius * 0.4F), darkColor);
drawnObject->setVisible(false);
drawnObjectNode->attachObject(drawnObject);
drawnObjectNode->setPosition(0.0, radius, 0.0);
m_shipCannon = new CSSVEPFlickeringObject(drawnObjectNode, (*frequencies)[1].first, (*frequencies)[1].second);
// paint the left wing
drawnObjectNode = m_shipNode->createChildSceneNode();
drawnObject = painter->paintRectangle(wingRectangle, lightColor);
drawnObject->setVisible(true);
drawnObjectNode->attachObject(drawnObject);
drawnObject = painter->paintRectangle(wingRectangle, darkColor);
drawnObject->setVisible(false);
drawnObjectNode->attachObject(drawnObject);
drawnObjectNode->setPosition(-radius * 0.875F, -radius * 0.875F, 0.0);
m_shipLeftWing = new CSSVEPFlickeringObject(drawnObjectNode, (*frequencies)[2].first, (*frequencies)[2].second);
// paint the right wing
drawnObjectNode = m_shipNode->createChildSceneNode();
drawnObject = painter->paintRectangle(wingRectangle, lightColor);
drawnObject->setVisible(true);
drawnObjectNode->attachObject(drawnObject);
drawnObject = painter->paintRectangle(wingRectangle, darkColor);
drawnObject->setVisible(false);
drawnObjectNode->attachObject(drawnObject);
drawnObjectNode->setPosition(radius * 0.875F, -radius * 0.875F, 0.0F);
m_shipRightWing = new CSSVEPFlickeringObject(drawnObjectNode, (*frequencies)[3].first, (*frequencies)[3].second);
// create the shot
drawnObject = painter->paintTriangle(Point(0.0F, radius * 0.25F), Point(-radius * 0.125F, 0.0F), Point(radius * 0.125F, 0.0F),
Ogre::ColourValue(1.0F, 1.0F, 0.0F));
drawnObject->setVisible(false);
m_shotNode->attachObject(drawnObject);
drawnObject = painter->paintTriangle(Point(-radius * 0.125F, 0.0F), Point(0.0F, -radius * 0.75F), Point(radius * 0.125F, 0.0F),
Ogre::ColourValue(1.0F, 1.0F, 0.0F));
drawnObject->setVisible(false);
m_shotNode->attachObject(drawnObject);
}
void CStarShip::processFrame(const size_t /*currentFrame*/)
{
m_shipCannon->processFrame();
m_shipLeftWing->processFrame();
m_shipRightWing->processFrame();
if (m_nCurrentRotation != 0)
{
m_shipNode->roll(Ogre::Radian(m_angularSpeed * SIGN(m_nCurrentRotation)));
m_currentAngle += Ogre::Radian(m_angularSpeed * SIGN(m_nCurrentRotation));
m_nCurrentRotation -= SIGN(m_nCurrentRotation);
}
if (m_isShooting)
{
m_shotDistance += 0.07F;
m_shotNode->setPosition(0.0, m_shotDistance, 0.0);
if (m_shotDistance > 1.5F)
{
m_isShooting = false;
m_shotNode->setVisible(false);
}
}
}
void CStarShip::shoot()
{
if (m_isShooting) { return; }
m_isShooting = true;
m_shotDistance = 0.0F;
m_shotNode->setPosition(0.0F, 0.0F, 0.0F);
m_shotNode->setVisible(true);
}
std::pair<Ogre::Real, Ogre::Real> CStarShip::getShotCoordinates() const
{
return std::make_pair(-Ogre::Math::Sin(m_currentAngle) * m_shotDistance, Ogre::Math::Cos(m_currentAngle) * m_shotDistance);
}
} // namespace SSVEP
} // namespace OpenViBE
#endif
@@ -0,0 +1,39 @@
#pragma once
#include <Ogre.h>
#include <openvibe/ov_all.h>
#include <toolkit/ovtk_all.h>
namespace OpenViBE {
namespace SSVEP {
class CApplication;
class CSSVEPFlickeringObject;
class CStarShip
{
public:
CStarShip(CApplication* application, Ogre::SceneNode* parentNode, Ogre::Real radius, std::vector<std::pair<size_t, size_t>>* frequencies);
void processFrame(const size_t currentFrame);
void rotate(const int nRotation) { m_nCurrentRotation += nRotation; }
bool isShooting() const { return m_isShooting; }
void shoot();
std::pair<Ogre::Real, Ogre::Real> getShotCoordinates() const;
private:
Ogre::SceneNode* m_shipNode = nullptr;
CSSVEPFlickeringObject* m_shipCannon = nullptr;
CSSVEPFlickeringObject* m_shipLeftWing = nullptr;
CSSVEPFlickeringObject* m_shipRightWing = nullptr;
Ogre::Real m_angularSpeed;
Ogre::Radian m_currentAngle;
int m_nCurrentRotation = 0;
Ogre::SceneNode* m_shotNode = nullptr;
bool m_isShooting = false;
Ogre::Real m_shotDistance = 0.0F;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,19 @@
#pragma once
#include "../ovassvepICommandVRPNButton.h"
#include "ovassvepCTrainerApplication.h"
namespace OpenViBE {
namespace SSVEP {
class CTrainerApplication;
class CCommandReceiveTarget final : public ICommandVRPNButton
{
public:
explicit CCommandReceiveTarget(CApplication* application) : ICommandVRPNButton(application, "SSVEP_VRPN_Target") {}
~CCommandReceiveTarget() override { }
void execute(const int button, const int state) override { dynamic_cast<CTrainerApplication*>(m_application)->setTarget(button); }
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,125 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepCTrainerApplication.h"
#include "../ovassvepCCommandStartStop.h"
#include "../ovassvepCCommandStimulatorControl.h"
#include "ovassvepCCommandReceiveTarget.h"
namespace OpenViBE {
namespace SSVEP {
#if !((CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8))
namespace CEGUI
{
typedef CEGUI::UVector2 USize;
};
#endif
bool CTrainerApplication::setup(Kernel::IKernelContext* kernelCtx)
{
if (!CApplication::setup(kernelCtx)) { return false; }
(*m_logManager) << Kernel::LogLevel_Debug << " * CTrainerApplication::setup()\n";
Kernel::IConfigurationManager* configManager = &(m_kernelCtx->getConfigurationManager());
CTrainerFlickeringObject::initialize(this);
// paint targets
const size_t nTarget = size_t(configManager->expandAsUInteger("${SSVEP_TargetCount}"));
for (size_t i = 0; i < nTarget; ++i) { this->addObject(CTrainerFlickeringObject::createTrainerFlickeringObject(i)); }
// draw the initial text
m_instructionsReady = m_guiManager->createWindow("TaharezLook/StaticImage", "InstructionsReady");
m_instructionsReady->setPosition(CEGUI::UVector2(cegui_reldim(0.0F), cegui_reldim(0.0F)));
m_instructionsReady->setSize(CEGUI::USize(CEGUI::UDim(0.0F, 640.F), CEGUI::UDim(0.0F, 32.F)));
#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8)
m_sheet->addChild(m_instructionsReady);
CEGUI::ImageManager::getSingleton().addFromImageFile("InstructionsReady", "InstructionText-Start.png");
m_instructionsReady->setProperty("Image", "InstructionsReady");
#else
m_sheet->addChildWindow(m_instructionsReady);
CEGUI::ImagesetManager::getSingleton().createFromImageFile("InstructionsReady", "InstructionText-Start.png");
m_instructionsReady->setProperty("Image", "set:InstructionsReady image:full_image");
#endif
m_instructionsReady->setProperty("FrameEnabled", "False");
m_instructionsReady->setProperty("BackgroundEnabled", "False");
m_instructionsReady->setVisible(true);
// initialize commands
(*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandStartStop(...)\n";
this->addCommand(new CCommandStartStop(this));
(*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CCommandStimulatorControl(...))\n";
this->addCommand(new CCommandStimulatorControl(this));
(*m_logManager) << Kernel::LogLevel_Debug << "+ addCommand(new CC(...))\n";
this->addCommand(new CCommandReceiveTarget(this));
(*m_logManager) << Kernel::LogLevel_Debug << " * CTrainerApplication::setup() completed successfully\n";
return true;
}
void CTrainerApplication::processFrame(const size_t frame)
{
CApplication::processFrame(frame);
if (!m_active) { return; }
for (size_t i = 0; i < m_oObjects.size(); ++i) { m_oObjects[i]->processFrame(); }
}
void CTrainerApplication::addObject(CTrainerFlickeringObject* obj)
{
m_oObjects.push_back(obj);
obj->setVisible(true);
}
void CTrainerApplication::setTarget(const int target)
{
const size_t currentTime = int(time(nullptr) - m_ttStartTime);
(*m_logManager) << Kernel::LogLevel_Info << currentTime << " > Target set to " << target << "\n";
for (int i = 0; i < int(m_oObjects.size()); ++i) { m_oObjects[i]->setTarget(target == i); }
}
void CTrainerApplication::startExperiment()
{
CApplication::startExperiment();
m_ttStartTime = time(nullptr);
this->stopFlickering();
m_instructionsReady->setVisible(false);
}
void CTrainerApplication::startFlickering()
{
const size_t currentTime = size_t(time(nullptr) - m_ttStartTime);
(*m_logManager) << Kernel::LogLevel_Info << currentTime << " > Starting Visual Stimulation\n";
m_active = true;
}
void CTrainerApplication::stopFlickering()
{
const size_t currentTime = size_t(time(nullptr) - m_ttStartTime);
(*m_logManager) << Kernel::LogLevel_Info << currentTime << " > Stopping Visual Stimulation\n";
m_active = false;
for (size_t i = 0; i < m_oObjects.size(); ++i) { m_oObjects[i]->setVisible(true); }
this->setTarget(-1);
}
} // namespace SSVEP
} // namespace OpenViBE
#endif
@@ -0,0 +1,36 @@
#pragma once
#include <CEGUI.h>
#include "../ovassvepCApplication.h"
#include "ovassvepCTrainerFlickeringObject.h"
namespace OpenViBE {
namespace SSVEP {
class CTrainerApplication final : public CApplication
{
public:
CTrainerApplication() : CApplication() {}
~CTrainerApplication() override {}
bool setup(Kernel::IKernelContext* kernelCtx) override;
void setTarget(int target);
void startExperiment() override;
void startFlickering() override;
void stopFlickering() override;
private:
bool m_active = false;
void processFrame(const size_t frame) override;
void addObject(CTrainerFlickeringObject* obj);
std::vector<CTrainerFlickeringObject*> m_oObjects;
time_t m_ttStartTime = 0;
CEGUI::Window* m_instructionsReady = nullptr;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,91 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepCTrainerFlickeringObject.h"
#include "ovassvepCTrainerApplication.h"
namespace OpenViBE {
namespace SSVEP {
Ogre::SceneNode* CTrainerFlickeringObject::m_parentNode = nullptr;
CBasicPainter* CTrainerFlickeringObject::m_painter = nullptr;
Ogre::ColourValue CTrainerFlickeringObject::m_lightColor = Ogre::ColourValue(1.0F, 1.0F, 1.0F);
Ogre::ColourValue CTrainerFlickeringObject::m_darkColor = Ogre::ColourValue(0.0F, 0.0F, 0.0F);
float CTrainerFlickeringObject::m_targetWidth = 0.2F;
float CTrainerFlickeringObject::m_targetHeight = 0.2F;
CTrainerApplication* CTrainerFlickeringObject::m_application = nullptr;
void CTrainerFlickeringObject::initialize(CTrainerApplication* application)
{
m_application = application;
Kernel::IConfigurationManager* configManager = application->getConfigurationManager();
m_painter = application->getPainter();
m_parentNode = application->getSceneNode();
m_targetWidth = float(configManager->expandAsFloat("${SSVEP_TargetWidth}"));
m_targetHeight = float(configManager->expandAsFloat("${SSVEP_TargetHeight}"));
m_lightColor = Ogre::ColourValue(float(configManager->expandAsFloat("${SSVEP_TargetLightColourRed}")),
float(configManager->expandAsFloat("${SSVEP_TargetLightColourGreen}")),
float(configManager->expandAsFloat("${SSVEP_TargetLightColourBlue}")));
m_darkColor = Ogre::ColourValue(float(configManager->expandAsFloat("${SSVEP_TargetDarkColourRed}")),
float(configManager->expandAsFloat("${SSVEP_TargetDarkColourGreen}")),
float(configManager->expandAsFloat("${SSVEP_TargetDarkColourBlue}")));
}
CTrainerFlickeringObject* CTrainerFlickeringObject::createTrainerFlickeringObject(const size_t targetId)
{
Kernel::IConfigurationManager* configManager = m_application->getConfigurationManager();
if (m_painter != nullptr)
{
const Ogre::ColourValue currentTargetColour = (targetId == 0) ? m_darkColor : m_lightColor;
const CIdentifier id = configManager->createConfigurationToken("SSVEPTarget_Id", std::to_string(targetId).c_str());
const float targetX = float(configManager->expandAsFloat("${SSVEP_Target_X_${SSVEPTarget_Id}}"));
const float targetY = float(configManager->expandAsFloat("${SSVEP_Target_Y_${SSVEPTarget_Id}}"));
const size_t framesL = (*(m_application->getFrequencies()))[targetId].first;
const size_t framesD = (*(m_application->getFrequencies()))[targetId].second;
m_application->getLogManager() << Kernel::LogLevel_Info << "New trainer object : id=" << targetId << " litFrames=" << framesL <<
" darkFrames=" << framesD << "\n";
configManager->releaseConfigurationToken(id);
return new CTrainerFlickeringObject(targetX, targetY, currentTargetColour, uint8_t(framesL), uint8_t(framesD));
}
m_application->getLogManager() << Kernel::LogLevel_Fatal << "TrainerTarget object was not properly initialized\n";
return nullptr;
}
CTrainerFlickeringObject::CTrainerFlickeringObject(const float posX, const float posY, const Ogre::ColourValue colour, const uint8_t litFrames,
const uint8_t darkFrames)
: CSSVEPFlickeringObject(nullptr, litFrames, darkFrames)
{
m_elementNode = m_parentNode->createChildSceneNode();
m_objectNode = m_elementNode->createChildSceneNode();
Ogre::SceneNode* pointerNode = m_elementNode->createChildSceneNode();
const Ogre::RealRect rectangle(posX - m_targetWidth / 2, posY + m_targetHeight / 2, posX + m_targetWidth / 2, posY - m_targetHeight / 2);
Ogre::MovableObject* litObject = m_painter->paintRectangle(rectangle, colour);
m_objectNode->attachObject(litObject);
litObject->setVisible(true);
Ogre::MovableObject* darkObject = m_painter->paintRectangle(rectangle, m_darkColor);
m_objectNode->attachObject(darkObject);
darkObject->setVisible(false);
m_pointer = m_painter->paintTriangle(Point(posX - 0.05F, posY + m_targetHeight), Point(posX, posY + m_targetHeight - 0.05F),
Point(posX + 0.05F, posY + m_targetHeight), Ogre::ColourValue(1, 1, 0));
pointerNode->attachObject(m_pointer);
m_pointer->setVisible(false);
}
} // namespace SSVEP
} // namespace OpenViBE
#endif
@@ -0,0 +1,40 @@
#pragma once
#include <openvibe/ov_all.h>
#include <toolkit/ovtk_all.h>
#include <Ogre.h>
#include "../ovassvepCSSVEPFlickeringObject.h"
#include "../ovassvepCBasicPainter.h"
namespace OpenViBE {
namespace SSVEP {
class CTrainerApplication;
class CTrainerFlickeringObject final : public CSSVEPFlickeringObject
{
public:
static CTrainerFlickeringObject* createTrainerFlickeringObject(size_t targetId);
static void initialize(CTrainerApplication* application);
static void connectToNode(Ogre::SceneNode* /*sceneNode*/) { }
void setTarget(const bool isTarget) const { m_pointer->setVisible(isTarget); }
bool isTarget() const { return m_pointer->getVisible(); }
private:
static CTrainerApplication* m_application;
static Ogre::SceneNode* m_parentNode;
static CBasicPainter* m_painter;
static float m_targetWidth;
static float m_targetHeight;
static Ogre::ColourValue m_lightColor;
static Ogre::ColourValue m_darkColor;
CTrainerFlickeringObject(float posX, float posY, Ogre::ColourValue colour, uint8_t litFrames, uint8_t darkFrames);
Ogre::SceneNode* m_elementNode = nullptr;
Ogre::MovableObject* m_pointer = nullptr;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,286 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepCApplication.h"
#include <cmath>
#include "fs/Files.h"
namespace OpenViBE {
namespace SSVEP {
#define MIN(a,b) ( (a) < (b) ? (a) : (b) )
//---------------------------------------------------------------------------------------------------
CApplication::~CApplication()
{
if (m_painter != nullptr)
{
(*m_logManager) << Kernel::LogLevel_Debug << "- m_painter\n";
delete m_painter;
m_painter = nullptr;
}
for (auto it = m_oCommands.begin();
it != m_oCommands.end(); ++it)
{
(*m_logManager) << Kernel::LogLevel_Debug << "- ICommand\n";
if (*it != nullptr)
{
delete *it;
*it = nullptr;
}
}
(*m_logManager) << Kernel::LogLevel_Debug << "- m_root\n";
if (m_root != nullptr)
{
delete m_root;
m_root = nullptr;
}
}
//---------------------------------------------------------------------------------------------------
bool CApplication::setup(Kernel::IKernelContext* poKernelContext)
{
m_kernelCtx = poKernelContext;
m_logManager = &(m_kernelCtx->getLogManager());
Kernel::IConfigurationManager* configurationManager = &(m_kernelCtx->getConfigurationManager());
(*m_logManager) << Kernel::LogLevel_Debug << " * CApplication::setup()\n";
// Plugin config path setup
const CString pluginsPath = configurationManager->expand("${Kernel_3DVisualizationOgrePlugins}");
// Create LogManager to stop Ogre flooding the console and creating random files
(*m_logManager) << Kernel::LogLevel_Info << "Ogre plugins path is " << pluginsPath << "\n";
(*m_logManager) << Kernel::LogLevel_Debug << "+ Creating Ogre logmanager\n";
Ogre::LogManager* logManager = new Ogre::LogManager();
(*m_logManager) << Kernel::LogLevel_Info << "Ogre log to console : " << configurationManager->expandAsBoolean("${SSVEP_Ogre_LogToConsole}", false)
<< "\n";
const CString ogreLog = configurationManager->expand("${Path_Log}") + "/openvibe-ssvep-demo-ogre.log";
(*m_logManager) << Kernel::LogLevel_Info << "Ogre log file : " << ogreLog << "\n";
FS::Files::createParentPath(ogreLog);
logManager->createLog(ogreLog.toASCIIString(), true, configurationManager->expandAsBoolean("${SSVEP_Ogre_LogToConsole}", false), false);
// Root creation
const CString ogreCfg = configurationManager->expand("${Path_UserData}") + "/openvibe-ssvep-demo-ogre.cfg";
(*m_logManager) << Kernel::LogLevel_Debug << "+ m_root = new Ogre::Root(...)\n";
(*m_logManager) << Kernel::LogLevel_Info << "Ogre cfg file : " << ogreCfg << "\n";
m_root = new Ogre::Root(pluginsPath.toASCIIString(), ogreCfg.toASCIIString(), ogreLog.toASCIIString());
// Resource handling
setupResources();
// Configuration from file or dialog window if needed
if (!configure())
{
(*m_logManager) << Kernel::LogLevel_Fatal << "The configuration process ended unexpectedly.\n";
return false;
}
// m_window = m_root->initialise(true);
Ogre::NameValuePairList optionList;
m_root->initialise(false);
optionList["vsync"] = "1";
m_window = m_root->createRenderWindow("SSVEP Stimulator", 640, 480, configurationManager->expandAsBoolean("${SSVEP_Ogre_FullScreen}", false), &optionList);
m_windowWidth = m_window->getWidth();
m_windowHeight = m_window->getHeight();
m_sceneManager = m_root->createSceneManager(Ogre::ST_GENERIC);
m_camera = m_sceneManager->createCamera("SSVEPApplicationCamera");
Ogre::SceneManager* fillSceneManager = m_root->createSceneManager(Ogre::ST_GENERIC);
Ogre::Camera* fillCamera = fillSceneManager->createCamera("SSVEPFillCamera");
m_window->addViewport(fillCamera, 0);
m_viewport = m_window->addViewport(m_camera, 1);
this->resizeViewport();
// m_viewport->setBackgroundColour(Ogre::ColourValue(0.0, 0.5, 0.5));
m_camera->setAspectRatio(Ogre::Real(m_viewport->getActualWidth()) / Ogre::Real(m_viewport->getActualHeight()));
m_sceneNode = m_sceneManager->getRootSceneNode()->createChildSceneNode("SSVEPApplicationNode");
// initialize the painter object
(*m_logManager) << Kernel::LogLevel_Debug << "+ m_painter = new CBasicPainter(...)\n";
m_painter = new CBasicPainter(this);
(*m_logManager) << Kernel::LogLevel_Debug << " * initializing CEGUI\n";
this->initCEGUI(configurationManager->expand("${Path_Log}") + "/openvibe-ssvep-demo-cegui.log");
(*m_logManager) << Kernel::LogLevel_Debug << " * CEGUI initialized\n";
// create the vector of stimulation frequencies
m_ScreenRefreshRate = double(configurationManager->expandAsUInteger("${SSVEP_ScreenRefreshRate}"));
(*m_logManager) << Kernel::LogLevel_Info << "Specified screen refresh rate :" << m_ScreenRefreshRate << "Hz\n";
size_t i = 1;
CIdentifier frequencyId = configurationManager->createConfigurationToken("SSVEP_FrequencyId", "1");
m_oFrequencies.push_back(std::pair<size_t, size_t>(30, 30));
while (configurationManager->lookUpConfigurationTokenIdentifier(configurationManager->expand("SSVEP_Frequency_${SSVEP_FrequencyId}"))
!= CIdentifier::undefined())
{
std::pair<size_t, size_t> frequency;
double currentFrequency;
currentFrequency = double(configurationManager->expandAsFloat("${SSVEP_Frequency_${SSVEP_FrequencyId}}"));
const double approximatedFrameCount = m_ScreenRefreshRate / currentFrequency;
if (fabs(approximatedFrameCount - floor(approximatedFrameCount + 0.5)) < 0.003)
{
frequency.first = int(floor(approximatedFrameCount + 0.5)) / 2 + int(floor(approximatedFrameCount + 0.5)) % 2;
frequency.second = int(floor(approximatedFrameCount + 0.5)) / 2;
(*m_logManager) << Kernel::LogLevel_Info << "Frequency number " << i << ": " << currentFrequency << "Hz / " << floor(approximatedFrameCount + 0.5)
<< " ( " << frequency.first << ", " << frequency.second << ") frames @ " << m_ScreenRefreshRate << "fps\n";
m_oFrequencies.push_back(frequency);
}
else { (*m_logManager) << Kernel::LogLevel_Error << "The selected frequency (" << currentFrequency << "Hz) is not supported by your screen.\n"; }
configurationManager->releaseConfigurationToken(frequencyId);
frequencyId = configurationManager->createConfigurationToken("SSVEP_FrequencyId", std::to_string(++i).c_str());
}
return true;
}
//---------------------------------------------------------------------------------------------------
bool CApplication::configure() const
{
if (! m_root->restoreConfig())
{
if (! m_root->showConfigDialog())
{
(*m_logManager) << Kernel::LogLevel_Error << "No configuration created from the dialog window.\n";
return false;
}
}
// Set hard-coded parameters, VSync in particular
m_root->getRenderSystem()->setConfigOption("VSync", "True");
// m_root->getRenderSystem()->setConfigOption("Full Screen", "Yes");
m_root->getRenderSystem()->setConfigOption("Video Mode", "640 x 480 @ 16-bit colour");
return true;
}
//---------------------------------------------------------------------------------------------------
void CApplication::initCEGUI(const char* logFilename)
{
// Instantiate logger before bootstrapping the system, this way we will be able to get the log redirected
if (!CEGUI::Logger::getSingletonPtr()) { new CEGUI::DefaultLogger(); } // singleton; instantiate only, no delete
(*m_logManager) << Kernel::LogLevel_Info << "+ CEGUI log will be in '" << logFilename << "'\n";
FS::Files::createParentPath(logFilename);
CEGUI::Logger::getSingleton().setLogFilename(logFilename, false);
(*m_logManager) << Kernel::LogLevel_Debug << "+ Creating CEGUI Ogre bootstrap\n";
m_roGUIRenderer = &(CEGUI::OgreRenderer::bootstrapSystem(*m_window));
(*m_logManager) << Kernel::LogLevel_Debug << "+ Creating CEGUI Scheme Manager\n";
#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8)
CEGUI::SchemeManager::getSingleton().createFromFile(const_cast<CEGUI::utf8*>(reinterpret_cast<const CEGUI::utf8*>("TaharezLook-ov-0.8.scheme")));
#else
CEGUI::SchemeManager::getSingleton().create(reinterpret_cast<CEGUI::utf8*>("TaharezLook-ov.scheme"));
#endif
(*m_logManager) << Kernel::LogLevel_Debug << "+ Creating CEGUI WindowManager\n";
m_guiManager = CEGUI::WindowManager::getSingletonPtr();
m_sheet = m_guiManager->createWindow("DefaultWindow", "Sheet");
(*m_logManager) << Kernel::LogLevel_Debug << "+ Setting CEGUI StyleSheet\n";
#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8)
CEGUI::System::getSingleton().getDefaultGUIContext().setRootWindow(m_sheet);
#else
CEGUI::System::getSingleton().setGUISheet(m_sheet);
#endif
}
//---------------------------------------------------------------------------------------------------
void CApplication::resizeViewport()
{
(*m_logManager) << Kernel::LogLevel_Trace << "Creating a new viewport\n";
const Ogre::uint32 size = MIN(m_windowWidth, m_windowHeight);
(*m_logManager) << Kernel::LogLevel_Info << "New viewport size : " << size << "\n";
m_viewport->setDimensions(Ogre::Real(m_windowWidth - size) / Ogre::Real(m_windowWidth) / 2,
Ogre::Real(m_windowHeight - size) / Ogre::Real(m_windowHeight) / 2,
Ogre::Real(size) / Ogre::Real(m_windowWidth), Ogre::Real(size) / Ogre::Real(m_windowHeight));
}
//---------------------------------------------------------------------------------------------------
void CApplication::processFrame(const size_t /*currentFrame*/)
{
if (m_windowWidth != m_window->getWidth() || m_windowHeight != m_window->getHeight())
{
m_windowWidth = m_window->getWidth();
m_windowHeight = m_window->getHeight();
this->resizeViewport();
}
}
//---------------------------------------------------------------------------------------------------
void CApplication::setupResources()
{
Ogre::ResourceGroupManager::getSingleton().createResourceGroup("SSVEP");
Ogre::ResourceGroupManager::getSingleton().addResourceLocation((Directories::getDataDir() + "/applications/ssvep-demo/resources").toASCIIString(),
"FileSystem", "SSVEP");
Ogre::ResourceGroupManager::getSingleton().addResourceLocation((Directories::getDataDir() + "/applications/ssvep-demo/resources/trainer").toASCIIString(),
"FileSystem", "SSVEPTrainer");
Ogre::ResourceGroupManager::getSingleton().addResourceLocation((Directories::getDataDir() + "/applications/ssvep-demo/resources/gui").toASCIIString(),
"FileSystem", "CEGUI");
Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("SSVEP");
Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("SSVEPTrainer");
Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("CEGUI");
}
//---------------------------------------------------------------------------------------------------
bool CApplication::frameStarted(const Ogre::FrameEvent& /*evt*/)
{
++m_currFrame;
m_currFrame = m_currFrame % int(m_ScreenRefreshRate);
this->processFrame(m_currFrame);
for (size_t i = 0; i < m_oCommands.size(); ++i) { m_oCommands[i]->processFrame(); }
return true;
}
//---------------------------------------------------------------------------------------------------
void CApplication::go()
{
(*m_logManager) << Kernel::LogLevel_Debug << "Associating application as Ogre frame listener\n";
m_root->addFrameListener(this);
(*m_logManager) << Kernel::LogLevel_Debug << "Entering Ogre rendering loop\n";
m_root->startRendering();
(*m_logManager) << Kernel::LogLevel_Debug << "Ogre rendering loop finished ... exiting\n";
}
//---------------------------------------------------------------------------------------------------
void CApplication::stopExperiment()
{
(*m_logManager) << Kernel::LogLevel_Info << "[!] Experiment halting\n";
this->exit();
}
} // namespace SSVEP
} // namespace OpenViBE
#endif // TARGET_HAS_ThirdPartyOgre3D
@@ -0,0 +1,87 @@
#pragma once
#include "ovassvep_defines.h"
#include <openvibe/ov_all.h>
#include <toolkit/ovtk_all.h>
#include <Ogre.h>
#include <vector>
#include <CEGUI.h>
#if (CEGUI_VERSION_MAJOR > 0) || (CEGUI_VERSION_MINOR >= 8)
#include <CEGUI/RendererModules/Ogre/Renderer.h>
#else
#include <RendererModules/Ogre/CEGUIOgreRenderer.h>
#endif
#include "ovassvepICommand.h"
#include "ovassvepCBasicPainter.h"
namespace OpenViBE {
namespace SSVEP {
class CApplication : public Ogre::FrameListener, public Ogre::WindowEventListener
{
public:
CApplication() {}
~CApplication() override;
void addCommand(ICommand* command) { m_oCommands.push_back(command); }
virtual bool setup(Kernel::IKernelContext* poKernelContext);
void go();
virtual void startExperiment() { (*m_logManager) << Kernel::LogLevel_Info << "[!] Experiment starting\n"; }
virtual void stopExperiment();
virtual void startFlickering() {}
virtual void stopFlickering() {}
Ogre::RenderWindow* getWindow() const { return m_window; }
Ogre::SceneManager* getSceneManager() const { return m_sceneManager; }
Ogre::SceneNode* getSceneNode() const { return m_sceneNode; }
CBasicPainter* getPainter() const { return m_painter; }
void exit() { m_bContinueRendering = false; }
Kernel::ILogManager& getLogManager() const { return (*m_logManager); }
Kernel::IConfigurationManager* getConfigurationManager() const { return &(m_kernelCtx->getConfigurationManager()); }
std::vector<std::pair<size_t, size_t>>* getFrequencies() { return &m_oFrequencies; }
void resizeViewport();
protected:
Kernel::IKernelContext* m_kernelCtx = nullptr;
Kernel::ILogManager* m_logManager = nullptr;
double m_ScreenRefreshRate = 0;
CBasicPainter* m_painter = nullptr;
bool m_bContinueRendering = true;
size_t m_currFrame = 0;
Ogre::Root* m_root = nullptr;
Ogre::SceneManager* m_sceneManager = nullptr;
Ogre::Camera* m_camera = nullptr;
Ogre::RenderWindow* m_window = nullptr;
Ogre::Viewport* m_viewport = nullptr;
Ogre::SceneNode* m_sceneNode = nullptr;
CEGUI::OgreRenderer* m_roGUIRenderer = nullptr;
CEGUI::WindowManager* m_guiManager = nullptr;
CEGUI::Window* m_sheet = nullptr;
std::vector<std::pair<size_t, size_t>> m_oFrequencies;
std::vector<ICommand*> m_oCommands;
virtual void processFrame(const size_t currentFrame);
bool frameRenderingQueued(const Ogre::FrameEvent& evt) override { return (m_bContinueRendering && !m_window->isClosed()); }
bool frameStarted(const Ogre::FrameEvent& evt) override;
bool configure() const;
static void setupResources();
private:
void initCEGUI(const char* logFilename);
Ogre::uint32 m_windowWidth = 0;
Ogre::uint32 m_windowHeight = 0;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,162 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepCBasicPainter.h"
#include "ovassvepCApplication.h"
#if (OGRE_VERSION_MAJOR > 1) || ((OGRE_VERSION_MAJOR == 1) && (OGRE_VERSION_MINOR >= 9))
#include "Overlay/OgreOverlayManager.h"
#include "Overlay/OgreOverlaySystem.h"
#endif
namespace OpenViBE {
namespace SSVEP {
//---------------------------------------------------------------------------------------------------
CBasicPainter::CBasicPainter(CApplication* application)
: m_application(application), m_sceneManager(application->getSceneManager())
{
m_aabInf.setInfinite();
#if (OGRE_VERSION_MAJOR > 1) || ((OGRE_VERSION_MAJOR == 1) && (OGRE_VERSION_MINOR >= 9))
// on Ogre 1.9, overlay system needs to be manually created
Ogre::OverlaySystem* pOverlaySystem = OGRE_NEW Ogre::OverlaySystem();
m_sceneManager->addRenderQueueListener(pOverlaySystem);
#endif
m_overlayManager = Ogre::OverlayManager::getSingletonPtr();
(m_application->getLogManager()) << Kernel::LogLevel_Debug << " + Creating OverlayManager\n";
Ogre::Overlay* overlay = m_overlayManager->create("TextOverlay");
m_overlayContainer = dynamic_cast<Ogre::OverlayContainer*>(m_overlayManager->createOverlayElement("Panel", "TextContainer"));
m_overlayContainer->setDimensions(1, 1);
m_overlayContainer->setPosition(0, 0);
overlay->add2D(m_overlayContainer);
overlay->show();
}
//---------------------------------------------------------------------------------------------------
Ogre::ManualObject* CBasicPainter::paintRectangle(const Ogre::RealRect& oRectangle, const Ogre::ColourValue color, const int plane) const
{
Ogre::ManualObject* object = m_sceneManager->createManualObject();
object->begin("BasicSurface/Diffuse", Ogre::RenderOperation::OT_TRIANGLE_FAN);
object->setUseIdentityProjection(true);
object->setUseIdentityView(true);
object->position(oRectangle.right, oRectangle.top, 0.0);
object->colour(color);
object->index(0);
object->position(oRectangle.left, oRectangle.top, 0.0);
object->colour(color);
object->index(1);
object->position(oRectangle.left, oRectangle.bottom, 0.0);
object->colour(color);
object->index(2);
object->position(oRectangle.right, oRectangle.bottom, 0.0);
object->colour(color);
object->index(3);
object->index(0);
object->end();
object->setBoundingBox(m_aabInf);
object->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - plane);
object->setVisible(true);
return object;
}
//---------------------------------------------------------------------------------------------------
Ogre::ManualObject* CBasicPainter::paintTriangle(const Point p1, const Point p2, const Point p3, const Ogre::ColourValue color, const int plane) const
{
Ogre::ManualObject* object = m_sceneManager->createManualObject();
object->begin("BasicSurface/Diffuse", Ogre::RenderOperation::OT_TRIANGLE_FAN);
object->setUseIdentityProjection(true);
object->setUseIdentityView(true);
object->position(p1.m_X, p1.m_Y, 0.0);
object->colour(color);
object->index(0);
object->position(p2.m_X, p2.m_Y, 0.0);
object->colour(color);
object->index(1);
object->position(p3.m_X, p3.m_Y, 0.0);
object->colour(color);
object->index(2);
object->index(0);
object->end();
object->setBoundingBox(m_aabInf);
object->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - plane);
object->setVisible(true);
return object;
}
//---------------------------------------------------------------------------------------------------
Ogre::ManualObject* CBasicPainter::paintCircle(const Ogre::Real rX, const Ogre::Real rY, const Ogre::Real rR, const Ogre::ColourValue color,
const bool bFilled, const int plane) const
{
Ogre::ManualObject* object = m_sceneManager->createManualObject();
if (bFilled) { object->begin("BasicSurface/Diffuse", Ogre::RenderOperation::OT_TRIANGLE_FAN); }
else { object->begin("BasicSurface/Diffuse", Ogre::RenderOperation::OT_LINE_STRIP); }
object->setUseIdentityProjection(true);
object->setUseIdentityView(true);
float const fAccuracy = 16;
unsigned uiIndex = 0;
for (float theta = 0; theta <= 2 * Ogre::Math::PI; theta += Ogre::Math::PI / fAccuracy)
{
object->position(rX + rR * cos(theta), rY + rR * sin(theta), 0);
object->colour(color);
object->index(uiIndex++);
}
object->index(0);
object->end();
object->setBoundingBox(m_aabInf);
object->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - plane);
object->setVisible(true);
return object;
}
//---------------------------------------------------------------------------------------------------
void CBasicPainter::paintText(const std::string& sID, const std::string& sText, const Ogre::Real rX, const Ogre::Real rY,
const Ogre::Real rWidth, const Ogre::Real rHeight, const Ogre::ColourValue& color) const
{
Ogre::OverlayElement* text = m_overlayManager->createOverlayElement("TextArea", sID);
text->setDimensions(rWidth, rHeight);
text->setMetricsMode(Ogre::GMM_PIXELS);
text->setPosition(rX, rY);
text->setParameter("font_name", "DejaVu");
text->setColour(color);
text->setCaption(sText);
m_overlayContainer->addChild(text);
}
#endif
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,47 @@
#pragma once
#include <Ogre.h>
#if (OGRE_VERSION_MAJOR > 1) || ((OGRE_VERSION_MAJOR == 1) && (OGRE_VERSION_MINOR >= 9))
#include "Overlay/OgreOverlayContainer.h"
#endif
#define SSVEP_DEFAULT_COLOUR Ogre::ColourValue(1.0f, 1.0f, 1.0f)
namespace OpenViBE {
namespace SSVEP {
class CApplication;
class Point
{
public:
Point(const float x, const float y) : m_X(x), m_Y(y) {}
float m_X = 0.0F, m_Y = 0.0F;
};
class CBasicPainter
{
public:
explicit CBasicPainter(CApplication* application);
~CBasicPainter() {}
Ogre::ManualObject* paintRectangle(const Ogre::RealRect& oRectangle, const Ogre::ColourValue color = SSVEP_DEFAULT_COLOUR, const int plane = 1) const;
Ogre::ManualObject* paintTriangle(const Point p1, const Point p2, const Point p3, const Ogre::ColourValue color = SSVEP_DEFAULT_COLOUR,
const int plane = 1) const;
Ogre::ManualObject* paintCircle(const Ogre::Real rX, const Ogre::Real rY, const Ogre::Real rR, const Ogre::ColourValue color = SSVEP_DEFAULT_COLOUR,
const bool bFilled = true,
const int plane = 1) const;
void paintText(const std::string& sID, const std::string& sText, const Ogre::Real rX, const Ogre::Real rY,
const Ogre::Real rWidth, const Ogre::Real rHeight, const Ogre::ColourValue& color) const;
protected:
CApplication* m_application = nullptr;
Ogre::OverlayManager* m_overlayManager = nullptr;
Ogre::OverlayContainer* m_overlayContainer = nullptr;
Ogre::SceneManager* m_sceneManager = nullptr;
Ogre::AxisAlignedBox m_aabInf;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,54 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepCCommandStartStop.h"
#include "ovassvepCApplication.h"
#include "ovassvepCVRPNServer.h"
namespace OpenViBE {
namespace SSVEP {
//---------------------------------------------------------------------------------------------------
CCommandStartStop::CCommandStartStop(CApplication* application)
: ICommandOIS(application)
{
m_vrpnServer = CVRPNServer::getInstance(application);
m_vrpnServer->addButton("SSVEP_VRPN_StartStop", 2);
}
//---------------------------------------------------------------------------------------------------
CCommandStartStop::~CCommandStartStop()
{
m_application->getLogManager() << Kernel::LogLevel_Info << "End message sent\n";
m_vrpnServer->changeButtonState("SSVEP_VRPN_StartStop", 1, 1);
m_vrpnServer->processFrame();
}
//---------------------------------------------------------------------------------------------------
void CCommandStartStop::processFrame()
{
ICommandOIS::processFrame();
m_vrpnServer->processFrame();
}
//---------------------------------------------------------------------------------------------------
void CCommandStartStop::receiveKeyPressedEvent(const OIS::KeyCode key)
{
if (key == OIS::KC_SPACE)
{
m_application->getLogManager() << Kernel::LogLevel_Info << "Start message sent\n";
m_vrpnServer->changeButtonState("SSVEP_VRPN_StartStop", 0, 1);
}
if (key == OIS::KC_ESCAPE) { m_application->exit(); }
}
//---------------------------------------------------------------------------------------------------
void CCommandStartStop::receiveKeyReleasedEvent(const OIS::KeyCode key)
{
if (key == OIS::KC_SPACE) { m_vrpnServer->changeButtonState("SSVEP_VRPN_StartStop", 0, 0); }
}
} // namespace SSVEP
} // namespace OpenViBE
#endif
@@ -0,0 +1,24 @@
#pragma once
#include "ovassvepICommandOIS.h"
namespace OpenViBE {
namespace SSVEP {
class CVRPNServer;
class CCommandStartStop final : public ICommandOIS
{
public:
explicit CCommandStartStop(CApplication* application);
~CCommandStartStop() override;
void processFrame() override;
void receiveKeyPressedEvent(OIS::KeyCode key) override;
void receiveKeyReleasedEvent(OIS::KeyCode key) override;
private:
CVRPNServer* m_vrpnServer = nullptr;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,43 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepCCommandStimulatorControl.h"
#include "ovassvepCApplication.h"
namespace OpenViBE {
namespace SSVEP {
//---------------------------------------------------------------------------------------------------
CCommandStimulatorControl::CCommandStimulatorControl(CApplication* application)
: ICommandVRPNButton(application, "SSVEP_VRPN_StimulatorControl") {}
//---------------------------------------------------------------------------------------------------
void CCommandStimulatorControl::execute(const int button, const int /*state*/)
{
// only run the commands once, skip
switch (button)
{
case 0:
m_application->startExperiment();
break;
case 1:
m_application->stopExperiment();
break;
case 2:
m_application->startFlickering();
break;
case 3:
m_application->stopFlickering();
break;
default:
m_application->getLogManager() << Kernel::LogLevel_Error << "[ERROR] Unknown command\n";
break;
}
}
} // namespace SSVEP
} // namespace OpenViBE
#endif
@@ -0,0 +1,16 @@
#pragma once
#include "ovassvepICommandVRPNButton.h"
namespace OpenViBE {
namespace SSVEP {
class CCommandStimulatorControl final : public ICommandVRPNButton
{
public:
explicit CCommandStimulatorControl(CApplication* application);
~CCommandStimulatorControl() override { }
void execute(const int button, const int state) override;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,26 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepCSSVEPFlickeringObject.h"
namespace OpenViBE {
namespace SSVEP {
void CSSVEPFlickeringObject::setVisible(const bool visibility)
{
if ((!m_visible && visibility) || (m_visible && !visibility)) { m_objectNode->flipVisibility(); }
m_visible = visibility;
}
void CSSVEPFlickeringObject::processFrame()
{
if (m_currentFrame < m_litFrames) { this->setVisible(true); }
else { this->setVisible(false); }
m_currentFrame++;
if (m_currentFrame == m_litFrames + m_darkFrames) { m_currentFrame = 0; }
}
} // namespace SSVEP
} // namespace OpenViBE
#endif
@@ -0,0 +1,30 @@
#pragma once
#include <openvibe/ov_all.h>
#include <toolkit/ovtk_all.h>
#include <Ogre.h>
namespace OpenViBE {
namespace SSVEP {
class CSSVEPFlickeringObject
{
public:
CSSVEPFlickeringObject(Ogre::SceneNode* objectNode, size_t litFrames, size_t darkFrames)
: m_objectNode(objectNode), m_litFrames(litFrames), m_darkFrames(darkFrames) {}
virtual ~CSSVEPFlickeringObject() {}
virtual void setVisible(bool visibility);
virtual void processFrame();
protected:
Ogre::SceneNode* m_objectNode = nullptr;
size_t m_currentFrame = 0;
size_t m_litFrames = 0;
size_t m_darkFrames = 0;
private:
bool m_visible = true;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,53 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepCVRPNServer.h"
#include "ovassvepCApplication.h"
#include <vrpn_Connection.h>
#include <vrpn_Button.h>
namespace OpenViBE {
namespace SSVEP {
CVRPNServer* CVRPNServer::m_vrpnServerInstance = nullptr;
CApplication* CVRPNServer::m_application = nullptr;
CVRPNServer::CVRPNServer(CApplication* application)
{
m_application = application;
const int port = int(m_application->getConfigurationManager()->expandAsInteger("${VRPN_ExternalServerPort}"));
m_application->getLogManager() << Kernel::LogLevel_Debug << "VRPN SERVER PORT :" << port << "\n";
m_connection = vrpn_create_server_connection(port);
}
CVRPNServer* CVRPNServer::getInstance(CApplication* application)
{
if (m_vrpnServerInstance == nullptr) { m_vrpnServerInstance = new CVRPNServer(application); }
return m_vrpnServerInstance;
}
void CVRPNServer::addButton(const CString& name, const int buttonCount)
{
m_buttonServer.insert(
std::pair<std::string, vrpn_Button_Server*>(name.toASCIIString(), new vrpn_Button_Server(name.toASCIIString(), m_connection, buttonCount)));
m_buttonCache[name.toASCIIString()].clear();
m_buttonCache[name.toASCIIString()].resize(buttonCount);
}
void CVRPNServer::processFrame()
{
for (auto& it : m_buttonServer) { it.second->mainloop(); }
m_connection->mainloop();
}
void CVRPNServer::changeButtonState(const std::string& name, const int index, const int state)
{
m_buttonServer[name]->set_button(index, state);
m_buttonCache[name][index] = state;
}
} // namespace SSVEP
} // namespace OpenViBE
#endif
@@ -0,0 +1,39 @@
#pragma once
#include <openvibe/ov_all.h>
#include <toolkit/ovtk_all.h>
#include <map>
#include <vector>
#include <string>
class vrpn_Connection;
class vrpn_Button_Server;
namespace OpenViBE {
namespace SSVEP {
class CApplication;
class CVRPNServer
{
public:
static CVRPNServer* getInstance(CApplication* application);
~CVRPNServer() = default;
void processFrame();
void addButton(const CString& name, int buttonCount);
void changeButtonState(const std::string& name, int index, int state);
int getButtonState(const std::string& name, const int index) { return m_buttonCache[name][index]; }
private:
static CVRPNServer* m_vrpnServerInstance;
static CApplication* m_application;
explicit CVRPNServer(CApplication* application);
vrpn_Connection* m_connection = nullptr;
std::map<std::string, vrpn_Button_Server*> m_buttonServer;
std::map<std::string, std::vector<int>> m_buttonCache;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,21 @@
#pragma once
#include <openvibe/ov_all.h>
#include <toolkit/ovtk_all.h>
namespace OpenViBE {
namespace SSVEP {
class CApplication;
class ICommand
{
public:
explicit ICommand(CApplication* application) : m_application(application) {}
virtual ~ICommand() { }
virtual void processFrame() = 0;
protected:
CApplication* m_application = nullptr;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,77 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepICommandOIS.h"
#include "ovassvepCApplication.h"
namespace OpenViBE {
namespace SSVEP {
OIS::InputManager* ICommandOIS::m_inputManager = nullptr;
OIS::Keyboard* ICommandOIS::m_keyboard = nullptr;
int ICommandOIS::m_nInstance = 0;
std::vector<ICommandOIS*> ICommandOIS::m_instances;
ICommandOIS::ICommandOIS(CApplication* application) : ICommand(application)
{
if (m_keyboard == nullptr)
{
OIS::ParamList paramList;
std::ostringstream windowHandleString;
size_t windowHandle;
m_application->getWindow()->getCustomAttribute("WINDOW", &windowHandle);
windowHandleString << windowHandle;
paramList.insert(std::make_pair(std::string("WINDOW"), windowHandleString.str()));
paramList.insert(std::make_pair(std::string("x11_keyboard_grab"), "false"));
m_inputManager = OIS::InputManager::createInputSystem(paramList);
m_keyboard = dynamic_cast<OIS::Keyboard*>(m_inputManager->createInputObject(OIS::OISKeyboard, true));
m_keyboard->setEventCallback(this);
}
m_nInstance++;
m_instances.push_back(this);
}
ICommandOIS::~ICommandOIS()
{
--m_nInstance;
if (m_nInstance == 0)
{
if (m_inputManager != nullptr)
{
if (m_keyboard != nullptr)
{
m_application->getLogManager() << Kernel::LogLevel_Debug << "- destroy m_keyboard\n";
m_inputManager->destroyInputObject(m_keyboard);
m_keyboard = nullptr;
}
m_inputManager->destroyInputSystem(m_inputManager);
}
}
}
bool ICommandOIS::keyPressed(const OIS::KeyEvent& event)
{
for (size_t i = 0; i < m_instances.size(); ++i) { m_instances[i]->receiveKeyPressedEvent(event.key); }
return true;
}
bool ICommandOIS::keyReleased(const OIS::KeyEvent& event)
{
for (size_t i = 0; i < m_instances.size(); ++i) { m_instances[i]->receiveKeyReleasedEvent(event.key); }
return true;
}
} // namespace SSVEP
} // namespace OpenViBE
#endif
@@ -0,0 +1,35 @@
#pragma once
#include <vector>
#include <OIS.h>
#include <OISKeyboard.h>
#include "ovassvepICommand.h"
namespace OpenViBE {
namespace SSVEP {
class ICommandOIS : public ICommand, OIS::KeyListener
{
static std::vector<ICommandOIS*> m_instances;
static int m_nInstance;
protected:
static OIS::InputManager* m_inputManager;
static OIS::Keyboard* m_keyboard;
public:
explicit ICommandOIS(CApplication* application);
~ICommandOIS() override;
void processFrame() override { m_keyboard->capture(); }
protected:
virtual void receiveKeyPressedEvent(OIS::KeyCode key) = 0;
virtual void receiveKeyReleasedEvent(OIS::KeyCode key) = 0;
private:
bool keyPressed(const OIS::KeyEvent& event) override;
bool keyReleased(const OIS::KeyEvent& event) override;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,39 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvepICommandVRPNButton.h"
#include "ovassvepCApplication.h"
#include <vrpn_Connection.h>
#include <vrpn_Button.h>
namespace OpenViBE {
namespace SSVEP {
static void VRPN_CALLBACK ssvep_vrpn_callback_button(void* command, const vrpn_BUTTONCB button)
{
static_cast<ICommandVRPNButton*>(command)->execute(button.button, button.state);
}
ICommandVRPNButton::ICommandVRPNButton(CApplication* application, const CString& name)
: ICommand(application)
{
Kernel::IConfigurationManager* configManager = application->getConfigurationManager();
const std::string buttonName = std::string(name.toASCIIString()) + "@" + (configManager->expand("${SSVEP_VRPNHost}")).toASCIIString();
m_application->getLogManager() << Kernel::LogLevel_Debug << "+ m_vrpnButton = new vrpn_Button_Remote(" << buttonName << ")\n";
m_vrpnButton = new vrpn_Button_Remote(buttonName.c_str());
m_vrpnButton->register_change_handler(static_cast<void*>(this), ssvep_vrpn_callback_button);
}
ICommandVRPNButton::~ICommandVRPNButton()
{
m_application->getLogManager() << Kernel::LogLevel_Debug << "- delete m_vrpnButton\n";
delete m_vrpnButton;
}
void ICommandVRPNButton::processFrame() { m_vrpnButton->mainloop(); }
} // namespace SSVEP
} // namespace OpenViBE
#endif
@@ -0,0 +1,22 @@
#pragma once
#include "ovassvepICommand.h"
class vrpn_Button_Remote;
namespace OpenViBE {
namespace SSVEP {
class ICommandVRPNButton : public ICommand
{
public:
ICommandVRPNButton(CApplication* application, const CString& name);
~ICommandVRPNButton() override;
void processFrame() override;
virtual void execute(const int button, const int state) = 0;
protected:
vrpn_Button_Remote* m_vrpnButton = nullptr;
};
} // namespace SSVEP
} // namespace OpenViBE
@@ -0,0 +1,126 @@
#if defined(TARGET_HAS_ThirdPartyOgre3D)
#include "ovassvep_defines.h"
#include <openvibe/ov_all.h>
#include <toolkit/ovtk_all.h>
#include "ovassvepCApplication.h"
#include "Trainer/ovassvepCTrainerApplication.h"
#include "Shooter/ovassvepCShooterApplication.h"
int main(const int argc, char** argv)
{
if (argc != 2)
{
std::cout << "Usage: " << argv[0] << " [trainer|shooter]\n";
exit(1);
}
// initialize the OpenViBE kernel
OpenViBE::CKernelLoader kernelLoader;
OpenViBE::Kernel::IKernelDesc* kernelDesc = nullptr;
OpenViBE::CString error;
#if defined TARGET_OS_Windows
const OpenViBE::CString kernelFile = OpenViBE::Directories::getLibDir() + "/openvibe-kernel.dll";
#else
const OpenViBE::CString kernelFile = OpenViBE::Directories::getLibDir() + "/libopenvibe-kernel.so";
#endif
if (!kernelLoader.load(kernelFile, &error))
{
std::cout << "[ FAILED ] Error loading kernel (" << error << ")" << " from [" << kernelFile << "]\n";
return (1);
}
std::cout << "[ INF ] Kernel module loaded, trying to get kernel descriptor\n";
kernelLoader.initialize();
kernelLoader.getKernelDesc(kernelDesc);
if (!kernelDesc)
{
std::cout << "[ FAILED ] No kernel descriptor\n";
return (1);
}
std::cout << "[ INF ] Got kernel descriptor, trying to create kernel\n";
OpenViBE::Kernel::IKernelContext* kernelContext = kernelDesc->createKernel("ssvep-demo", OpenViBE::Directories::getDataDir() + "/kernel/openvibe.conf");
if (!kernelContext)
{
std::cout << "[ FAILED ] No kernel created by kernel descriptor\n";
return (1);
}
kernelContext->initialize();
OpenViBE::Toolkit::initialize(*kernelContext);
OpenViBE::Kernel::IConfigurationManager* configManager = &(kernelContext->getConfigurationManager());
configManager->createConfigurationToken("SSVEP_ApplicationDescriptor", OpenViBE::CString(argv[1]));
const OpenViBE::CString configFile = configManager->expand("${Path_Data}/applications/ssvep-demo/openvibe-ssvep-demo.conf");
configManager->addConfigurationFromFile(configFile);
OpenViBE::Kernel::ILogManager* logManager = &(kernelContext->getLogManager());
if (configManager->expand("$Env{OGRE_HOME}").length() == 0)
{
std::cout << "Error: OGRE_HOME environment variable is not set, this likely will not work.\n";
// Don't exit as we don't have any way to get the return value seen in designer
}
// We need this to address BuildType no longer in SDK 2.0
#if defined(DEBUG)
configManager->addOrReplaceConfigurationToken("BuildType", "Debug");
#else
configManager->addOrReplaceConfigurationToken("BuildType", "Release");
#endif
OpenViBE::SSVEP::CApplication* app;
const OpenViBE::CString applicationType = configManager->expand("${SSVEP_ApplicationType}");
(*logManager) << OpenViBE::Kernel::LogLevel_Info << "Selected Application : '" << applicationType.toASCIIString() << "'\n";
if (applicationType == OpenViBE::CString("trainer"))
{
(*logManager) << OpenViBE::Kernel::LogLevel_Debug << "+ app = new SSVEP::CTrainerApplication(...)\n";
app = new OpenViBE::SSVEP::CTrainerApplication();
}
else if (applicationType == OpenViBE::CString("shooter"))
{
(*logManager) << OpenViBE::Kernel::LogLevel_Debug << "+ app = new SSVEP::CShooterApplication(...)\n";
app = new OpenViBE::SSVEP::CShooterApplication();
}
else
{
(*logManager) << OpenViBE::Kernel::LogLevel_Error << "Wrong application identifier specified: '" << applicationType << "'\n";
return 1;
}
if (!app->setup(kernelContext))
{
std::cout << "Aborting\n";
delete app;
return -1;
}
app->go();
(*logManager) << OpenViBE::Kernel::LogLevel_Debug << "- app\n";
delete app;
return 0;
}
#else
#include <stdio.h>
int main(int argc, char** argv)
{
std::cout << "SSVEP demo has not been compiled as it depends on Ogre (missing/disabled)\n";
return -1;
}
#endif