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()); }
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); }