void GraphicsVk::InitInstance() { _apiVersion = Vk2Version(vk::enumerateInstanceVersion()); _instanceLayers = vk::enumerateInstanceLayerProperties(); _instanceExtensions = vk::enumerateInstanceExtensionProperties(); std::vector<char const*> layerNames; std::vector<char const *> extensionNames; if (_validationLevel > ValidationLevel::None) { AppendLayer(layerNames, _instanceLayers, "VK_LAYER_LUNARG_standard_validation"); AppendExtension(extensionNames, _instanceExtensions, VK_EXT_DEBUG_REPORT_EXTENSION_NAME); } AppendExtension(extensionNames, _instanceExtensions, VK_KHR_SURFACE_EXTENSION_NAME); #if defined(_WIN32) AppendExtension(extensionNames, _instanceExtensions, VK_KHR_WIN32_SURFACE_EXTENSION_NAME); #elif defined(linux) AppendExtension(extensionNames, _instanceExtensions, VK_KHR_XLIB_SURFACE_EXTENSION_NAME); #else #error Unsupported platform! #endif vk::ApplicationInfo appInfo(_appName.c_str(), Version2Vk(_appVersion), _engineName.c_str(), Version2Vk(_engineVersion)); vk::InstanceCreateInfo instanceInfo(vk::InstanceCreateFlags(), &appInfo, static_cast<uint32_t>(layerNames.size()), layerNames.data(), static_cast<uint32_t>(extensionNames.size()), extensionNames.data()); vk::DebugReportCallbackCreateInfoEXT debugCBInfo(vk::DebugReportFlagBitsEXT::eWarning | vk::DebugReportFlagBitsEXT::eError, DbgReportFunc, this); if (_validationLevel > ValidationLevel::None) { instanceInfo.pNext = &debugCBInfo; _hostAllocTracker = std::make_unique<HostAllocationTrackerVk>(); } _instance = vk::createInstanceUnique(instanceInfo); _dynamicDispatch.init(*_instance); if (_validationLevel > ValidationLevel::None) { _debugReportCallback = _instance->createDebugReportCallbackEXTUnique(debugCBInfo, AllocationCallbacks(), _dynamicDispatch); } }
bool sMap::Import_VergeMAP(const char* filename, const char* tilesetFilename, IFileSystem& fs) { m_MusicFile = ""; m_EntryScript = ""; m_ExitScript = ""; m_Layers.clear(); m_Entities.clear(); IFile* file = fs.Open(filename, IFileSystem::read); if (file == NULL) return false; // check for v1 maps (ver 4) and v2 maps (ver 5) char signature[6]; file->Read(signature, 6); file->Seek(0); bool success = false; if (signature[0] == 4) { V1MAP_HEADER header; file->Read(&header, sizeof(header)); word* layer_background = new word[header.layer_size_x * header.layer_size_y]; word* layer_foreground = new word[header.layer_size_x * header.layer_size_y]; file->Read(layer_background, header.layer_size_x * header.layer_size_y * sizeof(word)); file->Read(layer_foreground, header.layer_size_x * header.layer_size_y * sizeof(word)); sTileset tileset; if (strcmp_ci(tilesetFilename + strlen(tilesetFilename) - 4, ".vsp") == 0) success = tileset.Import_VSP(tilesetFilename, fs); else success = tileset.Load(tilesetFilename, fs); sLayer layer[2]; if (success) { // process map and see if the map has tiles that are out of range int highestTileIndex = 0; for (int j=0; j<header.layer_size_y; j++) for (int i=0; i<header.layer_size_x; i++) if (layer_background[j * header.layer_size_x + i] >= highestTileIndex) highestTileIndex = layer_background[j * header.layer_size_x + i]; else if (layer_foreground[j * header.layer_size_x + i] >= highestTileIndex) highestTileIndex = layer_foreground[j * header.layer_size_x + i]; if (highestTileIndex >= tileset.GetNumTiles()) success = false; // transfer data across into the sMap now... if (success) { layer[0].SetName("Background"); layer[1].SetName("Foreground"); layer[0].Resize(header.layer_size_x, header.layer_size_y); layer[1].Resize(header.layer_size_x, header.layer_size_y); for (int j=0; j<header.layer_size_y; j++) for (int i=0; i<header.layer_size_x; i++) { layer[0].SetTile(i,j, layer_background[j * header.layer_size_x + i]); if (layer_foreground[j * header.layer_size_x + i]) layer[1].SetTile(i,j, layer_foreground[j * header.layer_size_x + i]); else layer[1].SetTile(i,j, tileset.GetNumTiles()); } tileset.AppendTiles(1); memset(tileset.GetTile(tileset.GetNumTiles() - 1).GetPixels(), 0, 256 * sizeof(RGBA)); m_Tileset = tileset; AppendLayer(layer[0]); AppendLayer(layer[1]); SetMusicFile((char*)header.music_fname); SetStartX(header.x_start); SetStartX(header.y_start); SetStartDirection(4); // calculate the parallax mode for (int i=0; i<2; i++) { // FIXME (set parallax properly) // GetLayer(i).SetParallaxX(1, 1); // GetLayer(i).SetParallaxY(1, 1); // GetLayer(i).SetScrollingX(1, 1); // GetLayer(i).SetScrollingX(1, 1); } switch(header.parallax_mode) { case 0: SetStartLayer(0); break; case 1: SetStartLayer(1); break; case 2: // FIXME (set parallax properly) SetStartLayer(1); // GetLayer(0).SetParallaxX(header.parallax_multiplier, header.parallax_divisor); // GetLayer(0).SetParallaxY(header.parallax_multiplier, header.parallax_divisor); break; case 3: // FIXME (set parallax properly) SetStartLayer(0); // GetLayer(1).SetParallaxX(header.parallax_multiplier, header.parallax_divisor); // GetLayer(1).SetParallaxY(header.parallax_multiplier, header.parallax_divisor); break; } } } // cleanup delete[] layer_background; delete[] layer_foreground; } else if (strcmp(signature, "MAPù5") == 0) { V2MAP_HEADER header; V2MAP_LAYERINFO LayerInfo[7]; sTileset tileset; word *mapLayer[7]; int i,j,k; int highestTileIndex = 0; file->Read(&header, sizeof(header)); for (i=0; i<header.num_layers; i++) { file->Read(LayerInfo + i, sizeof(V2MAP_LAYERINFO)); //bug for v2's map: two bytes are added for no reason word w; file->Read(&w, 2); } // get info about map and uncompress it for (i=0; i<header.num_layers; i++) mapLayer[i] = new word[LayerInfo[i].size_x * LayerInfo[i].size_y]; for (i=0; i<header.num_layers; i++) { // god, this is so dumb. It's supposed to be the buffersize, but do I look like I need it? file->Read(&j, 4); for (j=0; j<LayerInfo[i].size_x*LayerInfo[i].size_y; j++) { word value; byte run; file->Read(&value, sizeof(word)); if ((value & 0xFF00) == 0xFF00) { run = (byte)value & 0x00FF; file->Read(&value, sizeof(word)); mapLayer[i][j] = value; for (k=1; k<run; k++) { j++; mapLayer[i][j] = value; } } else { mapLayer[i][j] = value; } } } if (strcmp_ci(tilesetFilename + strlen(tilesetFilename) - 4, ".vsp") == 0) success = tileset.Import_VSP(tilesetFilename); else success = tileset.Load(tilesetFilename); // transfer map array into the class if (success) { highestTileIndex = 0; // check for any tile index larger than the tilset's index for (i=0; i<header.num_layers; i++) for (j=0; j<LayerInfo[i].size_x*LayerInfo[i].size_y; j++) if (mapLayer[i][j] >= highestTileIndex) highestTileIndex = mapLayer[i][j]; if (highestTileIndex >= tileset.GetNumTiles()) success = false; if (success) { sLayer *layer; layer = new sLayer[header.num_layers]; for (i=0; i<header.num_layers; i++) { char Name[7]; memcpy(Name, "Layer A", 8); Name[6] += i; layer[i].SetName(Name); layer[i].Resize(LayerInfo[i].size_x, LayerInfo[i].size_y); } for (i=0; i<header.num_layers; i++) { for (j=0; j<LayerInfo[i].size_y; j++) for (k=0; k<LayerInfo[i].size_x; k++) layer[i].SetTile(k, j, mapLayer[i][(j * LayerInfo[i].size_x) + k]); // FIXME: set parallax properly // layer[i].SetParallaxX(LayerInfo[i].multx, LayerInfo[i].pdivx); // layer[i].SetParallaxY(LayerInfo[i].multy, LayerInfo[i].pdivy); // layer[i].SetScrollingX(1,1); // layer[i].SetScrollingY(1,1); } for (i=0; i<(int)strlen((char*)header.renderstring); i++) switch(header.renderstring[i]) { case '1': AppendLayer(layer[0]); j = 0; break; case '2': AppendLayer(layer[1]); j = 1; break; case '3': AppendLayer(layer[2]); j = 2; break; case '4': AppendLayer(layer[3]); j = 3; break; case '5': AppendLayer(layer[4]); j = 4; break; case '6': AppendLayer(layer[5]); j = 5; break; case 'E': SetStartLayer(j); break; } SetMusicFile((char*)header.music_name); SetStartX(header.x_start); SetStartY(header.y_start); m_Tileset = tileset; delete[] layer; } } for (i=0; i<header.num_layers; i++) delete mapLayer[i]; } file->Close(); return success; }