Пример #1
0
/* Constructor and methods
 * */
static int shader_new(lua_State *L)
{
	push_shader(L, shared_ptr<Shader>(new Shader));
	return 1;
}
Пример #2
0
	void test_texture(system::window::Window& window, bool& running)
	{
		auto sp = window.renderer().new_shader_program();
		{
			auto vs = window.renderer().new_vertex_shader();
			vs->push_source(
				"uniform mat4 cube_ModelViewProjectionMatrix;\n"
				"void main(void)\n"
				"{\n"
				"   //gl_FrontColor = gl_Color;\n"
				"   gl_Position = cube_ModelViewProjectionMatrix * gl_Vertex;\n"
				"   gl_TexCoord[0] = gl_MultiTexCoord0;\n"
				"}\n"
			);
			sp->push_shader(std::move(vs));
		}
		{
			auto fs = window.renderer().new_fragment_shader();
			fs->push_source(
				"uniform sampler2D sampler0;"
				"void main(void) {\n"
				"   float c = texture2D(sampler0, vec2(gl_TexCoord[0])).r;\n"
				"   gl_FragColor = vec4(c,c,c,1);\n"
				"}\n"
			);
			sp->push_shader(std::move(fs));
		}
		sp->finalize();
		sp->parameter("cube_ModelViewProjectionMatrix");

		auto tex = window.renderer().new_texture(
			renderer::PixelFormat::red,
			24,
			24,
			renderer::PixelFormat::red,
			renderer::ContentPacking::uint8,
			nullptr
		);

		{
			char buf[24*24];
			for (int x = 0; x < 24; ++x)
				for (int y = 0; y < 24; ++y)
				{
					buf[x + y * 24] = (x > 4 && x < 19 ? 255 : 64);
				}
			tex->set_data(0, 0, 24, 24,
			              renderer::PixelFormat::red,
			              renderer::ContentPacking::uint8,
			              buf);
		}

		sp->parameter("sampler0") = *tex;

		auto vb = window.renderer().new_vertex_buffer();
		{
			vector::Vector2f vertices[] = {
				vector::Vector2f{10,     10},
				vector::Vector2f{630,    10},
				vector::Vector2f{630,    470},
				vector::Vector2f{10,     470},
			};
			vb->push_static_content(
				renderer::ContentKind::vertex,
				vertices,
				4
			);

			vector::Vector2f tex_coords[] = {
				vector::Vector2f{0,     0},
				vector::Vector2f{1,     0},
				vector::Vector2f{1,     1},
				vector::Vector2f{0,     1},
			};
			vb->push_static_content(
				renderer::ContentKind::tex_coord0,
				tex_coords,
				4
			);
		}
		vb->finalize();

		auto ib = window.renderer().new_index_buffer();
		{
			unsigned int indices[] = {0,1,2,3};
			ib->push_static_content(
				renderer::ContentKind::index,
				indices,
				4
			);
		}
		ib->finalize();

		while (running)
		{
			window.renderer().clear(
				renderer::BufferBit::color |
				renderer::BufferBit::depth
			);
			window.poll();
			if (auto painter = window.renderer().begin(renderer::Mode::_2d))
				{
					painter.bind(*vb);
					painter.bind(*sp);
					painter.bind(*tex);
					painter.draw_elements(renderer::DrawMode::quads, *ib, 0, 4);
				}

			window.renderer().swap_buffers();

			::usleep(30);
		}
	}
