Beispiel #1
0
void ScreenFlow::display(GlContext *ctx)
{
	glPushMatrix();
	glTranslated(-1.85, 0.65, 0.0);
	GlTextRenderer::instance()->useFont("assets/fonts/corbel.ttf", 192);
	GlTextRenderer::instance()->setAlignment(GlTextRenderer::Alignment::RIGHT);
	GlTextRenderer::instance()->write(0.0f, 0.0f, 1.0 / 960.0f, 1.0 / 960.0f, breadcrumb(), 0.9f);
	glPopMatrix();

	//

	int32_t leftLimit = position_ - 4; leftLimit = (leftLimit < 0) ? 0 : leftLimit;
	int32_t rightLimit = position_ + 5; rightLimit = (rightLimit >= items_.size()) ? items_.size() : rightLimit;

	double mu = -cos(animMu_ * 3.1415926) * 0.5 + 0.5;
	double animPosition = (1.0 - mu) * double(animCurrent_) + mu * double(animNext_);

	for (int32_t i = leftLimit; i < rightLimit; i++)
	{
		glPushMatrix();

		double animDelta = double(i) - double(animPosition);

		glTranslated(animDelta, 0.0, 0.0);

		double rotMax = fmax(-1.0, fmin(1.0, animDelta));

		{
			glTranslated(animDelta * 0.25, 0.0, -abs(animDelta));
			glRotatef(-rotMax * 45.0f, 0.0f, 1.0f, 0.0f);
		}

		glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
		GlTexture* demoScreenshot = items_[i]->screenshot();
		if (demoScreenshot)
			demoScreenshot->bind(0);

		glBegin(GL_QUADS);
		glColor4f(1.0f, 1.0f, 1.0f, 1.0f / (1.0 + sqrtf(fabs(float(animDelta) * 5.0f))));
		glTexCoord2f(0.0f, 1.0f); glVertex2f(-0.96f, -0.6f);
		glTexCoord2f(1.0f, 1.0f); glVertex2f(0.96f, -0.6f);
		glTexCoord2f(1.0f, 0.0f); glVertex2f(0.96f, 0.6f);
		glTexCoord2f(0.0f, 0.0f); glVertex2f(-0.96f, 0.6f);
		glEnd();

		if (demoScreenshot)
			demoScreenshot->release();

		glPopMatrix();
	}

	//

	glTranslated(-1.1, -0.8, 0.0);

	GlTextRenderer::instance()->useFont("assets/fonts/corbel.ttf", 96);
	GlTextRenderer::instance()->setAlignment(GlTextRenderer::Alignment::RIGHT);
	GlTextRenderer::instance()->write(0.0f, 0.0f, 1.0f / 960.0f, 1.0f / 960.0f, std::string("Title: ").append(items_[position_]->title()), 0.9f);
	glTranslated(0.0, -0.15, 0.0);
	GlTextRenderer::instance()->write(0.0f, 0.0f, 1.0f / 960.0f, 1.0f / 960.0f, std::string("Author: ").append(items_[position_]->author()), 0.9f);

	animMu_ += ctx->delta() * 5.0;
	if (animMu_ > 1.0)
		animMu_ = 1.0;
}