//-----------------------------------------------------------------------
double PUNoise3D::noise(double x, double y, double z)
{
    double n = 0;
    double freq = _frequency;
    double ampl = _amplitude;
    for (unsigned short u = 0; u < _octaves; ++u) 
    { 
        n += genNoise(x * freq, y * freq, z * freq) * ampl;
        freq *= 2;
        ampl *= _persistence;
    }
    return n;
}
void drawNoise(sf::RenderWindow &window, sf::Vector2f** gradients, size_t size, float per){
	
	for(int i = 0; i < 640; ++i){
		for(int j = 0; j < 640; ++j){
			float k = genNoise(sf::Vector2f(i,j), gradients, size);
			//k *= per;
			//if(k > 2.01 || k < 0.01) std::cout << k;
			//std::cout << k << "\n";
			//float k = static_cast <float> (rand()) / static_cast <float> (RAND_MAX);
			//std::cout << k << std::endl;
			pixels[i][j] += k;
		}
	}
}
Ejemplo n.º 3
0
void Engine::noisetest()
{
    bool quit = false;
    bool needsrefresh = false;
    bool drawmask = false;
    bool drawthreshold = false;
    enum _MODES{MODE_SCALE, MODE_PERSISTENCE, MODE_OCTAVES};
    int xshift = 0;
    int yshift = 0;
    int mode = MODE_SCALE;

    float scale = 9;
    float scale_unit = 0.5;
    float octaves = 6;
    float octaves_unit = 1.0;
    float persistence = 0.7;
    float persistence_unit = 0.1;
    int width = m_ScreenTilesHeight;
    int height = m_ScreenTilesHeight;

    //find smallest dimension for mask map
    int mdim = width;
    int threshold = 60;
    float maskintensity = 1.f; // percentage 1.0 = 100%
    if(height < width) mdim = height;
    sf::Vector2i mcenter(mdim/2, mdim/2);
    float centerdistance = getDistance(0,0, mcenter.x, mcenter.y);
    //float gradientdist = centerdistance * maskintensity;
    float scaler = 255.f / centerdistance;

    sf::Vector2u tiledim = m_Curses->getTileSize();

    std::vector< std::vector<int> > noisemap = genNoise(width, height, 0,0, persistence, octaves, scale);
    std::vector< std::vector<int> > maskmap;

    //create mask map
    maskmap.resize(mdim);
    for(int i = 0; i < mdim; i++)
    {
        for(int n = 0; n < mdim; n++) maskmap[i].push_back(0);
    }

    //creat mask map gradient
    for(int i = 0; i < mdim; i++)
    {
        for(int n = 0; n < mdim; n++)
        {
            //if(getDistance(mcenter.x, mcenter.y, n, i) > gradientdist)
            maskmap[i][n] = getDistance(mcenter.x, mcenter.y, n, i) * scaler;
        }
    }

    //draw noise loop
    sf::RectangleShape tile(sf::Vector2f(tiledim.x, tiledim.y));

    while(!quit)
    {
        m_Screen->clear();

        sf::Event event;

        while(m_Screen->pollEvent(event))
        {
            if(event.type == sf::Event::KeyPressed)
            {
                if(event.key.code == sf::Keyboard::Escape) quit = true;
                else if(event.key.code == sf::Keyboard::Left) xshift--;
                else if(event.key.code == sf::Keyboard::Right) xshift++;
                else if(event.key.code == sf::Keyboard::Up) yshift--;
                else if(event.key.code == sf::Keyboard::Down) yshift++;
                else if(event.key.code == sf::Keyboard::S) mode = MODE_SCALE;
                else if(event.key.code == sf::Keyboard::P) mode = MODE_PERSISTENCE;
                else if(event.key.code == sf::Keyboard::O) mode = MODE_OCTAVES;
                else if(event.key.code == sf::Keyboard::M) drawmask = !drawmask;
                else if(event.key.code == sf::Keyboard::T) drawthreshold = !drawthreshold;
                else if(event.key.code == sf::Keyboard::Add)
                {
                    switch(mode)
                    {
                    case MODE_SCALE:
                        scale += scale_unit;
                        break;
                    case MODE_PERSISTENCE:
                        persistence += persistence_unit;
                        break;
                    case MODE_OCTAVES:
                        octaves += octaves_unit;
                        break;
                    }
                }
                else if(event.key.code == sf::Keyboard::Subtract)
                {
                    switch(mode)
                    {
                    case MODE_SCALE:
                        scale -= scale_unit;
                        break;
                    case MODE_PERSISTENCE:
                        persistence -= persistence_unit;
                        break;
                    case MODE_OCTAVES:
                        octaves -= octaves_unit;
                        break;
                    }
                }
                needsrefresh = true;

            }
        }

        if(needsrefresh)
        {
            std::cout << "mode = " << mode << std::endl;
            std::cout << "x = " << xshift << "      y = " << yshift << std::endl;
            std::cout << "persistence = " << persistence << std::endl;
            std::cout << "scale       = " << scale << std::endl;
            std::cout << "octaves     = " << octaves << std::endl;
            std::cout << "\n\n";

            noisemap = genNoise(width, height, 0 + xshift, 0 + yshift, persistence, octaves, scale);
            needsrefresh = false;

            //create mask if necessary
            if(drawmask)
            {
                for(int i = 0; i < mdim; i++)
                {
                    for(int n = 0; n < mdim; n++)
                    {
                        noisemap[i][n] -= maskmap[i][n];

                        //if applying threshold
                        if(drawthreshold)
                        {
                            if(noisemap[i][n] < threshold) noisemap[i][n] = 0;
                            else noisemap[i][n] = 255;
                        }
                    }
                }



            }
        }


        //draw
        for(int i = 0; i < int(noisemap.size()); i++)
        {
            for(int n = 0; n < int(noisemap[0].size()); n++)
            {
                tile.setPosition(n*tiledim.x, i*tiledim.y);
                int shade = noisemap[i][n];
                if(shade < 0) shade = 0;

                tile.setFillColor(sf::Color(shade,shade,shade));

                m_Screen->draw(tile);
            }
        }

        //display
        m_Screen->display();

    }
}
Ejemplo n.º 4
0
//==============================================================================
void Ssao::initInternal(const ConfigSet& config)
{
	m_enabled = config.get("pps.ssao.enabled");

	if(!m_enabled)
	{
		return;
	}

	m_blurringIterationsCount = 
		config.get("pps.ssao.blurringIterationsCount");

	//
	// Init the widths/heights
	//
	const F32 quality = config.get("pps.ssao.renderingQuality");

	m_width = quality * (F32)m_r->getWidth();
	alignRoundUp(16, m_width);
	m_height = quality * (F32)m_r->getHeight();
	alignRoundUp(16, m_height);

	//
	// create FBOs
	//
	createFb(m_hblurFb, m_hblurRt);
	createFb(m_vblurFb, m_vblurRt);

	//
	// noise texture
	//
	GlCommandBufferHandle cmdb;
	cmdb.create(&getGlDevice());

	GlClientBufferHandle noise;
	noise.create(
		cmdb, sizeof(Vec3) * NOISE_TEX_SIZE * NOISE_TEX_SIZE, nullptr);

	genNoise((Vec3*)noise.getBaseAddress(), 
		(Vec3*)((U8*)noise.getBaseAddress() + noise.getSize()));

	GlTextureHandle::Initializer tinit;

	tinit.m_width = tinit.m_height = NOISE_TEX_SIZE;
	tinit.m_target = GL_TEXTURE_2D;
	tinit.m_internalFormat = GL_RGB32F;
	tinit.m_format = GL_RGB;
	tinit.m_type = GL_FLOAT;
	tinit.m_filterType = GlTextureHandle::Filter::NEAREST;
	tinit.m_repeat = true;
	tinit.m_mipmapsCount = 1;
	tinit.m_data[0][0] = noise;

	m_noiseTex.create(cmdb, tinit);

	//
	// Kernel
	//
	String kernelStr(getAllocator());
	Array<Vec3, KERNEL_SIZE> kernel;

	genKernel(kernel.begin(), kernel.end());
	kernelStr = "vec3[](";
	for(U i = 0; i < kernel.size(); i++)
	{
		String tmp(getAllocator());

		tmp.sprintf("vec3(%f, %f, %f) %s",
			kernel[i].x(), kernel[i].y(), kernel[i].z(),
			(i != kernel.size() - 1) ? ", " : ")");

		kernelStr += tmp;
	}

	//
	// Shaders
	//
	m_uniformsBuff.create(cmdb, GL_SHADER_STORAGE_BUFFER, 
		sizeof(ShaderCommonUniforms), GL_DYNAMIC_STORAGE_BIT);

	String pps(getAllocator());

	// main pass prog
	pps.sprintf(
		"#define NOISE_MAP_SIZE %u\n"
		"#define WIDTH %u\n"
		"#define HEIGHT %u\n"
		"#define KERNEL_SIZE %u\n"
		"#define KERNEL_ARRAY %s\n",
		NOISE_TEX_SIZE, m_width, m_height, KERNEL_SIZE, &kernelStr[0]);

	m_ssaoFrag.loadToCache(&getResourceManager(),
		"shaders/PpsSsao.frag.glsl", pps.toCString(), "r_");


	m_ssaoPpline = m_r->createDrawQuadProgramPipeline(
		m_ssaoFrag->getGlProgram());

	// blurring progs
	const char* SHADER_FILENAME = 
		"shaders/VariableSamplingBlurGeneric.frag.glsl";

	pps.sprintf(
		"#define HPASS\n"
		"#define COL_R\n"
		"#define IMG_DIMENSION %u\n"
		"#define SAMPLES 7\n", 
		m_height);

	m_hblurFrag.loadToCache(&getResourceManager(),
		SHADER_FILENAME, pps.toCString(), "r_");

	m_hblurPpline = m_r->createDrawQuadProgramPipeline(
		m_hblurFrag->getGlProgram());

	pps.sprintf(
		"#define VPASS\n"
		"#define COL_R\n"
		"#define IMG_DIMENSION %u\n"
		"#define SAMPLES 7\n", 
		m_width);

	m_vblurFrag.loadToCache(&getResourceManager(),
		SHADER_FILENAME, pps.toCString(), "r_");

	m_vblurPpline = m_r->createDrawQuadProgramPipeline(
		m_vblurFrag->getGlProgram());

	cmdb.flush();
}