static void processWindowEvent(SDL_WindowEvent* we){ switch (we->event) { case SDL_WINDOWEVENT_RESIZED: printf("SDL_WINDOWEVENT_RESIZED (%d, %d)\n", we->data1, we->data2); resizeTexture(&gTexture, &gOsb, we->data1, we->data2, SDL_GetRenderer(SDL_GetWindowFromID(we->windowID))); break; } }
static void initSDL(SDL_Window** window, SDL_Renderer** renderer, OffScreenBuffer* osb, SDLInputContext* sdlIC, SDLSoundRingBuffer* srb) { if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_GAMECONTROLLER) != 0) { printSDLErrorAndExit(); } if(!(*window = SDL_CreateWindow("Handmade Hero", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_RESIZABLE))) { printSDLErrorAndExit(); } if(!(*renderer = SDL_CreateRenderer(*window, -1, 0))) { printSDLErrorAndExit(); } resizeTexture(&gTexture, osb, SCREEN_WIDTH, SCREEN_HEIGHT, *renderer); initAudio(srb); initInput(sdlIC); }
void GLFramebuffer2D::addAttachment(Attachment attach) { m_texture.push_back(TextureInfo()); m_texture[m_texture.size() - 1].attachment = attach; resizeTexture(m_width, m_height); }
void terrainInit(const char *texture_path) { terrain_current = loadTextureFromFile(texture_path); if(!terrain_current) terrain_current = &terrain; //Use default, included texture else puts("External texture loaded!"); int fields_x = 16; int fields_y = 16; int field_width = terrain_current->width / fields_x; int field_height = terrain_current->height / fields_y; //Give grass and leaves color const RGB green = { 0.5f, 0.8f, 0.3f }; makeColor(green, *terrain_current, 0, 0, field_width, field_height); makeColor(green, *terrain_current, 5 * field_width, 3 * field_height, field_width, field_height); makeColor(green, *terrain_current, 4 * field_width, 3 * field_height, field_width, field_height); //Also redstone drawTexture(*terrain_current, *terrain_current, 4 * field_width, 10 * field_height, field_width, field_height, 4 * field_width, 11 * field_height, field_width, field_height); const RGB red = { 0.9f, 0.1f, 0.1f }; makeColor(red, *terrain_current, 4 * field_width, 11 * field_height, field_width, field_height); //And redstone switches drawTexture(*terrain_current, *terrain_current, 0 * field_width, 6 * field_height, field_width, field_height, 0 * field_width, 7 * field_height, field_width, field_height); const RGB red_tint = { 1.0f, 0.8f, 0.8f }; makeColor(red_tint, *terrain_current, 0 * field_width, 7 * field_height, field_width, field_height); if(terrain_current->width == 256 && terrain_current->height == 256) terrain_resized = terrain_current; else terrain_resized = resizeTexture(*terrain_current, 256, 256); for(int y = 0; y < fields_y; y++) for(int x = 0; x < fields_x; x++) { //+1 and -2 to work around GLFix inaccuracies resulting in rounding errors TerrainAtlasEntry tea = terrain_atlas[x][y] = {textureArea(x * field_width + 1, y * field_height + 1, field_width - 2, field_height - 2), textureArea(x * 16, y * 16, 16, 16) }; BLOCK_TEXTURE bt = texture_atlas[y][x]; if(bt.sides == 0) continue; if(bt.sides & BLOCK_BOTTOM_BIT) block_textures[bt.block][BLOCK_BOTTOM] = tea; if(bt.sides & BLOCK_TOP_BIT) block_textures[bt.block][BLOCK_TOP] = tea; if(bt.sides & BLOCK_LEFT_BIT) block_textures[bt.block][BLOCK_LEFT] = tea; if(bt.sides & BLOCK_RIGHT_BIT) block_textures[bt.block][BLOCK_RIGHT] = tea; if(bt.sides & BLOCK_FRONT_BIT) block_textures[bt.block][BLOCK_FRONT] = tea; if(bt.sides & BLOCK_BACK_BIT) block_textures[bt.block][BLOCK_BACK] = tea; } //Slight hack, you can't assign a texture to multiple blocks block_textures[BLOCK_GRASS][BLOCK_BOTTOM] = block_textures[BLOCK_DIRT][BLOCK_BOTTOM]; //Prerender four times the same texture to speed up drawing, see terrain.h const BLOCK_TEXTURE quad_textures[] = { ALL(BLOCK_DIRT), SID(BLOCK_GRASS), TOP(BLOCK_GRASS), ALL(BLOCK_STONE), ALL(BLOCK_SAND), SID(BLOCK_WOOD), ALL(BLOCK_PLANKS_NORMAL), ALL(BLOCK_LEAVES) }; terrain_quad = newTexture(field_width * 2 * (sizeof(quad_textures)/sizeof(*quad_textures)), field_height * 2); for(BLOCK b = 0; b <= BLOCK_NORMAL_LAST; b++) for(uint8_t s = 0; s <= BLOCK_SIDE_LAST; s++) quad_block_textures[b][s].has_quad = false; unsigned int x = 0; for(BLOCK_TEXTURE bt : quad_textures) { TextureAtlasEntry *tae = nullptr; if(bt.sides & BLOCK_BOTTOM_BIT) tae = &block_textures[bt.block][BLOCK_BOTTOM].current; if(bt.sides & BLOCK_TOP_BIT) tae = &block_textures[bt.block][BLOCK_TOP].current; if(bt.sides & BLOCK_LEFT_BIT) tae = &block_textures[bt.block][BLOCK_LEFT].current; if(bt.sides & BLOCK_RIGHT_BIT) tae = &block_textures[bt.block][BLOCK_RIGHT].current; if(bt.sides & BLOCK_FRONT_BIT) tae = &block_textures[bt.block][BLOCK_FRONT].current; if(bt.sides & BLOCK_BACK_BIT) tae = &block_textures[bt.block][BLOCK_BACK].current; if(!tae) { printf("Block %d has no texture!\n", bt.block); continue; } //- 1 to reverse the workaround above. Yes, I hate myself for this. drawTexture(*terrain_current, *terrain_quad, tae->left - 1, tae->top - 1, field_width, field_height, x, 0, field_width, field_height); drawTexture(*terrain_current, *terrain_quad, tae->left - 1, tae->top - 1, field_width, field_height, x + field_width, 0, field_width, field_height); drawTexture(*terrain_current, *terrain_quad, tae->left - 1, tae->top - 1, field_width, field_height, x+ field_width, field_height, field_width, field_height); drawTexture(*terrain_current, *terrain_quad, tae->left - 1, tae->top - 1, field_width, field_height, x, field_height, field_width, field_height); //Get an average color of the block RGB sum; for(unsigned int tex_x = tae->left - 1; tex_x <= tae->right; ++tex_x) for(unsigned int tex_y = tae->top - 1; tex_y <= tae->bottom; ++tex_y) { RGB rgb = rgbColor(terrain_current->bitmap[tex_x + tex_y*terrain_current->width]); sum.r += rgb.r; sum.g += rgb.g; sum.b += rgb.b; } int pixels = field_width * field_height; sum.r /= pixels; sum.g /= pixels; sum.b /= pixels; const COLOR darker = colorRGB(sum.r / GLFix(1.5f), sum.g / GLFix(1.5f), sum.b / GLFix(1.5f)); //And add the workaround here again.. TerrainQuadEntry tqe = { true, textureArea(x + 1, 1, field_width * 2 - 2, field_height * 2 - 2), colorRGB(sum), darker }; if(bt.sides & BLOCK_BOTTOM_BIT) quad_block_textures[bt.block][BLOCK_BOTTOM] = tqe; if(bt.sides & BLOCK_TOP_BIT) quad_block_textures[bt.block][BLOCK_TOP] = tqe; if(bt.sides & BLOCK_LEFT_BIT) quad_block_textures[bt.block][BLOCK_LEFT] = tqe; if(bt.sides & BLOCK_RIGHT_BIT) quad_block_textures[bt.block][BLOCK_RIGHT] = tqe; if(bt.sides & BLOCK_FRONT_BIT) quad_block_textures[bt.block][BLOCK_FRONT] = tqe; if(bt.sides & BLOCK_BACK_BIT) quad_block_textures[bt.block][BLOCK_BACK] = tqe; x += field_width * 2; } //Part 2 of the hack above quad_block_textures[BLOCK_GRASS][BLOCK_BOTTOM] = quad_block_textures[BLOCK_DIRT][BLOCK_BOTTOM]; if(lcd_type() == SCR_320x240_4) { greyscaleTexture(*terrain_current); greyscaleTexture(*terrain_resized); greyscaleTexture(*terrain_quad); } //Resize the glass texture to 32x32 const TextureAtlasEntry &glass_tex = block_textures[BLOCK_GLASS][BLOCK_FRONT].current; glass_big = newTexture(32, 32); drawTexture(*terrain_current, *glass_big, glass_tex.left - 1, glass_tex.top - 1, field_width, field_height, 0, 0, 32, 32); }