void show_fps() { clock_t now = clock(); float curr_fps = 1000000.0F / ((float)now - (float)last_render_time); sprintf(fps_string, "FPS: %d", (int)curr_fps); font_draw_stringf(10, 10, 0xFFFFFFFF, fps_string); last_render_time = now; }
int main() { char vita_ip[16]; unsigned short int vita_port = 0; vita2d_init(); vita2d_set_clear_color(RGBA8(0x00, 0x00, 0x00, 0xFF)); clr_color = 0x000000FF; vita2d_texture* texture_splash = vita2d_load_JPEG_buffer(splash, size_splash); vita2d_start_drawing(); vita2d_draw_texture(texture_splash, 0, 0); vita2d_end_drawing(); vita2d_swap_buffers(); sceKernelDelayThread(4000000); vita2d_start_drawing(); vita2d_clear_screen(); vita2d_end_drawing(); vita2d_swap_buffers(); vita2d_free_texture(texture_splash); SceCtrlData pad; SceCtrlData oldpad; while (1) { // Load main script SceUID id = sceIoDopen("cache0:/lpp"); SceIoDirent entry; memset(&entry, 0, sizeof(SceIoDirent)); while (sceIoDread(id, &entry) > 0){ script_files++; memset(&entry, 0, sizeof(SceIoDirent)); } sceIoDclose(id); if (script_files>1) errMsg = runScript((const char*)main_menu, true); else{ SceUID main_file = sceIoOpen("cache0:/lpp/index.lua", PSP2_O_RDONLY, 0777); if (main_file < 0) errMsg = "index.lua not found."; else{ SceOff size = sceIoLseek(main_file, 0, SEEK_END); if (size < 1) errMsg = "Invalid main script."; else{ sceIoLseek(main_file, 0, SEEK_SET); script = (unsigned char*)malloc(size + 1); sceIoRead(main_file, script, size); script[size] = 0; sceIoClose(main_file); errMsg = runScript((const char*)script, true); free(script); } } } if (errMsg != NULL){ if (strstr(errMsg, "lpp_shutdown")) break; else{ int restore = 0; bool s = true; while (restore == 0){ vita2d_start_drawing(); vita2d_clear_screen(); font_draw_string(10, 10, RGBA8(255, 255, 255, 255), "An error occurred:"); font_draw_string(10, 30, RGBA8(255, 255, 255, 255), errMsg); font_draw_string(10, 70, RGBA8(255, 255, 255, 255), "Press X to restart."); font_draw_string(10, 90, RGBA8(255, 255, 255, 255), "Press O to enable/disable FTP."); if (vita_port != 0){ font_draw_stringf(10, 150, RGBA8(255, 255, 255, 255), "PSVITA listening on IP %s , Port %u", vita_ip, vita_port); } vita2d_end_drawing(); vita2d_swap_buffers(); if (s){ sceKernelDelayThread(800000); s = false; } sceCtrlPeekBufferPositive(0, &pad, 1); if (pad.buttons & PSP2_CTRL_CROSS) { errMsg = NULL; restore = 1; if (vita_port != 0){ ftp_fini(); vita_port = 0; } sceKernelDelayThread(800000); }else if ((pad.buttons & PSP2_CTRL_CIRCLE) && (!(oldpad.buttons & PSP2_CTRL_CIRCLE))){ if (vita_port == 0) ftp_init(vita_ip, &vita_port); else{ ftp_fini(); vita_port = 0; } } oldpad = pad; } } } } vita2d_fini(); sceKernelExitProcess(0); return 0; }
int file_choose(const char *start_path, char *chosen_file, const char *title, const char *supported_ext[]) { SceCtrlData pad, old_pad; unsigned int keys_down; int i; int selected = 0; char cur_path[PATH_MAX]; pad.buttons = old_pad.buttons = 0; strcpy(cur_path, start_path); file_list list; file_list_entry *entry; file_list_build(cur_path, &list, supported_ext); while (1) { sceCtrlPeekBufferPositive(0, &pad, 1); if (pad.buttons & PSP2_CTRL_SELECT) break; keys_down = pad.buttons & ~old_pad.buttons; if (keys_down & PSP2_CTRL_UP) { selected--; if (selected < 0) { selected = list.length - 1; } } else if (keys_down & PSP2_CTRL_DOWN) { selected++; if (selected == list.length) { selected = 0; } } if (keys_down & (PSP2_CTRL_CROSS | PSP2_CTRL_START)) { file_list_entry *entry = file_list_get_nth_entry(&list, selected); if (entry->is_dir) { if (strcmp(entry->name, "..") == 0) { dir_up(cur_path); } else { char new_path[PATH_MAX]; sprintf(new_path, "%s/%s", cur_path, entry->name); strcpy(cur_path, new_path); } file_list_empty(&list); file_list_build(cur_path, &list, supported_ext); selected = 0; } else if (entry->supported) { sprintf(chosen_file, "%s/%s", cur_path, entry->name); file_list_empty(&list); return 1; } } else if (keys_down & PSP2_CTRL_CIRCLE) { dir_up(cur_path); file_list_empty(&list); file_list_build(cur_path, &list, supported_ext); selected = 0; } vita2d_start_drawing(); vita2d_clear_screen(); font_draw_stringf(10, 10, WHITE, title); entry = list.head; for (i = 0; i < list.length; i++) { font_draw_stringf( 10, 40 + i*20, (!entry->is_dir && entry->supported) ? GREEN : WHITE, "%s %s", (selected == i) ? ">" : "", entry->name); entry = entry->next; } old_pad = pad; vita2d_end_drawing(); vita2d_swap_buffers(); } return 0; }
int file_choose(const char *start_path, char *chosen_file, const char *title, const char *supported_ext[]) { SceCtrlData pad, old_pad; unsigned int keys_down; int i; int selected = 0; char cur_path[PATH_MAX]; pad.buttons = old_pad.buttons = 0; strcpy(cur_path, start_path); file_list list; file_list_entry *entry; file_list_build(cur_path, &list, supported_ext); while (1) { sceCtrlPeekBufferPositive(0, &pad, 1); if (pad.buttons & SCE_CTRL_SELECT) break; keys_down = pad.buttons & ~old_pad.buttons; if (keys_down & SCE_CTRL_UP) { selected--; if (selected < list.scroll) { list.scroll--; } if (selected < 0) { selected = list.length - 1; list.scroll = max(0, list.length - LIST_MAX_ONSCREEN); } } else if (keys_down & SCE_CTRL_DOWN) { selected++; if (selected == list.scroll + LIST_MAX_ONSCREEN) { list.scroll++; } if (selected == list.length) { selected = 0; list.scroll = 0; } } if (keys_down & (SCE_CTRL_CROSS | SCE_CTRL_START)) { file_list_entry *entry = file_list_get_nth_entry(&list, selected); if (entry->is_dir) { if (strcmp(entry->name, "..") == 0) { dir_up(cur_path); } else { char new_path[PATH_MAX]; // no valid elf with new toolchain with sprintf(new_path, "%s/%s", cur_path, entry->name); sceClibSnprintf(new_path, PATH_MAX, "%s/%s", cur_path, entry->name); strcpy(cur_path, new_path); } file_list_empty(&list); file_list_build(cur_path, &list, supported_ext); selected = 0; } else if (entry->supported) { // no valid elf with new toolchain with sprintfsprintf(chosen_file, "%s/%s", cur_path, entry->name); sceClibSnprintf(chosen_file,PATH_MAX, "%s/%s", cur_path, entry->name); file_list_empty(&list); return 1; } } else if (keys_down & SCE_CTRL_CIRCLE) { dir_up(cur_path); file_list_empty(&list); file_list_build(cur_path, &list, supported_ext); selected = 0; } vita2d_start_drawing(); vita2d_clear_screen(); font_draw_stringf(10, 10, WHITE, title); entry = file_list_get_nth_entry(&list, list.scroll); for (i = list.scroll; i < min(list.length, list.scroll + LIST_MAX_ONSCREEN); i++) { font_draw_stringf( 10, 40 + (i - list.scroll)*20, (!entry->is_dir && entry->supported) ? GREEN : WHITE, "%s %s", (selected == i) ? ">" : "", entry->name); entry = entry->next; } old_pad = pad; vita2d_end_drawing(); vita2d_swap_buffers(); } return 0; }
int main() { init_video(); /* Enable analog stick */ sceCtrlSetSamplingMode(SCE_CTRL_MODE_ANALOG); /* Enable front touchscreen */ sceTouchSetSamplingState(SCE_TOUCH_PORT_FRONT, 1); /* FPS counting */ SceUInt64 cur_micros = 0, delta_micros = 0, last_micros = 0; uint32_t frames = 0; float fps = 0.0f; /* Square variables */ int w = 60; int h = 60; int x = SCREEN_W/2 - w/2; int y = SCREEN_H/2 - h/2; int speed = 2; uint32_t color = RGBA8(255, 0, 0, 255); /* Input variables */ SceCtrlData pad; SceTouchData touch; signed char lx, ly, rx, ry; while (1) { clear_screen(); /* Read controls and touchscreen */ sceCtrlPeekBufferPositive(0, &pad, 1); sceTouchPeek(0, &touch, 1); if (pad.buttons & SCE_CTRL_START) { break; } font_draw_string(10, 10, RGBA8(0, 0, 255, 255), "PSVita sample by xerpi!"); font_draw_stringf(SCREEN_W - 160, 10, RGBA8(0, 255, 0, 255), "FPS: %.2f", fps); font_draw_stringf(10, 30, RGBA8(255, 0, 0, 255), "(%3d, %3d) size: (%d, %d) speed: %d\n", x, y, w, h, speed); /* Move the rectangle */ if (pad.buttons & SCE_CTRL_UP) { y -= speed; } else if (pad.buttons & SCE_CTRL_DOWN) { y += speed; } if (pad.buttons & SCE_CTRL_LEFT) { x -= speed; } else if (pad.buttons & SCE_CTRL_RIGHT) { x += speed; } if (pad.buttons & SCE_CTRL_LTRIGGER) { speed--; if (speed < 0) speed = 0; } else if (pad.buttons & SCE_CTRL_RTRIGGER) { speed++; if (speed > 100) speed = 100; } if (pad.buttons & SCE_CTRL_CROSS) { color = RGBA8(rand()%255, rand()%255, rand()%255, 255); } /* Update joystick values */ lx = (signed char)pad.lx - 128; ly = (signed char)pad.ly - 128; rx = (signed char)pad.rx - 128; ry = (signed char)pad.ry - 128; /* Move using the left yoystick */ if (abs(lx) > 50) { x += speed * lx/50.0f; } if (abs(ly) > 50) { y += speed * ly/50.0f; } /* Resize using the right yoystick */ if (abs(rx) > 50) { w += rx/15.0f; if (w < 5) { w = 5; } else if (w > SCREEN_W) { w = SCREEN_W; } } if (abs(ry) > 50) { h += ry/15.0f; if (h < 5) { h = 5; } if (h > SCREEN_H) { h = SCREEN_H; } } /* Move using the touchscreen! */ if (touch.reportNum > 0) { /* Front touchscreen: 1920x1088 */ x = lerp(touch.report[0].x, 1920, SCREEN_W) - w/2; y = lerp(touch.report[0].y, 1088, SCREEN_H) - h/2; } /* Check left and right collisions */ if (x < 0) { x = 0; } else if ((x + w) > SCREEN_W) { x = SCREEN_W - w; } /* Check top and bottom collisions */ if (y < 0) { y = 0; } else if ((y + h) > SCREEN_H) { y = SCREEN_H - h; } /* Draw the rectangle */ draw_rectangle(x, y, w, h, color); /* Draw a circle */ draw_circle(SCREEN_W / 2, SCREEN_H / 2, 50, RGBA8(0,0,255,255)); /* Calculate FPS */ cur_micros = sceKernelGetProcessTimeWide(); if (cur_micros >= (last_micros + 1000000)) { delta_micros = cur_micros - last_micros; last_micros = cur_micros; fps = (frames/(double)delta_micros)*1000000.0f; frames = 0; } swap_buffers(); sceDisplayWaitVblankStart(); frames++; } end_video(); sceKernelExitProcess(0); return 0; }