void GameClass::DrawSpike (float x, float y, float xf, float yf) const {
  if ((xf - x < cTileSize/6) ||
      (rand()%1001 < 0)) {
    float z = y + 0.2*cTileSize*(rand()%1001)/1000.0;
    al_draw_filled_triangle((x+xf)/2, z+1, xf, yf, x, yf, cWhite);
    return;
  }
  float xm = x + (xf - x)*(1 + 2*(rand()%1001)/1000.0)/4;
  DrawSpike( x, y, xm, yf);
  DrawSpike(xm, y, xf, yf);
}
void GameClass::DrawGameGrid () const {
  ALLEGRO_COLOR color(cWhite);

  for (size_t i = 0; i < gridHeight; i++) {
    for (size_t j = 0; j < gridWidth; j++) {
      int x = j*cTileSize, y = i*cTileSize,
          xf = (j+1)*cTileSize, yf = (i+1)*cTileSize;
      switch (gameGrid[i][j]) {
        case cBlock:
          if (i > 0 && gameGrid[i-1][j] == cNone)
            DrawFloor(x, y, xf, yf);
          else
            DrawBlock(x, y, xf, yf);
          break;
        case cSpike:
          DrawSpike(x, y, xf, yf);
          break;
        case cNone:
          if (i < gridHeight-1 && gameGrid[i+1][j] == cBlock)
            DrawGrass(x, y, xf, yf);
          //Nothing
        default:
          break;
      }
    }
  }

  float x = regionExit->GetX() +
      cTileSize*regionExit->GetWidth()/2;
  float y = regionExit->GetY();
  al_draw_text(hugeFont, cWhite, x, y,
      ALLEGRO_ALIGN_CENTRE, cExit[language].c_str());
}
Esempio n. 3
0
void Camera::Draw()
{
	if (!m_body) return;

	m_frustum.Enable();

	glPushAttrib(GL_ALL_ATTRIB_BITS);

	glClearColor(0,0,0,0);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	matrix4x4d trans2bg;
	Frame::GetFrameTransform(Pi::game->GetSpace()->GetRootFrame(), m_camFrame, trans2bg);
	trans2bg.ClearToRotOnly();
	Pi::game->GetSpace()->GetBackground().Draw(trans2bg);

	int num_lights = 0;
	position_system_lights(m_camFrame, Pi::game->GetSpace()->GetRootFrame(), num_lights);

	if (num_lights == 0) {
		// no lights means we're somewhere weird (eg hyperspace). fake one
		// fake one up and give a little ambient light so that we can see and
		// so that things that need lights don't explode
		float lightPos[4] = { 0,0,0,0 };
		float lightCol[4] = { 1.0, 1.0, 1.0, 0 };
		float ambCol[4] = { 1.0,1.0,1.0,0 };

		glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
		glLightfv(GL_LIGHT0, GL_DIFFUSE, lightCol);
		glLightfv(GL_LIGHT0, GL_AMBIENT, ambCol);
		glLightfv(GL_LIGHT0, GL_SPECULAR, lightCol);
		glEnable(GL_LIGHT0);

		num_lights++;
	}

	Render::State::SetNumLights(num_lights);

	float znear, zfar;
	Render::GetNearFarClipPlane(znear, zfar);
	Render::State::SetZnearZfar(znear, zfar);

	for (std::list<BodyAttrs>::iterator i = m_sortedBodies.begin(); i != m_sortedBodies.end(); ++i) {
		BodyAttrs *attrs = &(*i);

		double rad = attrs->body->GetClipRadius();

		if (!m_frustum.TestPointInfinite((*i).viewCoords, rad))
			continue;

		// draw spikes for far objects
		double screenrad = 500 * rad / attrs->camDist;      // approximate pixel size
		if (!attrs->body->IsType(Object::STAR) && screenrad < 2) {
			if (!attrs->body->IsType(Object::PLANET)) continue;
			// absolute bullshit
			double spikerad = (7 + 1.5*log10(screenrad)) * rad / screenrad;
			DrawSpike(spikerad, attrs->viewCoords, attrs->viewTransform);
		}
		else
			attrs->body->Render(attrs->viewCoords, attrs->viewTransform);
	}

	Sfx::RenderAll(Pi::game->GetSpace()->GetRootFrame(), m_camFrame);
	Render::State::UseProgram(0);
	Render::UnbindAllBuffers();

	m_body->GetFrame()->RemoveChild(m_camFrame);
	delete m_camFrame;
	m_camFrame = 0;

	glDisable(GL_LIGHT0);
	glDisable(GL_LIGHT1);
	glDisable(GL_LIGHT2);
	glDisable(GL_LIGHT3);

	glPopAttrib();

	m_frustum.Disable();
}
void CLineChartCtrl::Go()
{
	DrawSpike();

	Invalidate(FALSE);
}