bool SpriteSheet::Write(const std::string& base_name) { std::string file_name=base_name+".png"; if (WriteTexture(file_name)) { file_name=base_name+".tat"; if (WriteTextureAtlas(file_name)) { return true; } } return false; }
void BlurCubemap::DoTask(const Texture& inputTex, Texture& outputTex) { if (!inputTex.m_cubemap) { printf("Error: For this task required cubmap.\n"); return; } float s = m_blurRadius / sqrt(inputTex.m_width * inputTex.m_height); int size = outputTex.m_width*outputTex.m_height; for(int k = 0; k <6; ++k) { outputTex.m_faces[k].m_buff.resize(size); for (int i = 0;i<outputTex.m_height;i++) { for (int j = 0;j<outputTex.m_width;j++) { double2 uv = GetUVFromIndices(outputTex.m_width, outputTex.m_height, i, j); double3 v = uv2cube(uv, k); fpixel p(0.0,0.0,0.0); int iterationCount = m_blurQuality; for (int itx = 0; itx < iterationCount; ++itx) { for (int ity = 0; ity < iterationCount; ++ity) { for (int itz = 0; itz < iterationCount; ++itz) { float x = fastNormal(itx * (1.0/iterationCount), (itx+1) * (1.0/iterationCount)); float y = fastNormal(ity * (1.0/iterationCount), (ity+1) * (1.0/iterationCount)); float z = fastNormal(itz * (1.0/iterationCount), (itz+1) * (1.0/iterationCount)); double3 noise(x, y, z); double3 v_ = v; v_ += noise * s; v_.Normalize(); int face = 0; double2 uv_ = cube2uv(v_, &face); p += FetchTexture(inputTex, uv_, face); } } } p /= iterationCount; p /= iterationCount; p /= iterationCount; //p = p * (k!=5) + fpixel(((float)i)/outputTex.m_width,((float)j)/outputTex.m_width,1.0) * (k==5); WriteTexture(outputTex, uv, k, p); } } } outputTex.m_cubemap = true; }
static std::string GenFragmentShader( shaderStage_t& stage, std::vector< std::string >& uniforms ) { size_t fragTransferOffset = 2; size_t fragUnifOffset = 3; // Fragment shader.... // Unspecified alphaGen implies a default 1.0 alpha channel std::vector< std::string > fragmentSrc = { DeclPrecision(), "const float gamma = 1.0 / 2.2;", DeclTransferVar( "frag_Tex", "vec2", "in" ), #ifdef G_USE_GL_CORE DeclTransferVar( "fragment", "vec4", "out" ), #endif "void main(void) {" }; // Add our base image data std::initializer_list<std::string> data = { "uniform sampler2D sampler0;", "uniform vec4 imageTransform;", "uniform vec2 imageScaleRatio;", "vec2 applyTransform(in vec2 coords) {", "\treturn coords * imageTransform.zw * imageScaleRatio + imageTransform.xy;", "}" }; fragmentSrc.insert( fragmentSrc.begin() + fragUnifOffset, data ); fragmentSrc.push_back( "\tvec2 st = frag_Tex;" ); if ( UsesColor( stage ) ) { fragmentSrc.insert( fragmentSrc.begin() + fragTransferOffset++, DeclTransferVar( "frag_Color", "vec4", "in" ) ); } for ( const effect_t& op: stage.effects ) { // Modify the texture coordinate as necessary before we write to the texture if ( op.name == "tcModTurb" ) { fragmentSrc.insert( fragmentSrc.begin() + fragUnifOffset, "uniform float tcModTurb;" ); fragmentSrc.push_back( "\tst *= tcModTurb;" ); uniforms.push_back( "tcModTurb" ); } else if ( op.name == "tcModScroll" ) { fragmentSrc.insert( fragmentSrc.begin() + fragUnifOffset, "uniform vec4 tcModScroll;" ); fragmentSrc.push_back( "\tst += tcModScroll.xy * tcModScroll.zw;" ); uniforms.push_back( "tcModScroll" ); } else if ( op.name == "tcModRotate" ) { fragmentSrc.insert( fragmentSrc.begin() + fragUnifOffset, "uniform mat2 texRotate;" ); fragmentSrc.insert( fragmentSrc.begin() + fragUnifOffset, "uniform vec2 texCenter;" ); fragmentSrc.push_back( "\tst += texRotate * ( frag_Tex - texCenter );" ); uniforms.push_back( "texRotate" ); uniforms.push_back( "texCenter" ); } else if ( op.name == "tcModScale" ) { fragmentSrc.insert( fragmentSrc.begin() + fragUnifOffset, "uniform mat2 tcModScale;" ); fragmentSrc.push_back( "\tst = tcModScale * st;" ); uniforms.push_back( "tcModScale" ); } } switch ( stage.alphaFunc ) { case ALPHA_FUNC_UNDEFINED: WriteTexture( fragmentSrc, stage, nullptr ); break; case ALPHA_FUNC_GEQUAL_128: WriteTexture( fragmentSrc, stage, "color.a < 0.5" ); break; case ALPHA_FUNC_GTHAN_0: WriteTexture( fragmentSrc, stage, "color.a == 0" ); break; case ALPHA_FUNC_LTHAN_128: WriteTexture( fragmentSrc, stage, "color.a >= 0.5" ); break; } return JoinLines( fragmentSrc ); }