void Graphics::renderFrame(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Camera *camera = resources->getCamera(); glm::mat4 projection = camera->getProjection(); glm::mat4 view = camera->getView(); // Skybox if( resources->hasSkybox() ){ renderSkybox(projection, camera->getOrientationMatrix()); } // Entities renderEntities(projection, view); renderTransparentEntities(projection, view); // Particles renderParticleSystems(projection, view); // UI renderUserInterface(); glFlush(); glfwSwapBuffers(window); // glfwPollEvents(); }
void GraphicsTCOD::render() { entMap->refreshEntityMap(); renderTiles(); renderEntities(); TCODConsole::blit(output, 0, 0, MAIN_WIDTH, MAIN_HEIGHT, TCODConsole::root, 0, 0); TCODConsole::flush(); }
int main() { cfguInit(); CFGU_GetSystemModel(&MODEL_3DS); FILE * file; shouldRenderDebug = true; if ((file = fopen("settings.bin", "r"))) { fread(&shouldRenderDebug,sizeof(bool),1,file); fread(&shouldSpeedup,sizeof(bool),1,file); osSetSpeedupEnable(shouldSpeedup); fclose(file); } sf2d_init(); csndInit(); noItem = newItem(ITEM_NULL, 0); currentMenu = MENU_TITLE; currentSelection = 0; quitGame = false; icons = sfil_load_PNG_buffer(icons2_png, SF2D_PLACE_RAM); font = sfil_load_PNG_buffer(Font_png, SF2D_PLACE_RAM); bottombg = sfil_load_PNG_buffer(bottombg_png, SF2D_PLACE_RAM); dirtColor[0] = SWAP_UINT32(sf2d_get_pixel(icons, 16, 0)); dirtColor[1] = SWAP_UINT32(sf2d_get_pixel(icons, 16, 1)); dirtColor[2] = SWAP_UINT32(sf2d_get_pixel(icons, 16, 2)); dirtColor[3] = SWAP_UINT32(sf2d_get_pixel(icons, 16, 3)); dirtColor[4] = SWAP_UINT32(sf2d_get_pixel(icons, 16, 4)); loadSound(&snd_playerHurt, "resources/playerhurt.raw"); loadSound(&snd_playerDeath, "resources/playerdeath.raw"); loadSound(&snd_monsterHurt, "resources/monsterhurt.raw"); loadSound(&snd_test, "resources/test.raw"); loadSound(&snd_pickup, "resources/pickup.raw"); loadSound(&snd_bossdeath, "resources/bossdeath.raw"); loadSound(&snd_craft, "resources/craft.raw"); bakeLights(); int i; for (i = 0; i < 5; ++i) { minimap[i] = sf2d_create_texture(128, 128, TEXFMT_RGBA8, SF2D_PLACE_RAM); sf2d_texture_tile32(minimap[i]); } sf2d_set_vblank_wait(true); sf2d_set_clear_color(0xFF000000); k_up.input = KEY_DUP | KEY_CPAD_UP | KEY_CSTICK_UP; k_down.input = KEY_DDOWN | KEY_CPAD_DOWN | KEY_CSTICK_DOWN; k_left.input = KEY_DLEFT | KEY_CPAD_LEFT | KEY_CSTICK_LEFT; k_right.input = KEY_DRIGHT | KEY_CPAD_RIGHT | KEY_CSTICK_RIGHT; k_attack.input = KEY_A | KEY_B | KEY_L | KEY_ZR; k_menu.input = KEY_X | KEY_Y | KEY_R | KEY_ZL; k_pause.input = KEY_START; k_accept.input = KEY_A; k_decline.input = KEY_B; k_delete.input = KEY_X; k_menuNext.input = KEY_R; k_menuPrev.input = KEY_L; if ((file = fopen("btnSave.bin", "rb"))) { fread(&k_up.input, sizeof(int), 1, file); fread(&k_down.input, sizeof(int), 1, file); fread(&k_left.input, sizeof(int), 1, file); fread(&k_right.input, sizeof(int), 1, file); fread(&k_attack.input, sizeof(int), 1, file); fread(&k_menu.input, sizeof(int), 1, file); fread(&k_pause.input, sizeof(int), 1, file); fread(&k_accept.input, sizeof(int), 1, file); fread(&k_decline.input, sizeof(int), 1, file); fread(&k_delete.input, sizeof(int), 1, file); fread(&k_menuNext.input, sizeof(int), 1, file); fread(&k_menuPrev.input, sizeof(int), 1, file); fclose(file); } if ((file = fopen("lastTP.bin", "r"))) { char fnbuf[256]; fgets(fnbuf, 256, file); // get directory to texturepack loadTexturePack(fnbuf); fclose(file); } tickCount = 0; initRecipes(); defineTables(); while (aptMainLoop()) { ++tickCount; hidScanInput(); tickKeys(hidKeysHeld(), hidKeysDown()); if (quitGame) break; if (initGame > 0) setupGame(initGame == 1 ? true : false); if (currentMenu == 0) { tick(); sf2d_start_frame(GFX_TOP, GFX_LEFT); offsetX = xscr; offsetY = yscr; sf2d_draw_rectangle(0, 0, 400, 240, 0xFF0C0C0C); //RGBA8(12, 12, 12, 255)); //You might think "real" black would be better, but it actually looks better that way renderLightsToStencil(); renderBackground(xscr, yscr); renderEntities(player.x, player.y, &eManager); renderPlayer(); resetStencilStuff(); offsetX = 0; offsetY = 0; if(shouldRenderDebug){ sprintf(fpsstr, " FPS: %.0f, X:%d, Y:%d, E:%d", sf2d_get_fps(), player.x, player.y, eManager.lastSlot[currentLevel]); drawText(fpsstr, 2, 225); } sf2d_end_frame(); sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); if(!shouldRenderMap){ sf2d_draw_texture(bottombg, 0, 0); renderGui(); } else { renderZoomedMap(); } sf2d_end_frame(); } else { tickMenu(currentMenu); renderMenu(currentMenu, xscr, yscr); } sf2d_swapbuffers(); } freeRecipes(); freeLightBakes(); sf2d_free_texture(icons); sf2d_free_texture(minimap[0]); sf2d_free_texture(minimap[1]); sf2d_free_texture(minimap[2]); sf2d_free_texture(minimap[3]); sf2d_free_texture(minimap[4]); freeSounds(); csndExit(); cfguExit(); sf2d_fini(); return 0; }
void frts::Drawer::updatePosition(const SharedManagerPtr& shared, PointPtr pos, Point::value zLevel, const RegionManagerPtr& regionManager, const ModelFactoryPtr& modelFactory, const GraphicDataPtr& graphicData, const ModelDataPtr& modelData) { // Pos is not a reference because we may override it. assert(shared != nullptr); assert(pos != nullptr); assert(initialized); // We only render on the same z-level or levels below. if (pos->getZ() > zLevel) { return; } // Change pos if it is below because we render always relative to the current zLevel. // Also we check if it is necessary to render (this may change later depending on transparency). bool renderPos = (pos->getZ() == zLevel); if (pos->getZ() < zLevel) { pos = modelFactory->makePoint(pos->getX(), pos->getY(), zLevel); } // The rectangle on the screen which should be rendered. auto mapArea = graphicData->getMapArea(); auto renderX = mapArea.x + regionToScreenX(pos->getX(), shared); auto renderY = mapArea.y + regionToScreenY(pos->getY(), shared); auto renderWidth = std::min(static_cast<GraphicData::pixel>(graphicData->getZoom() * graphicData->getTileWidth()), mapArea.x + mapArea.width - renderX); auto renderHeight = std::min(static_cast<GraphicData::pixel>(graphicData->getZoom() * graphicData->getTileHeight()), mapArea.y + mapArea.height - renderY); SDL_Rect rectToRender = { static_cast<int>(renderX), static_cast<int>(renderY), static_cast<int>(renderWidth), static_cast<int>(renderHeight) }; SDL_SetRenderDrawColor(renderer.get(), tileBackgroundR, tileBackgroundG, tileBackgroundB, 0); // Check if the position is in the map rectangle. if (!mapArea.isPixelInRect(renderX, renderY)) { return; } // Because of zoom it might be outside the region, so let's just render the background. if (pos->getX() >= modelData->getMapSizeX() || pos->getY() >= modelData->getMapSizeY()) { SDL_RenderFillRect(renderer.get(), &rectToRender); return; } // Get block. auto renderableId = shared->makeId(Sdl2Ids::renderable()); auto block = regionManager->getBlock(pos, shared); auto entities = block->getByComponent(renderableId); // Stacking support. IdUnorderedSet stacked; // Check for transparency. Currently we only render blocks below if the first entity (the assumed background) has it. auto filledBackground = false; if (entities.size() > 0) { auto transparency = getTransparency(entities, renderableId); if (transparency > 0) { SDL_RenderFillRect(renderer.get(), &rectToRender); filledBackground = true; // Even if the position on the current z-level doesn't need rendering we can look through // so it's still necessary to do that. renderPos = true; } // Check descending if the entities are transparent. std::vector<EntityVector> allEntitiesBelow; for (Point::value i = 1; i <= transparency; ++i) { auto posBelow = modelFactory->makePoint(pos->getX(), pos->getY(), pos->getZ() - i); auto blockBelow = regionManager->getBlock(posBelow, shared); auto entitiesBelow = blockBelow->getByComponent(renderableId); allEntitiesBelow.push_back(entitiesBelow); // Initialize with a value greater 0 to keep going if there are no entities. frts::Point::value transparencyBelow = 1; if (entitiesBelow.size() > 0) { transparencyBelow = getTransparency(entitiesBelow, renderableId); } if (transparencyBelow == 0) { // Doesn't make sense to go deeper if not transparent. break; } } // Render beginning from the lowest one. for (auto it = allEntitiesBelow.rbegin(); it != allEntitiesBelow.rend(); ++it) { renderEntities(*it, renderableId, rectToRender, stacked, shared, graphicData->getZoom()); } } if (renderPos) { if (!filledBackground) { SDL_RenderFillRect(renderer.get(), &rectToRender); } renderEntities(entities, renderableId, rectToRender, stacked, shared, graphicData->getZoom()); } }
int main() { sf2d_init(); csndInit(); noItem = newItem(ITEM_NULL,0); currentMenu = MENU_TITLE; currentSelection = 0; quitGame = false; icons = sfil_load_PNG_buffer(icons2_png, SF2D_PLACE_RAM); font = sfil_load_PNG_buffer(Font_png, SF2D_PLACE_RAM); //consoleInit(GFX_BOTTOM, NULL); // printf("Press 'Start' to exit.\n"); loadSound(&snd_playerHurt, "resources/playerhurt.raw"); loadSound(&snd_playerDeath, "resources/playerdeath.raw"); loadSound(&snd_monsterHurt, "resources/monsterhurt.raw"); loadSound(&snd_test, "resources/test.raw"); loadSound(&snd_pickup, "resources/pickup.raw"); loadSound(&snd_bossdeath, "resources/bossdeath.raw"); loadSound(&snd_craft, "resources/craft.raw"); int i; for(i = 0;i < 5;++i){ minimap[i] = sf2d_create_texture(128,128,TEXFMT_RGBA8,SF2D_PLACE_RAM); sf2d_texture_tile32(minimap[i]); } sf2d_set_vblank_wait(true); sf2d_set_clear_color(0xFF); /* Default inputs */ k_up.input = KEY_DUP | KEY_CPAD_UP | KEY_CSTICK_UP; k_down.input = KEY_DDOWN | KEY_CPAD_DOWN | KEY_CSTICK_DOWN; k_left.input = KEY_DLEFT | KEY_CPAD_LEFT | KEY_CSTICK_LEFT; k_right.input = KEY_DRIGHT | KEY_CPAD_RIGHT | KEY_CSTICK_RIGHT; k_attack.input = KEY_A | KEY_B | KEY_L | KEY_ZR; k_menu.input = KEY_X | KEY_Y | KEY_R | KEY_ZL; k_pause.input = KEY_START; k_accept.input = KEY_A; k_decline.input = KEY_B; k_delete.input = KEY_X; FILE * file; /* If btnSave exists, then use that. */ if ((file = fopen("btnSave.bin", "rb"))){ fread(&k_up.input, sizeof(int), 1, file); fread(&k_down.input, sizeof(int), 1, file); fread(&k_left.input, sizeof(int), 1, file); fread(&k_right.input, sizeof(int), 1, file); fread(&k_attack.input, sizeof(int), 1, file); fread(&k_menu.input, sizeof(int), 1, file); fread(&k_pause.input, sizeof(int), 1, file); fread(&k_accept.input, sizeof(int), 1, file); fread(&k_decline.input, sizeof(int), 1, file); fread(&k_delete.input, sizeof(int), 1, file); fclose(file); } //screenShot = false; tickCount=0; initRecipes(); defineTables(); while (aptMainLoop()) { ++tickCount; hidScanInput(); tickKeys(hidKeysHeld(),hidKeysDown()); //if (quitGame || hidKeysHeld() & KEY_SELECT) break; if (quitGame) break; //if (hidKeysDown() & (KEY_L | KEY_R)) screenShot = true; // else screenShot = false; if(initGame > 0) setupGame(initGame == 1 ? true : false); if(currentMenu == 0){ tick(); sprintf(fpsstr, " FPS: %.0f, X:%d, Y:%d, E:%d", sf2d_get_fps(),player.x, player.y,eManager.lastSlot[currentLevel]); sf2d_start_frame(GFX_TOP, GFX_LEFT); if(currentLevel == 0){ sf2d_draw_texture_part_scale(minimap[1],(-xscr/3)-256,(-yscr/3)-32,0,0,128,128,12.5,7.5); sf2d_draw_rectangle(0,0,400,240, 0xDFDFDFAF); } offsetX = xscr;offsetY = yscr; renderBackground(xscr,yscr); renderEntities(player.x, player.y, &eManager); renderPlayer(); offsetX = 0;offsetY = 0; renderItemWithText(player.p.activeItem, 10, 205); // drawText(debugText,2,208); drawText(fpsstr,2,225); sf2d_end_frame(); sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); if(currentLevel == 0 && airWizardHealthDisplay > 0){ sprintf(bossHealthText, "BOSS: %.0f%%", ((float)airWizardHealthDisplay/2000.0)*100); drawText(bossHealthText,2,225); } renderGui(); sf2d_draw_texture(minimap[currentLevel], 192, 112);//y:56 sf2d_end_frame(); } else{ tickMenu(currentMenu); renderMenu(currentMenu,xscr,yscr); } sf2d_swapbuffers(); } freeRecipes(); sf2d_free_texture(icons); sf2d_free_texture(minimap[0]); sf2d_free_texture(minimap[1]); sf2d_free_texture(minimap[2]); sf2d_free_texture(minimap[3]); sf2d_free_texture(minimap[4]); freeSounds(); csndExit(); sf2d_fini(); return 0; }