Пример #3
0
	void test_normal(system::window::Window& window,
	                 bool const& running)
	{
		auto vb = window.renderer().new_vertex_buffer();
		auto ib = window.renderer().new_index_buffer();
		auto sp = window.renderer().new_shader_program();
		renderer::Renderer::TexturePtr tex0;
		try {
			tex0 = std::move(window.renderer().new_texture("/home/hotgloupi/pif.png"));
		} catch(cube::exception::Exception const&) {
			tex0 = std::move(window.renderer().new_texture("/home/hotgloupi/Downloads/Water_snail_Rex_2.jpg"));
		}

		font::Font f(window.renderer(),
			//"/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttf",
			"/usr/share/fonts/truetype/droid/DroidSerif-Regular.ttf",
			48);
		text::Text text(f, u"Ceci est un test, et ça aussi !");

		vector::Vector2f vertices[] = {
			vector::Vector2f{10,     10},
			vector::Vector2f{630,    10},
			vector::Vector2f{630,    470},
			vector::Vector2f{10,     470},
		};

		vb->push_static_content(
			renderer::ContentKind::vertex,
			vertices,
			4
		);

		vector::Vector2f tex_coords[] = {
			vector::Vector2f{0,     0},
			vector::Vector2f{1,     0},
			vector::Vector2f{1,     1},
			vector::Vector2f{0,     1},
		};
		vb->push_static_content(
			renderer::ContentKind::tex_coord0,
			tex_coords,
			4
		);

		color::Color3f colors[] = {
			{"black"}, {"green"}, {"gray"}, {"blue"},
		};
		vb->push_static_content(
			renderer::ContentKind::color,
			colors,
			4
		);

		unsigned int indices[] = {0,1,2,3};
		ib->push_static_content(
			renderer::ContentKind::index,
			indices,
			4
		);

		{
			auto vs = window.renderer().new_vertex_shader();
			vs->push_source(
				"uniform mat4 cube_ModelViewProjectionMatrix;\n"
				"void main(void)\n"
				"{\n"
				"   //gl_FrontColor = gl_Color;\n"
				"   gl_Position = cube_ModelViewProjectionMatrix * gl_Vertex;\n"
				"   gl_TexCoord[0] = gl_MultiTexCoord0;\n"
				"}\n"
			);
			sp->push_shader(std::move(vs));
		}
		{
			auto fs = window.renderer().new_fragment_shader();
			fs->push_source(
				"uniform sampler2D sampler0;"
				"void main(void) {\n"
				"   float r = texture2D(sampler0, vec2(gl_TexCoord[0])).r;\n"
				"   gl_FragColor = vec4(0,0,1,r);\n"
				"}\n"
			);
			sp->push_shader(std::move(fs));
		}

		sp->finalize();
		vb->finalize();
		ib->finalize();


		sp->parameter("cube_ModelViewProjectionMatrix");
		sp->parameter("sampler0") = *tex0;

		if (!tex0)
			throw "pif";

		while (running)
		{
			window.renderer().clear(
				renderer::BufferBit::color |
				renderer::BufferBit::depth
			);
			window.poll();
			if (auto painter = window.renderer().begin(renderer::Mode::_2d))
				{
					painter.bind(*sp);
					//painter.with(*vb, *tex0)->draw_elements(
					//	renderer::DrawMode::quads, *ib
					//);
					painter.draw(text, sp->parameter("sampler0"));

				}

			window.renderer().swap_buffers();

			::usleep(30);
		}
	}
Пример #4
0
int shader_new(lua_State *L, const char *vertex, const char *fragment) {
    char *fault = "";
    char log[1024];
    GLint status;
    GLsizei log_len;
    GLuint fs = 0, vs = 0, po = 0;

    // Pixel
    vs = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vs, 1, &vertex, NULL);
    glCompileShader(vs);

    glGetObjectParameterivARB(vs, GL_COMPILE_STATUS, &status);
    if (!status) {
        fault = "compiling vertex shader";
        glGetShaderInfoLog(vs, sizeof(log), &log_len, log);
        if (log_len > 0) 
            goto error;
    }

    // Fragment
    fs =  glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fs, 1, &fragment, NULL);
    glCompileShader(fs);

    glGetObjectParameterivARB(fs, GL_COMPILE_STATUS, &status);
    if (!status) {
        fault = "compiling fragment shader";
        glGetShaderInfoLog(fs, sizeof(log), &log_len, log);
        if (log_len > 0) 
            goto error;
    }

    // Program Object
    po = glCreateProgram();
    glAttachShader(po, vs);
    glAttachShader(po, fs);
    glLinkProgram(po);

    glGetProgramiv(po, GL_LINK_STATUS, &status);
    if (!status) {
        fault = "linking program";
        glGetProgramInfoLog(po, sizeof(log), &log_len, log);
        if (log_len > 0) 
            goto error;
    }

    shader_t *shader = push_shader(L);
    shader->fs = fs;
    shader->vs = vs;
    shader->po = po;
    return 1;

error:
    if (po)
        glDeleteProgram(po);
    if (vs)
        glDeleteShader(vs);
    if (fs)
        glDeleteShader(fs);
    return luaL_error(L, "While %s: %s", fault, log);
}