//Note: models get some ambient colour added when dark as the camera moves closer void CityOnPlanet::Render(Graphics::Renderer *r, const Camera *camera, const SpaceStation *station, const vector3d &viewCoords, const matrix4x4d &viewTransform, double illumination, double minIllumination) { matrix4x4d rot[4]; station->GetRotMatrix(rot[0]); // change detail level if necessary if (m_detailLevel != Pi::detail.cities) { RemoveStaticGeomsFromCollisionSpace(); AddStaticGeomsToCollisionSpace(); } rot[0] = viewTransform * rot[0]; for (int i=1; i<4; i++) { rot[i] = rot[0] * matrix4x4d::RotateYMatrix(M_PI*0.5*double(i)); } const Graphics::Frustum frustum = Graphics::Frustum::FromGLState(); //modelview seems to be always identity memset(&cityobj_params, 0, sizeof(LmrObjParams)); cityobj_params.time = Pi::game->GetTime(); for (std::vector<BuildingDef>::const_iterator i = m_buildings.begin(); i != m_buildings.end(); ++i) { if (!(*i).isEnabled) continue; vector3d pos = viewTransform * (*i).pos; if (!frustum.TestPoint(pos, (*i).clipRadius)) continue; const Color oldSceneAmbientColor = r->GetAmbientColor(); // fade conditions for models double fadeInEnd, fadeInLength; if (Graphics::AreShadersEnabled()) { fadeInEnd = 10.0; fadeInLength = 500.0; } else { fadeInEnd = 2000.0; fadeInLength = 6000.0; } FadeInModelIfDark(r, (*i).clipRadius, pos.Length(), fadeInEnd, fadeInLength, illumination, minIllumination); matrix4x4f _rot; for (int e=0; e<16; e++) _rot[e] = float(rot[(*i).rotation][e]); _rot[12] = float(pos.x); _rot[13] = float(pos.y); _rot[14] = float(pos.z); (*i).model->Render(_rot, &cityobj_params); // restore old ambient colour if (illumination <= minIllumination) r->SetAmbientColor(oldSceneAmbientColor); } }
void CityOnPlanet::Render(Graphics::Renderer *r, const Camera *camera, const SpaceStation *station, const vector3d &viewCoords, const matrix4x4d &viewTransform) { // Early frustum test of whole city. const vector3d stationPos = viewTransform * (station->GetPosition() + m_realCentre); const Graphics::Frustum frustum = camera->GetFrustum(); //modelview seems to be always identity if (!frustum.TestPoint(stationPos, m_clipRadius)) return; matrix4x4d rot[4]; matrix4x4f rotf[4]; rot[0] = station->GetOrient(); // change detail level if necessary if (m_detailLevel != Pi::detail.cities) { RemoveStaticGeomsFromCollisionSpace(); AddStaticGeomsToCollisionSpace(); } rot[0] = viewTransform * rot[0]; for (int i=1; i<4; i++) { rot[i] = rot[0] * matrix4x4d::RotateYMatrix(M_PI*0.5*double(i)); } for (int i=0; i<4; i++) { for (int e=0; e<16; e++) { rotf[i][e] = float(rot[i][e]); } } for (std::vector<BuildingDef>::const_iterator iter=m_enabledBuildings.begin(), itEND=m_enabledBuildings.end(); iter != itEND; ++iter) { const vector3d pos = viewTransform * (*iter).pos; const vector3f posf(pos); if (!frustum.TestPoint(pos, (*iter).clipRadius)) continue; matrix4x4f _rot(rotf[(*iter).rotation]); _rot.SetTranslate(posf); (*iter).model->Render(_rot); } }
void Render(Graphics::Renderer *renderer, const vector3d &campos, const matrix4x4d &modelView, const Graphics::Frustum &frustum) { if (!frustum.TestPoint(clipCentroid, clipRadius)) return; Graphics::Material *mat = gasSphere->GetSurfaceMaterial(); Graphics::RenderState *rs = gasSphere->GetSurfRenderState(); const vector3d relpos = clipCentroid - campos; renderer->SetTransform(modelView * matrix4x4d::Translation(relpos)); Pi::statSceneTris += 2*(ctx->edgeLen-1)*(ctx->edgeLen-1); renderer->DrawBufferIndexed(m_vertexBuffer.get(), ctx->indexBuffer.Get(), rs, mat); }
void CityOnPlanet::Render(Graphics::Renderer *r, const SpaceStation *station, const vector3d &viewCoords, const matrix4x4d &viewTransform) { matrix4x4d rot[4]; station->GetRotMatrix(rot[0]); // change detail level if necessary if (m_detailLevel != Pi::detail.cities) { RemoveStaticGeomsFromCollisionSpace(); AddStaticGeomsToCollisionSpace(); } rot[0] = viewTransform * rot[0]; for (int i=1; i<4; i++) { rot[i] = rot[0] * matrix4x4d::RotateYMatrix(M_PI*0.5*double(i)); } Graphics::Frustum frustum = Graphics::Frustum::FromGLState(); //modelview seems to be always identity memset(&cityobj_params, 0, sizeof(LmrObjParams)); cityobj_params.time = Pi::game->GetTime(); for (std::vector<BuildingDef>::const_iterator i = m_buildings.begin(); i != m_buildings.end(); ++i) { if (!(*i).isEnabled) continue; vector3d pos = viewTransform * (*i).pos; if (!frustum.TestPoint(pos, (*i).clipRadius)) continue; matrix4x4f _rot; for (int e=0; e<16; e++) _rot[e] = float(rot[(*i).rotation][e]); _rot[12] = float(pos.x); _rot[13] = float(pos.y); _rot[14] = float(pos.z); (*i).model->Render(_rot, &cityobj_params); } }
void GeoPatch::Render(vector3d &campos, const Graphics::Frustum &frustum) { if (kids[0]) { for (int i=0; i<NUM_KIDS; i++) kids[i]->Render(campos, frustum); } else if (heights.Valid()) { _UpdateVBOs(); if (!frustum.TestPoint(clipCentroid, clipRadius)) return; vector3d relpos = clipCentroid - campos; glPushMatrix(); glTranslated(relpos.x, relpos.y, relpos.z); Pi::statSceneTris += 2*(ctx->edgeLen-1)*(ctx->edgeLen-1); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_COLOR_ARRAY); // update the indices used for rendering ctx->updateIndexBufferId(determineIndexbuffer()); glBindBufferARB(GL_ARRAY_BUFFER, m_vbo); glVertexPointer(3, GL_FLOAT, sizeof(GeoPatchContext::VBOVertex), 0); glNormalPointer(GL_FLOAT, sizeof(GeoPatchContext::VBOVertex), reinterpret_cast<void *>(3*sizeof(float))); glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(GeoPatchContext::VBOVertex), reinterpret_cast<void *>(6*sizeof(float))); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, ctx->indices_vbo); glDrawElements(GL_TRIANGLES, ctx->indices_tri_count*3, GL_UNSIGNED_SHORT, 0); glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, 0); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glPopMatrix(); } }
void CityOnPlanet::Render(Graphics::Renderer *r, const Graphics::Frustum &frustum, const SpaceStation *station, const vector3d &viewCoords, const matrix4x4d &viewTransform) { // Early frustum test of whole city. const vector3d stationPos = viewTransform * (station->GetPosition() + m_realCentre); //modelview seems to be always identity if (!frustum.TestPoint(stationPos, m_clipRadius)) return; matrix4x4d rot[4]; matrix4x4f rotf[4]; rot[0] = station->GetOrient(); // change detail level if necessary const bool bDetailChanged = m_detailLevel != Pi::detail.cities; if (bDetailChanged) { RemoveStaticGeomsFromCollisionSpace(); AddStaticGeomsToCollisionSpace(); } rot[0] = viewTransform * rot[0]; for (int i=1; i<4; i++) { rot[i] = rot[0] * matrix4x4d::RotateYMatrix(M_PI*0.5*double(i)); } for (int i=0; i<4; i++) { for (int e=0; e<16; e++) { rotf[i][e] = float(rot[i][e]); } } Uint32 uCount = 0; std::vector<Uint32> instCount; std::vector< std::vector<matrix4x4f> > transform; instCount.resize(s_buildingList.numBuildings); transform.resize(s_buildingList.numBuildings); memset(&instCount[0], 0, sizeof(Uint32) * s_buildingList.numBuildings); for(Uint32 i=0; i<s_buildingList.numBuildings; i++) { transform[i].reserve(m_buildingCounts[i]); } for (std::vector<BuildingDef>::const_iterator iter=m_enabledBuildings.begin(), itEND=m_enabledBuildings.end(); iter != itEND; ++iter) { const vector3d pos = viewTransform * (*iter).pos; const vector3f posf(pos); if (!frustum.TestPoint(pos, (*iter).clipRadius)) continue; matrix4x4f _rot(rotf[(*iter).rotation]); _rot.SetTranslate(posf); // increment the instance count and store the transform instCount[(*iter).instIndex]++; transform[(*iter).instIndex].push_back( _rot ); ++uCount; } // render the building models using instancing for(Uint32 i=0; i<s_buildingList.numBuildings; i++) { s_buildingList.buildings[i].resolvedModel->Render(transform[i]); } r->GetStats().AddToStatCount(Graphics::Stats::STAT_BUILDINGS, uCount); r->GetStats().AddToStatCount(Graphics::Stats::STAT_CITIES, 1); }