diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 1ccdd4f04e..cfee18941c 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -43,8 +43,7 @@ int hifiSockAddrMeta = qRegisterMetaType("HifiSockAddr"); AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QString assignmentPool, QUuid walletUUID, QString assignmentServerHostname, quint16 assignmentServerPort, quint16 assignmentMonitorPort) : - _assignmentServerHostname(DEFAULT_ASSIGNMENT_SERVER_HOSTNAME), - _localASPortSharedMem(NULL) + _assignmentServerHostname(DEFAULT_ASSIGNMENT_SERVER_HOSTNAME) { LogUtils::init(); @@ -181,8 +180,7 @@ void AssignmentClient::sendAssignmentRequest() { if (_assignmentServerHostname == "localhost") { // we want to check again for the local domain-server port in case the DS has restarted quint16 localAssignmentServerPort; - if (nodeList->getLocalServerPortFromSharedMemory(DOMAIN_SERVER_LOCAL_PORT_SMEM_KEY, _localASPortSharedMem, - localAssignmentServerPort)) { + if (nodeList->getLocalServerPortFromSharedMemory(DOMAIN_SERVER_LOCAL_PORT_SMEM_KEY, localAssignmentServerPort)) { if (localAssignmentServerPort != _assignmentServerSocket.getPort()) { qDebug() << "Port for local assignment server read from shared memory is" << localAssignmentServerPort; @@ -190,7 +188,11 @@ void AssignmentClient::sendAssignmentRequest() { _assignmentServerSocket.setPort(localAssignmentServerPort); nodeList->setAssignmentServerSocket(_assignmentServerSocket); } + } else { + qDebug() << "Failed to read local assignment server port from shared memory" + << "- will send assignment request to previous assignment server socket."; } + } nodeList->sendAssignment(_requestAssignment); diff --git a/assignment-client/src/AssignmentClient.h b/assignment-client/src/AssignmentClient.h index 38d5351385..60e81a94eb 100644 --- a/assignment-client/src/AssignmentClient.h +++ b/assignment-client/src/AssignmentClient.h @@ -44,7 +44,6 @@ private: QPointer _currentAssignment; QString _assignmentServerHostname; HifiSockAddr _assignmentServerSocket; - QSharedMemory* _localASPortSharedMem; // memory shared with domain server QTimer _requestTimer; // timer for requesting and assignment QTimer _statsTimerACM; // timer for sending stats to assignment client monitor diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index 60f541c10b..e02fa22246 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -1,531 +1,549 @@ -[ - { - "name": "metaverse", - "label": "Metaverse / Networking", - "settings": [ - { - "name": "access_token", - "label": "Access Token", - "help": "This is your OAuth access token to connect this domain-server with your High Fidelity account.
It can be generated by clicking the 'Connect Account' button above.
You can also go to the My Security page of your account and generate a token with the 'domains' scope and paste it here.", - "advanced": true - }, - { - "name": "id", - "label": "Domain ID", - "help": "This is your High Fidelity domain ID. If you do not want your domain to be registered in the High Fidelity metaverse you can leave this blank." - }, - { - "name": "automatic_networking", - "label": "Automatic Networking", - "help": "This defines how other nodes in the High Fidelity metaverse will be able to reach your domain-server.
If you don't want to deal with any network settings, use full automatic networking.", - "default": "disabled", - "type": "select", - "options": [ - { - "value": "full", - "label": "Full: update both the IP address and port to reach my server" - }, - { - "value": "ip", - "label": "IP Only: update just my IP address, I will open the port manually" - }, - { - "value": "disabled", - "label": "None: use the network information I have entered for this domain at metaverse.highfidelity.com" - } - ] - }, - { - "name": "local_port", - "label": "Local UDP Port", - "help": "This is the local port your domain-server binds to for UDP connections.
Depending on your router, this may need to be changed to run multiple full automatic networking domain-servers in the same network.", - "default": "40102", - "type": "int", - "advanced": true - } - ] - }, - { - "label": "Places / Paths", - "html_id": "places_paths", - "settings": [ - { - "name": "paths", - "label": "Paths", - "help": "Clients can enter a path to reach an exact viewpoint in your domain.
Add rows to the table below to map a path to a viewpoint.
The index path ( / ) is where clients will enter if they do not enter an explicit path.", - "type": "table", - "key": { - "name": "path", - "label": "Path", - "placeholder": "/" +{ + "version": 1.0, + "settings": [ + { + "name": "metaverse", + "label": "Metaverse / Networking", + "settings": [ + { + "name": "access_token", + "label": "Access Token", + "help": "This is your OAuth access token to connect this domain-server with your High Fidelity account.
It can be generated by clicking the 'Connect Account' button above.
You can also go to the My Security page of your account and generate a token with the 'domains' scope and paste it here.", + "advanced": true }, - "columns": [ - { - "name": "viewpoint", - "label": "Viewpoint", - "placeholder": "/512,512,512" - } - ] - } - ] - }, - { - "name": "security", - "label": "Security", - "settings": [ - { - "name": "http_username", - "label": "HTTP Username", - "help": "Username used for basic HTTP authentication." - }, - { - "name": "http_password", - "label": "HTTP Password", - "type": "password", - "help": "Password used for basic HTTP authentication. Leave this blank if you do not want to change it.", - "value-hidden": true - }, - { - "name": "allowed_users", - "type": "table", - "label": "Allowed Users", - "help": "List the High Fidelity names for people you want to be able to connect to this domain.
An empty list means everyone.
You can always connect from the domain-server machine.", - "numbered": false, - "columns": [ - { - "name": "username", - "label": "Username", - "can_set": true - } - ] - }, - { - "name": "maximum_user_capacity", - "label": "Maximum User Capacity", - "help": "The limit on how many avatars can be connected at once. 0 means no limit.", - "placeholder": "0", - "default": "0", - "advanced": false - }, - { - "name": "allowed_editors", - "type": "table", - "label": "Allowed Editors", - "help": "List the High Fidelity names for people you want to be able lock or unlock entities in this domain.
An empty list means everyone.", - "numbered": false, - "columns": [ - { - "name": "username", - "label": "Username", - "can_set": true - } - ] - }, - { - "name": "editors_are_rezzers", - "type": "checkbox", - "label": "Only editors can create new entities", - "help": "When checked, only those who can edit the domain can create new entites.", - "default": false - } - ] - }, - { - "name": "scripts", - "label": "Scripts", - "settings": [ - { - "name": "persistent_scripts", - "type": "table", - "label": "Persistent Scripts", - "help": "Add the URLs for scripts that you would like to ensure are always running in your domain.", - "columns": [ - { - "name": "url", - "label": "Script URL" - }, - { - "name": "num_instances", - "label": "# instances", - "default": 1 - }, - { - "name": "pool", - "label": "Pool" - } - ] - } - ] - }, - { - "name": "audio_env", - "label": "Audio Environment", - "assignment-types": [0], - "settings": [ - { - "name": "attenuation_per_doubling_in_distance", - "label": "Default Domain Attenuation", - "help": "Factor between 0 and 1.0 (0: No attenuation, 1.0: extreme attenuation)", - "placeholder": "0.18", - "default": "0.18", - "advanced": false - }, - { - "name": "noise_muting_threshold", - "label": "Noise Muting Threshold", - "help": "Loudness value for noise background between 0 and 1.0 (0: mute everyone, 1.0: never mute)", - "placeholder": "0.003", - "default": "0.003", - "advanced": false - }, - { - "name": "enable_filter", - "type": "checkbox", - "help": "positional audio stream uses lowpass filter", - "default": true - }, - { - "name": "zones", - "type": "table", - "label": "Zones", - "help": "In this table you can define a set of zones in which you can specify various audio properties.", - "numbered": false, - "key": { - "name": "name", - "label": "Name", - "placeholder": "Zone_Name" + { + "name": "id", + "label": "Domain ID", + "help": "This is your High Fidelity domain ID. If you do not want your domain to be registered in the High Fidelity metaverse you can leave this blank." }, - "columns": [ - { - "name": "x_range", - "label": "X range", - "can_set": true, - "placeholder": "0-16384" + { + "name": "automatic_networking", + "label": "Automatic Networking", + "help": "This defines how other nodes in the High Fidelity metaverse will be able to reach your domain-server.
If you don't want to deal with any network settings, use full automatic networking.", + "default": "disabled", + "type": "select", + "options": [ + { + "value": "full", + "label": "Full: update both the IP address and port to reach my server" + }, + { + "value": "ip", + "label": "IP Only: update just my IP address, I will open the port manually" + }, + { + "value": "disabled", + "label": "None: use the network information I have entered for this domain at metaverse.highfidelity.com" + } + ] + }, + { + "name": "local_port", + "label": "Local UDP Port", + "help": "This is the local port your domain-server binds to for UDP connections.
Depending on your router, this may need to be changed to run multiple full automatic networking domain-servers in the same network.", + "default": "40102", + "type": "int", + "advanced": true + } + ] + }, + { + "label": "Places / Paths", + "html_id": "places_paths", + "settings": [ + { + "name": "paths", + "label": "Paths", + "help": "Clients can enter a path to reach an exact viewpoint in your domain.
Add rows to the table below to map a path to a viewpoint.
The index path ( / ) is where clients will enter if they do not enter an explicit path.", + "type": "table", + "key": { + "name": "path", + "label": "Path", + "placeholder": "/" }, - { - "name": "y_range", - "label": "Y range", - "can_set": true, - "placeholder": "0-16384" - }, - { - "name": "z_range", - "label": "Z range", - "can_set": true, - "placeholder": "0-16384" - } - ] - }, - { - "name": "attenuation_coefficients", - "type": "table", - "label": "Attenuation Coefficients", - "help": "In this table you can set custom attenuation coefficients between audio zones", - "numbered": true, - "can_order": true, - "columns": [ - { - "name": "source", - "label": "Source", - "can_set": true, - "placeholder": "Zone_A" - }, - { - "name": "listener", - "label": "Listener", - "can_set": true, - "placeholder": "Zone_B" - }, - { - "name": "coefficient", - "label": "Attenuation coefficient", - "can_set": true, - "placeholder": "0.18" - } - ] - }, - { - "name": "reverb", - "type": "table", - "label": "Reverb Settings", - "help": "In this table you can set reverb levels for audio zones. For a medium-sized (e.g., 100 square meter) meeting room, try a decay time of around 1.5 seconds and a wet level of -10 db. For an airplane hangar or cathedral, try a decay time of 4 seconds and a wet level of -5 db.", - "numbered": true, - "columns": [ - { - "name": "zone", - "label": "Zone", - "can_set": true, - "placeholder": "Audio_Zone" - }, - { - "name": "reverb_time", - "label": "Reverb Decay Time", - "can_set": true, - "placeholder": "(in sec)" - }, - { - "name": "wet_level", - "label": "Wet Level", - "can_set": true, - "placeholder": "(in db)" - } - ] - } - ] - }, - { - "name": "audio_buffer", - "label": "Audio Buffers", - "assignment-types": [0], - "settings": [ - { - "name": "dynamic_jitter_buffer", - "type": "checkbox", - "label": "Dynamic Jitter Buffers", - "help": "dynamically buffer client audio based on perceived jitter in packet receipt timing", - "default": false, - "advanced": true - }, - { - "name": "static_desired_jitter_buffer_frames", - "label": "Static Desired Jitter Buffer Frames", - "help": "If dynamic jitter buffers is disabled, this determines the target number of frames maintained by the AudioMixer's jitter buffers", - "placeholder": "1", - "default": "1", - "advanced": true - }, - { - "name": "max_frames_over_desired", - "label": "Max Frames Over Desired", - "help": "The highest number of frames an AudioMixer's ringbuffer can exceed the desired jitter buffer frames by", - "placeholder": "10", - "default": "10", - "advanced": true - }, - { - "name": "use_stdev_for_desired_calc", - "type": "checkbox", - "label": "Use Stdev for Desired Jitter Frames Calc:", - "help": "use Philip's method (stdev of timegaps) to calculate desired jitter frames (otherwise Fred's max timegap method is used)", - "default": false, - "advanced": true - }, - { - "name": "window_starve_threshold", - "label": "Window Starve Threshold", - "help": "If this many starves occur in an N-second window (N is the number in the next field), then the desired jitter frames will be re-evaluated using Window A.", - "placeholder": "3", - "default": "3", - "advanced": true - }, - { - "name": "window_seconds_for_desired_calc_on_too_many_starves", - "label": "Timegaps Window (A) Seconds:", - "help": "Window A contains a history of timegaps. Its max timegap is used to re-evaluate the desired jitter frames when too many starves occur within it.", - "placeholder": "50", - "default": "50", - "advanced": true - }, - { - "name": "window_seconds_for_desired_reduction", - "label": "Timegaps Window (B) Seconds:", - "help": "Window B contains a history of timegaps. Its max timegap is used as a ceiling for the desired jitter frames value.", - "placeholder": "10", - "default": "10", - "advanced": true - }, - { - "name": "repetition_with_fade", - "type": "checkbox", - "label": "Repetition with Fade:", - "help": "dropped frames and mixing during starves repeat the last frame, eventually fading to silence", - "default": false, - "advanced": true - }, - { - "name": "print_stream_stats", - "type": "checkbox", - "label": "Print Stream Stats:", - "help": "audio upstream and downstream stats of each agent printed to audio-mixer stdout", - "default": false, - "advanced": true - } - ] - }, - { - "name": "entity_server_settings", - "label": "Entity Server Settings", - "assignment-types": [6], - "settings": [ - { - "name": "persistFilename", - "label": "Entities Filename", - "help": "the path to the file entities are stored in. Make sure the path exists.", - "placeholder": "resources/models.svo", - "default": "resources/models.svo", - "advanced": true - }, - { - "name": "persistAsFileType", - "label": "File format for entity server's persistent data", - "help": "This defines how the entity server will save entities to disk.", - "default": "svo", - "type": "select", - "options": [ - { - "value": "svo", - "label": "Entity server persists data as SVO" - }, - { - "value": "json", - "label": "Entity server persists data as JSON" - } - ], - "advanced": true - }, - { - "name": "persistInterval", - "label": "Save Check Interval", - "help": "Milliseconds between checks for saving the current state of entities.", - "placeholder": "30000", - "default": "30000", - "advanced": true - }, - { - "name": "backups", - "type": "table", - "label": "Backup Rules", - "help": "In this table you can define a set of rules for how frequently to backup copies of your entites content file.", - "numbered": false, - "default": [ - {"Name":"Half Hourly Rolling","backupInterval":1800,"format":".backup.halfhourly.%N","maxBackupVersions":5}, - {"Name":"Daily Rolling","backupInterval":86400,"format":".backup.daily.%N","maxBackupVersions":7}, - {"Name":"Weekly Rolling","backupInterval":604800,"format":".backup.weekly.%N","maxBackupVersions":4}, - {"Name":"Thirty Day Rolling","backupInterval":2592000,"format":".backup.thirtyday.%N","maxBackupVersions":12} - ], - "columns": [ - { - "name": "Name", + "columns": [ + { + "name": "viewpoint", + "label": "Viewpoint", + "placeholder": "/512,512,512" + } + ] + } + ] + }, + { + "name": "security", + "label": "Security", + "settings": [ + { + "name": "http_username", + "label": "HTTP Username", + "help": "Username used for basic HTTP authentication." + }, + { + "name": "http_password", + "label": "HTTP Password", + "type": "password", + "help": "Password used for basic HTTP authentication. Leave this blank if you do not want to change it.", + "value-hidden": true + }, + { + "name": "restricted_access", + "type": "checkbox", + "label": "Restricted Access", + "default": false, + "help": "Only users listed in \"Allowed Users\" can enter your domain." + }, + { + "name": "allowed_users", + "type": "table", + "label": "Allowed Users", + "help": "You can always connect from the domain-server machine.", + "numbered": false, + "columns": [ + { + "name": "username", + "label": "Username", + "can_set": true + } + ] + }, + { + "name": "maximum_user_capacity", + "label": "Maximum User Capacity", + "help": "The limit on how many avatars can be connected at once. 0 means no limit.", + "placeholder": "0", + "default": "0", + "advanced": false + }, + { + "name": "allowed_editors", + "type": "table", + "label": "Allowed Editors", + "help": "List the High Fidelity names for people you want to be able lock or unlock entities in this domain.
An empty list means everyone.", + "numbered": false, + "columns": [ + { + "name": "username", + "label": "Username", + "can_set": true + } + ] + }, + { + "name": "editors_are_rezzers", + "type": "checkbox", + "label": "Only Editors Can Create Entities", + "help": "Only users listed in \"Allowed Editors\" can create new entites.", + "default": false + } + ] + }, + { + "name": "scripts", + "label": "Scripts", + "settings": [ + { + "name": "persistent_scripts", + "type": "table", + "label": "Persistent Scripts", + "help": "Add the URLs for scripts that you would like to ensure are always running in your domain.", + "columns": [ + { + "name": "url", + "label": "Script URL" + }, + { + "name": "num_instances", + "label": "# instances", + "default": 1 + }, + { + "name": "pool", + "label": "Pool" + } + ] + } + ] + }, + { + "name": "audio_env", + "label": "Audio Environment", + "assignment-types": [0], + "settings": [ + { + "name": "attenuation_per_doubling_in_distance", + "label": "Default Domain Attenuation", + "help": "Factor between 0 and 1.0 (0: No attenuation, 1.0: extreme attenuation)", + "placeholder": "0.18", + "default": "0.18", + "advanced": false + }, + { + "name": "noise_muting_threshold", + "label": "Noise Muting Threshold", + "help": "Loudness value for noise background between 0 and 1.0 (0: mute everyone, 1.0: never mute)", + "placeholder": "0.003", + "default": "0.003", + "advanced": false + }, + { + "name": "enable_filter", + "label": "Low-pass Filter", + "type": "checkbox", + "help": "Positional audio stream uses low-pass filter", + "default": true + }, + { + "name": "zones", + "type": "table", + "label": "Zones", + "help": "In this table you can define a set of zones in which you can specify various audio properties.", + "numbered": false, + "key": { + "name": "name", "label": "Name", - "can_set": true, - "placeholder": "Example", - "default": "Example" + "placeholder": "Zone_Name" }, - { - "name": "format", - "label": "Rule Format", - "can_set": true, - "help": "Format used to create the extension for the backup of your persisted entities. Use a format with %N to get rolling. Or use date formatting like %Y-%m-%d.%H:%M:%S.%z", - "placeholder": ".backup.example.%N", - "default": ".backup.example.%N" - }, - { - "name": "backupInterval", - "label": "Backup Interval in Seconds", - "help": "Interval between backup checks in seconds.", - "placeholder": 1800, - "default": 1800, - "can_set": true - }, - { - "name": "maxBackupVersions", - "label": "Max Rolled Backup Versions", - "help": "If your backup extension format uses 'rolling', how many versions do you want us to keep?", - "placeholder": 5, - "default": 5, - "can_set": true - } - ] - }, - { - "name": "NoPersist", - "type": "checkbox", - "help": "Don't persist your entities to a file.", - "default": false, - "advanced": true - }, - { - "name": "NoBackup", - "type": "checkbox", - "help": "Don't regularly backup your persisted entities to a backup file.", - "default": false, - "advanced": true - }, - { - "name": "statusHost", - "label": "Status Hostname", - "help": "host name or IP address of the server for accessing the status page", - "placeholder": "", - "default": "", - "advanced": true - }, - { - "name": "statusPort", - "label": "Status Port", - "help": "port of the server for accessing the status page", - "placeholder": "", - "default": "", - "advanced": true - }, - { - "name": "wantEditLogging", - "type": "checkbox", - "help": "Logging of all edits to entities", - "default": true, - "advanced": true - }, - { - "name": "verboseDebug", - "type": "checkbox", - "help": "lots of debugging", - "default": false, - "advanced": true - }, - { - "name": "debugReceiving", - "type": "checkbox", - "help": "extra debugging on receiving", - "default": false, - "advanced": true - }, - { - "name": "debugSending", - "type": "checkbox", - "help": "extra debugging on sending", - "default": false, - "advanced": true - }, - { - "name": "debugTimestampNow", - "type": "checkbox", - "help": "extra debugging for usecTimestampNow() function", - "default": false, - "advanced": true - }, - { - "name": "clockSkew", - "label": "Clock Skew", - "help": "Number of msecs to skew the server clock by to test clock skew", - "placeholder": "0", - "default": "0", - "advanced": true - } - ] - }, - { - "name": "avatar_mixer", - "label": "Avatar Mixer", - "assignment-types": [1], - "settings": [ - { - "name": "max_node_send_bandwidth", - "type": "double", - "label": "Per-Node Bandwidth", - "help": "Desired maximum send bandwidth (in Megabits per second) to each node", - "placeholder": 1.0, - "default": 1.0, - "advanced": true - } - ] - } -] + "columns": [ + { + "name": "x_range", + "label": "X range", + "can_set": true, + "placeholder": "0-16384" + }, + { + "name": "y_range", + "label": "Y range", + "can_set": true, + "placeholder": "0-16384" + }, + { + "name": "z_range", + "label": "Z range", + "can_set": true, + "placeholder": "0-16384" + } + ] + }, + { + "name": "attenuation_coefficients", + "type": "table", + "label": "Attenuation Coefficients", + "help": "In this table you can set custom attenuation coefficients between audio zones", + "numbered": true, + "can_order": true, + "columns": [ + { + "name": "source", + "label": "Source", + "can_set": true, + "placeholder": "Zone_A" + }, + { + "name": "listener", + "label": "Listener", + "can_set": true, + "placeholder": "Zone_B" + }, + { + "name": "coefficient", + "label": "Attenuation coefficient", + "can_set": true, + "placeholder": "0.18" + } + ] + }, + { + "name": "reverb", + "type": "table", + "label": "Reverb Settings", + "help": "In this table you can set reverb levels for audio zones. For a medium-sized (e.g., 100 square meter) meeting room, try a decay time of around 1.5 seconds and a wet level of -10 db. For an airplane hangar or cathedral, try a decay time of 4 seconds and a wet level of -5 db.", + "numbered": true, + "columns": [ + { + "name": "zone", + "label": "Zone", + "can_set": true, + "placeholder": "Audio_Zone" + }, + { + "name": "reverb_time", + "label": "Reverb Decay Time", + "can_set": true, + "placeholder": "(in sec)" + }, + { + "name": "wet_level", + "label": "Wet Level", + "can_set": true, + "placeholder": "(in db)" + } + ] + } + ] + }, + { + "name": "audio_buffer", + "label": "Audio Buffers", + "assignment-types": [0], + "settings": [ + { + "name": "dynamic_jitter_buffer", + "type": "checkbox", + "label": "Dynamic Jitter Buffers", + "help": "Dynamically buffer client audio based on perceived jitter in packet receipt timing", + "default": false, + "advanced": true + }, + { + "name": "static_desired_jitter_buffer_frames", + "label": "Static Desired Jitter Buffer Frames", + "help": "If dynamic jitter buffers is disabled, this determines the target number of frames maintained by the AudioMixer's jitter buffers", + "placeholder": "1", + "default": "1", + "advanced": true + }, + { + "name": "max_frames_over_desired", + "label": "Max Frames Over Desired", + "help": "The highest number of frames an AudioMixer's ringbuffer can exceed the desired jitter buffer frames by", + "placeholder": "10", + "default": "10", + "advanced": true + }, + { + "name": "use_stdev_for_desired_calc", + "type": "checkbox", + "label": "Stdev for Desired Jitter Frames Calc", + "help": "Use Philip's method (stdev of timegaps) to calculate desired jitter frames (otherwise Fred's max timegap method is used)", + "default": false, + "advanced": true + }, + { + "name": "window_starve_threshold", + "label": "Window Starve Threshold", + "help": "If this many starves occur in an N-second window (N is the number in the next field), then the desired jitter frames will be re-evaluated using Window A.", + "placeholder": "3", + "default": "3", + "advanced": true + }, + { + "name": "window_seconds_for_desired_calc_on_too_many_starves", + "label": "Timegaps Window (A) Seconds", + "help": "Window A contains a history of timegaps. Its max timegap is used to re-evaluate the desired jitter frames when too many starves occur within it.", + "placeholder": "50", + "default": "50", + "advanced": true + }, + { + "name": "window_seconds_for_desired_reduction", + "label": "Timegaps Window (B) Seconds", + "help": "Window B contains a history of timegaps. Its max timegap is used as a ceiling for the desired jitter frames value.", + "placeholder": "10", + "default": "10", + "advanced": true + }, + { + "name": "repetition_with_fade", + "type": "checkbox", + "label": "Repetition with Fade", + "help": "Dropped frames and mixing during starves repeat the last frame, eventually fading to silence", + "default": false, + "advanced": true + }, + { + "name": "print_stream_stats", + "type": "checkbox", + "label": "Print Stream Stats", + "help": "Audio upstream and downstream stats of each agent printed to audio-mixer stdout", + "default": false, + "advanced": true + } + ] + }, + { + "name": "entity_server_settings", + "label": "Entity Server Settings", + "assignment-types": [6], + "settings": [ + { + "name": "persistFilename", + "label": "Entities Filename", + "help": "the path to the file entities are stored in. Make sure the path exists.", + "placeholder": "resources/models.svo", + "default": "resources/models.svo", + "advanced": true + }, + { + "name": "persistAsFileType", + "label": "File format for entity server's persistent data", + "help": "This defines how the entity server will save entities to disk.", + "default": "svo", + "type": "select", + "options": [ + { + "value": "svo", + "label": "Entity server persists data as SVO" + }, + { + "value": "json", + "label": "Entity server persists data as JSON" + } + ], + "advanced": true + }, + { + "name": "persistInterval", + "label": "Save Check Interval", + "help": "Milliseconds between checks for saving the current state of entities.", + "placeholder": "30000", + "default": "30000", + "advanced": true + }, + { + "name": "backups", + "type": "table", + "label": "Backup Rules", + "help": "In this table you can define a set of rules for how frequently to backup copies of your entites content file.", + "numbered": false, + "default": [ + {"Name":"Half Hourly Rolling","backupInterval":1800,"format":".backup.halfhourly.%N","maxBackupVersions":5}, + {"Name":"Daily Rolling","backupInterval":86400,"format":".backup.daily.%N","maxBackupVersions":7}, + {"Name":"Weekly Rolling","backupInterval":604800,"format":".backup.weekly.%N","maxBackupVersions":4}, + {"Name":"Thirty Day Rolling","backupInterval":2592000,"format":".backup.thirtyday.%N","maxBackupVersions":12} + ], + "columns": [ + { + "name": "Name", + "label": "Name", + "can_set": true, + "placeholder": "Example", + "default": "Example" + }, + { + "name": "format", + "label": "Rule Format", + "can_set": true, + "help": "Format used to create the extension for the backup of your persisted entities. Use a format with %N to get rolling. Or use date formatting like %Y-%m-%d.%H:%M:%S.%z", + "placeholder": ".backup.example.%N", + "default": ".backup.example.%N" + }, + { + "name": "backupInterval", + "label": "Backup Interval in Seconds", + "help": "Interval between backup checks in seconds.", + "placeholder": 1800, + "default": 1800, + "can_set": true + }, + { + "name": "maxBackupVersions", + "label": "Max Rolled Backup Versions", + "help": "If your backup extension format uses 'rolling', how many versions do you want us to keep?", + "placeholder": 5, + "default": 5, + "can_set": true + } + ] + }, + { + "name": "NoPersist", + "type": "checkbox", + "label": "Disable Persistence", + "help": "Don't persist your entities to a file.", + "default": false, + "advanced": true + }, + { + "name": "NoBackup", + "type": "checkbox", + "label": "Disable Backup", + "help": "Don't regularly backup your persisted entities to a backup file.", + "default": false, + "advanced": true + }, + { + "name": "statusHost", + "label": "Status Hostname", + "help": "Host name or IP address of the server for accessing the status page", + "placeholder": "", + "default": "", + "advanced": true + }, + { + "name": "statusPort", + "label": "Status Port", + "help": "Port of the server for accessing the status page", + "placeholder": "", + "default": "", + "advanced": true + }, + { + "name": "wantEditLogging", + "type": "checkbox", + "label": "Edit Logging", + "help": "Logging of all edits to entities", + "default": true, + "advanced": true + }, + { + "name": "verboseDebug", + "type": "checkbox", + "label": "Verbose Debug", + "help": "Lots of debugging", + "default": false, + "advanced": true + }, + { + "name": "debugReceiving", + "type": "checkbox", + "label": "Extra Receiving Debug", + "help": "Extra debugging on receiving", + "default": false, + "advanced": true + }, + { + "name": "debugSending", + "type": "checkbox", + "label": "Extra Sending Debug", + "help": "Extra debugging on sending", + "default": false, + "advanced": true + }, + { + "name": "debugTimestampNow", + "type": "checkbox", + "label": "Extra Timestamp Debugging", + "help": "Extra debugging for usecTimestampNow() function", + "default": false, + "advanced": true + }, + { + "name": "clockSkew", + "label": "Clock Skew", + "help": "Number of msecs to skew the server clock by to test clock skew", + "placeholder": "0", + "default": "0", + "advanced": true + } + ] + }, + { + "name": "avatar_mixer", + "label": "Avatar Mixer", + "assignment-types": [1], + "settings": [ + { + "name": "max_node_send_bandwidth", + "type": "double", + "label": "Per-Node Bandwidth", + "help": "Desired maximum send bandwidth (in Megabits per second) to each node", + "placeholder": 1.0, + "default": 1.0, + "advanced": true + } + ] + } + ] +} diff --git a/domain-server/resources/web/css/bootstrap-switch.min.css b/domain-server/resources/web/css/bootstrap-switch.min.css new file mode 100755 index 0000000000..6eb3d4d9e3 --- /dev/null +++ b/domain-server/resources/web/css/bootstrap-switch.min.css @@ -0,0 +1,22 @@ +/* ======================================================================== + * bootstrap-switch - v3.3.2 + * http://www.bootstrap-switch.org + * ======================================================================== + * Copyright 2012-2013 Mattia Larentis + * + * ======================================================================== + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================================== + */ + +.bootstrap-switch{display:inline-block;direction:ltr;cursor:pointer;border-radius:4px;border:1px solid;border-color:#ccc;position:relative;text-align:left;overflow:hidden;line-height:8px;z-index:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.bootstrap-switch .bootstrap-switch-container{display:inline-block;top:0;border-radius:4px;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.bootstrap-switch .bootstrap-switch-handle-on,.bootstrap-switch .bootstrap-switch-handle-off,.bootstrap-switch .bootstrap-switch-label{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:inline-block !important;height:100%;padding:6px 12px;font-size:14px;line-height:20px}.bootstrap-switch .bootstrap-switch-handle-on,.bootstrap-switch .bootstrap-switch-handle-off{text-align:center;z-index:1}.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-primary,.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-primary{color:#fff;background:#428bca}.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-info,.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-info{color:#fff;background:#5bc0de}.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-success,.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-success{color:#fff;background:#5cb85c}.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-warning,.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-warning{background:#f0ad4e;color:#fff}.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-danger,.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-danger{color:#fff;background:#d9534f}.bootstrap-switch .bootstrap-switch-handle-on.bootstrap-switch-default,.bootstrap-switch .bootstrap-switch-handle-off.bootstrap-switch-default{color:#000;background:#eee}.bootstrap-switch .bootstrap-switch-label{text-align:center;margin-top:-1px;margin-bottom:-1px;z-index:100;color:#333;background:#fff}.bootstrap-switch .bootstrap-switch-handle-on{border-bottom-left-radius:3px;border-top-left-radius:3px}.bootstrap-switch .bootstrap-switch-handle-off{border-bottom-right-radius:3px;border-top-right-radius:3px}.bootstrap-switch input[type='radio'],.bootstrap-switch input[type='checkbox']{position:absolute !important;top:0;left:0;opacity:0;filter:alpha(opacity=0);z-index:-1}.bootstrap-switch input[type='radio'].form-control,.bootstrap-switch input[type='checkbox'].form-control{height:auto}.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-mini .bootstrap-switch-label{padding:1px 5px;font-size:12px;line-height:1.5}.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-small .bootstrap-switch-label{padding:5px 10px;font-size:12px;line-height:1.5}.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-large .bootstrap-switch-label{padding:6px 16px;font-size:18px;line-height:1.33}.bootstrap-switch.bootstrap-switch-disabled,.bootstrap-switch.bootstrap-switch-readonly,.bootstrap-switch.bootstrap-switch-indeterminate{cursor:default !important}.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-on,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-handle-off,.bootstrap-switch.bootstrap-switch-disabled .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-readonly .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-indeterminate .bootstrap-switch-label{opacity:.5;filter:alpha(opacity=50);cursor:default !important}.bootstrap-switch.bootstrap-switch-animate .bootstrap-switch-container{-webkit-transition:margin-left .5s;transition:margin-left .5s}.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-on{border-bottom-left-radius:0;border-top-left-radius:0;border-bottom-right-radius:3px;border-top-right-radius:3px}.bootstrap-switch.bootstrap-switch-inverse .bootstrap-switch-handle-off{border-bottom-right-radius:0;border-top-right-radius:0;border-bottom-left-radius:3px;border-top-left-radius:3px}.bootstrap-switch.bootstrap-switch-focused{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.bootstrap-switch.bootstrap-switch-on .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-off .bootstrap-switch-label{border-bottom-right-radius:3px;border-top-right-radius:3px}.bootstrap-switch.bootstrap-switch-off .bootstrap-switch-label,.bootstrap-switch.bootstrap-switch-inverse.bootstrap-switch-on .bootstrap-switch-label{border-bottom-left-radius:3px;border-top-left-radius:3px} \ No newline at end of file diff --git a/domain-server/resources/web/css/style.css b/domain-server/resources/web/css/style.css index 952a504b13..1ed2594c11 100644 --- a/domain-server/resources/web/css/style.css +++ b/domain-server/resources/web/css/style.css @@ -109,6 +109,13 @@ table { width: 100%; } +/* styling for bootstrap-switch toggles */ +.checkbox-help { + margin-top: 10px; +} + +/* CSS only spinner for AJAX requests */ + .spinner { margin: 30px auto 0; width: 70px; diff --git a/domain-server/resources/web/header.html b/domain-server/resources/web/header.html index 4a75279e8f..f3cacf4b21 100644 --- a/domain-server/resources/web/header.html +++ b/domain-server/resources/web/header.html @@ -7,7 +7,9 @@ + +