Exemple #1
0
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;
}
Exemple #3
0
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 );
}