/** * Load a shader file from disc or from the builtin defaults in def_files.cpp if none can be found. * This function will also create a list of preprocessor defines for the GLSL compiler based on the shader flags * and the supported GLSL version as reported by the GPU driver. * * @param shader shader_type enum defined with which shader we're loading * @param filename C-string holding the filename (with extension) of the shader file * @param flags integer variable holding a combination of SDR_* flags * @return C-string holding the complete shader source code */ static SCP_string opengl_load_shader(const char* filename) { SCP_string content; if (Enable_external_shaders) { CFILE* cf_shader = cfopen(filename, "rt", CFILE_NORMAL, CF_TYPE_EFFECTS); if (cf_shader != NULL) { int len = cfilelength(cf_shader); content.resize(len); cfread(&content[0], len + 1, 1, cf_shader); cfclose(cf_shader); return content; } } //If we're still here, proceed with internals mprintf((" Loading built-in default shader for: %s\n", filename)); auto def_shader = defaults_get_file(filename); content.assign(reinterpret_cast<const char*>(def_shader.data), def_shader.size); return content; }
void debug_console(void (*_func)(void)) { int done = 0; while( key_inkey() ) { os_poll(); } if ( !debug_inited ) { dc_init(); } dc_draw(TRUE); while (!done) { // poll the os os_poll(); int k = key_inkey(); switch( k ) { case KEY_SHIFTED+KEY_ENTER: case KEY_ESC: done = TRUE; break; case KEY_BACKSP: if (!dc_command_buf.empty()) { dc_command_buf.erase(dc_command_buf.size() - 1); } break; case KEY_F3: case KEY_UP: if (last_oldcommand < (dc_history.end() - 1)) { ++last_oldcommand; } dc_command_buf = *last_oldcommand; break; case KEY_DOWN: if (last_oldcommand > dc_history.begin()) { --last_oldcommand; } dc_command_buf = *last_oldcommand; break; case KEY_PAGEUP: if (dc_scroll_y > 1) { dc_scroll_y--; } break; case KEY_PAGEDOWN: if (dc_scroll_y < (DBROWS - DROWS)) { dc_scroll_y++; } else { dc_scroll_y = (DBROWS - DROWS); } break; case KEY_ENTER: dc_scroll_y = (DBROWS - DROWS); // Set the scroll to look at the bottom last_oldcommand = dc_history.begin(); // Reset the last oldcommand lastline = 0; // Reset the line counter // Clear the command line on the window, but don't print the prompt until the command has processed // Stuff a copy of the command line onto the history // Search for the command // If not found: // abort, // dc_printf("Error: Invalid or Missing command %s", cmd.c_str()), and // dc_printf(dc_prompt) when ready for input // Call the function for that command, and strip the cmd token from the command line string if (dc_command_buf.empty()) { dc_printf("No command given.\n"); break; } // Else, continue to process the cmd_line // z64: Thread Note: Maybe lock a mutex here to allow a previous DCF to finish/abort before starting a new one // z64: We'll just assume we won't be here unless a command has finished... dc_history.push_front(dc_command_buf); // Push the command onto the history queue last_oldcommand = dc_history.begin(); // Reset oldcommand while (dc_history.size() > DCMDS) { dc_history.pop_back(); // Keep the commands less than or equal to DCMDS } dc_command_str = dc_command_buf; // Xfer to the command string for processing dc_command_buf.resize(0); // Nullify the buffer dc_printf("%s%s\n", dc_prompt, dc_command_str.c_str()); // Print the command w/ prompt. dc_draw(FALSE); // Redraw the console without the command line. dc_do_command(&dc_command_str); // Try to do the command break; default: // Not any of the control key codes, so it's probably a letter or number. ubyte c = (ubyte)key_to_ascii(k); if ((c != 255) && (dc_command_buf.size() < MAX_CLI_LEN)) { dc_command_buf.push_back(c); } } // Do the passed function if ( _func ) { _func(); } // All done, and ready for new entry dc_draw(TRUE); } while( key_inkey() ) { os_poll(); } }
SCP_vector<SCP_string> speech_enumerate_voices() { #ifdef _WIN32 HRESULT hr = CoCreateInstance( CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&Voice_device); if (FAILED(hr)) { return SCP_vector<SCP_string>(); } // This code is mostly copied from wxLauncher ISpObjectTokenCategory * comTokenCategory = NULL; IEnumSpObjectTokens * comVoices = NULL; ULONG comVoicesCount = 0; // Generate enumeration of voices hr = ::CoCreateInstance(CLSID_SpObjectTokenCategory, NULL, CLSCTX_INPROC_SERVER, IID_ISpObjectTokenCategory, (LPVOID*)&comTokenCategory); if (FAILED(hr)) { return SCP_vector<SCP_string>(); } hr = comTokenCategory->SetId(SPCAT_VOICES, false); if (FAILED(hr)) { return SCP_vector<SCP_string>(); } hr = comTokenCategory->EnumTokens(NULL, NULL, &comVoices); if (FAILED(hr)) { return SCP_vector<SCP_string>(); } hr = comVoices->GetCount(&comVoicesCount); if (FAILED(hr)) { return SCP_vector<SCP_string>(); } SCP_vector<SCP_string> voices; while (comVoicesCount > 0) { ISpObjectToken * comAVoice = NULL; comVoices->Next(1, &comAVoice, NULL); // retrieve just one LPWSTR id = NULL; comAVoice->GetStringValue(NULL, &id); auto idlength = wcslen(id); auto buffer_size = WideCharToMultiByte(CP_UTF8, 0, id, (int)idlength, nullptr, 0, nullptr, nullptr); if (buffer_size > 0) { SCP_string voiceName; voiceName.resize(buffer_size); buffer_size = WideCharToMultiByte(CP_UTF8, 0, id, (int)idlength, &voiceName[0], buffer_size, nullptr, nullptr); voices.push_back(voiceName); } CoTaskMemFree(id); comAVoice->Release(); comVoicesCount--; } comTokenCategory->Release(); Voice_device->Release(); return voices; #else STUB_FUNCTION; return SCP_vector<SCP_string>(); #endif }