TexturePtr LightView::generateLightBubble(float centerFactor) { int bubbleRadius = 256; int centerRadius = bubbleRadius * centerFactor; int bubbleDiameter = bubbleRadius * 2; ImagePtr lightImage = ImagePtr(new Image(Size(bubbleDiameter, bubbleDiameter))); for(int x = 0; x < bubbleDiameter; x++) { for(int y = 0; y < bubbleDiameter; y++) { float radius = std::sqrt((bubbleRadius - x)*(bubbleRadius - x) + (bubbleRadius - y)*(bubbleRadius - y)); float intensity = stdext::clamp<float>((bubbleRadius - radius) / (float)(bubbleRadius - centerRadius), 0.0f, 1.0f); // light intensity varies inversely with the square of the distance intensity = intensity * intensity; uint8_t colorByte = intensity * 0xff; uint8_t pixel[4] = {colorByte,colorByte,colorByte,0xff}; lightImage->setPixel(x, y, pixel); } } TexturePtr tex = TexturePtr(new Texture(lightImage, true)); tex->setSmooth(true); return tex; }
void PainterShaderProgram::addMultiTexture(const std::string& file) { if(m_multiTextures.size() > 3) g_logger.error("cannot add more multi textures to shader, the max is 3"); TexturePtr texture = g_textures.getTexture(file); if(!texture) return; texture->setSmooth(true); texture->setRepeat(true); m_multiTextures.push_back(texture); }
TexturePtr TextureManager::getTexture(const std::string& fileName) { TexturePtr texture; // before must resolve filename to full path std::string filePath = g_resources.resolvePath(fileName); // check if the texture is already loaded auto it = m_textures.find(filePath); if(it != m_textures.end()) { texture = it->second; } // texture not found, load it if(!texture) { try { std::string filePathEx = g_resources.guessFilePath(filePath, "png"); // load texture file data std::stringstream fin; g_resources.readFileStream(filePathEx, fin); texture = loadTexture(fin); } catch(stdext::exception& e) { g_logger.error(stdext::format("Unable to load texture '%s': %s", fileName, e.what())); texture = g_textures.getEmptyTexture(); } if(texture) { texture->setTime(stdext::time()); texture->setSmooth(true); m_textures[filePath] = texture; } } return texture; }