init
This commit is contained in:
@@ -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/)
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
|
||||
The scenario will record its configuration here.
|
||||
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
|
||||
The scenario will record its configuration here.
|
||||
|
||||
+9
@@ -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>
|
||||
+5
@@ -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>
|
||||
+9
@@ -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>
|
||||
+43
@@ -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
|
||||
+62
@@ -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
|
||||
+132
@@ -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
|
||||
+33
@@ -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
|
||||
+35
@@ -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
|
||||
+46
@@ -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
|
||||
+66
@@ -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
|
||||
|
||||
+21
@@ -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
|
||||
+176
@@ -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
|
||||
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
|
||||
The scenario will record its signals here.
|
||||
|
||||
+852
@@ -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><b><big>Acquisition test</big></b>
|
||||
|
||||
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 <b>F1</b></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é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>
|
||||
+453
@@ -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><big><b>Peripheral Settings</b></big>
|
||||
|
||||
Settings in this box must match your hardware configuration.
|
||||
Currently, the only supported setting is the screen refresh rate.
|
||||
|
||||
<b>Screen Refresh Rate : </b> The refresh rate of your screen,
|
||||
refer to your screen's user manual to find this value.
|
||||
|
||||
<span color="red">Important notice</span>
|
||||
|
||||
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><big><b>Scenario description</b></big>
|
||||
|
||||
<b><span color="red">This scenario must be run at least once before
|
||||
running any further SSVEP scenarios</span></b>
|
||||
|
||||
This is a scenario where you can configure your SSVEP experiment. There
|
||||
are two boxes containing configuration parameters:
|
||||
|
||||
<b>Peripheral Settings</b>
|
||||
|
||||
<b>Experiment Settings</b>
|
||||
|
||||
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> <b><span color="#2060ff">Configurable box</span></b>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</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><big><b>Experiment Settings</b></big>
|
||||
|
||||
Settings concerning the SSVEP experiment in general.
|
||||
|
||||
<b>Target Light Color</b> and <b>Target Dark Color</b> 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.
|
||||
|
||||
<b>Stimulation Frequencies</b> A comma separated list of
|
||||
frequencies used for the stimulation. Refer to the documentation
|
||||
for more details.
|
||||
|
||||
<b>Processing Epoch Duration</b> 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.
|
||||
|
||||
<b>Processing Epoch Interval</b> The speed interval between slices of the
|
||||
signal.
|
||||
|
||||
<b>Processing Frequency Tolerance</b> 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> <b><span color="#2060ff">Configurable box</span></b>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</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>
|
||||
+1836
File diff suppressed because it is too large
Load Diff
+3088
File diff suppressed because it is too large
Load Diff
+6521
File diff suppressed because it is too large
Load Diff
+4673
File diff suppressed because it is too large
Load Diff
+43
@@ -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}}
|
||||
|
||||
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
material BasicSurface/Diffuse
|
||||
{
|
||||
technique
|
||||
{
|
||||
pass { lighting off }
|
||||
}
|
||||
}
|
||||
+245
@@ -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>
|
||||
+4154
File diff suppressed because it is too large
Load Diff
+54
@@ -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>
|
||||
+53
@@ -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>
|
||||
+245
@@ -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>
|
||||
+4812
File diff suppressed because it is too large
Load Diff
BIN
Binary file not shown.
|
After Width: | Height: | Size: 256 KiB |
BIN
Binary file not shown.
+2
@@ -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" />
|
||||
+2
@@ -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" />
|
||||
+2
@@ -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"/>
|
||||
+2
@@ -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"/>
|
||||
+2
@@ -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"/>
|
||||
+2
@@ -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"/>
|
||||
+2
@@ -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" />
|
||||
+2
@@ -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" />
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
@@ -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
|
||||
BIN
Binary file not shown.
+32
@@ -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
|
||||
+18
@@ -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
|
||||
+44
@@ -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
|
||||
+23
@@ -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
|
||||
+114
@@ -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
|
||||
+33
@@ -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
|
||||
+57
@@ -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
|
||||
+29
@@ -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
|
||||
+152
@@ -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
|
||||
+39
@@ -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
|
||||
+19
@@ -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
|
||||
+125
@@ -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
|
||||
+36
@@ -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
|
||||
+91
@@ -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
|
||||
+40
@@ -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
|
||||
+286
@@ -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
|
||||
+87
@@ -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
|
||||
+162
@@ -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
|
||||
+47
@@ -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
|
||||
+54
@@ -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
|
||||
+24
@@ -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
|
||||
+43
@@ -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
|
||||
+16
@@ -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
|
||||
+26
@@ -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
|
||||
+30
@@ -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
|
||||
+53
@@ -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
|
||||
+39
@@ -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
|
||||
+21
@@ -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
|
||||
+77
@@ -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
|
||||
+35
@@ -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
|
||||
+39
@@ -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
|
||||
+22
@@ -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
|
||||
+1
@@ -0,0 +1 @@
|
||||
#pragma once
|
||||
+126
@@ -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
|
||||
Reference in New Issue
Block a user