//------------------------------------------------------------------------------
void Example::UpdateView(void)
{
	float tx = view_center_x;
	float ty = view_center_y;
	float sa = oglplus::Sin(oglplus::Degrees(view_angle));
	float ca = oglplus::Cos(oglplus::Degrees(view_angle));
	float sx = view_width;
	float sy = view_width/view_aspect;

	oglplus::Mat3f t(
		1.0f, 0.0f,   tx,
		0.0f, 1.0f,   ty,
		0.0f, 0.0f, 1.0f
	);
	oglplus::Mat3f r(
		 ca,  sa, 0.0f,
		-sa,  ca, 0.0f,
		0.0, 0.0, 1.0f
	);
	oglplus::Mat3f s(
		  sx, 0.0f, 0.0f,
		0.0f,   sy, 0.0f,
		0.0f, 0.0f, 1.0f
	);
	view_matrix.Set(t*r*s);
}
	void Render(void)
	{
		using namespace oglplus;

		gl.Clear().ColorBuffer().DepthBuffer();

		camera_matrix.Set(
			CamMatrixf::Orbiting(
				Vec3f(),
				9.5 - SineWave(FrameTime() / 6.0) * 7.0,
				FullCircles(FrameTime() / 9.0),
				Degrees(SineWave(FrameTime() / 30.0) * 90)
			)
		);

		model_matrix.Set(ModelMatrixf::RotationX(FullCircles(FrameTime() * 0.1)));

		textured_cube.Draw();
	}
void SpectraDefaultGPUMatrixTransf::BeginBatch() {
    using namespace oglplus;
    gl_canvas->SetCurrent(*gl_context);
    transf_prog.Use();

    Texture::Active(0);
    matrix_tex.Bind(Texture::Target::Buffer);
    prog_matrix_data.Set(0);

    Texture::Active(1);
    input_tex.Bind(Texture::Target::Buffer);
    prog_input_data.Set(1);

    prog_input_size.Set(int(in_size));

    vao.Bind();

    Context gl;
    gl.Enable(Capability::RasterizerDiscard);
}
	void Reshape(void)
	{
		using namespace oglplus;

		gl.Viewport(Width(), Height());

		projection_matrix.Set(
			CamMatrixf::PerspectiveX(
				Degrees(60),
				Aspect(),
				1, 50
			)
		);
	}
unsigned SpectraDefaultGPUMatrixTransf::BeginTransform(
	const float* input,
	std::size_t inbufsize,
	float* /*output*/,
	std::size_t /*outbufsize*/
)
{
	using namespace oglplus;

	assert(inbufsize >= in_size);

	if(current_transform >= max_transforms)
		current_transform = 0;

	input_buf.Bind(Buffer::Target::Texture);
	Buffer::SubData(
		Buffer::Target::Texture,
		current_transform*in_size,
		in_size,
		input
	);

	prog_input_offs.Set(current_transform*in_size);

	xfbs[current_transform].Bind();

	Query::Activator qrya(
		queries[current_transform],
		Query::Target::TransformFeedbackPrimitivesWritten
	);
	TransformFeedback::Activator xfba(
		TransformFeedbackPrimitiveType::Points
	);

	Context gl;
	gl.DrawArrays(PrimitiveType::Points, 0, out_size);

	xfba.Finish();
	qrya.Finish();

	TransformFeedback::BindDefault();

	return current_transform++;
}