/** Destructor, removes all nodes of the graph. */ QuadGraph::~QuadGraph() { QuadSet::destroy(); for(unsigned int i=0; i<m_all_nodes.size(); i++) { delete m_all_nodes[i]; } if(UserConfigParams::m_track_debug) cleanupDebugMesh(); } // ~QuadGraph
/** Takes a snapshot of the driveline quads so they can be used as minimap. */ void QuadGraph::makeMiniMap(const core::dimension2du &dimension, const std::string &name, const video::SColor &fill_color, video::ITexture** oldRttMinimap, FrameBuffer** newRttMinimap) { const SColor oldClearColor = World::getWorld()->getClearColor(); World::getWorld()->setClearbackBufferColor(SColor(0, 255, 255, 255)); World::getWorld()->forceFogDisabled(true); *oldRttMinimap = NULL; *newRttMinimap = NULL; RTT* newRttProvider = NULL; IrrDriver::RTTProvider* oldRttProvider = NULL; if (CVS->isGLSL()) { m_new_rtt = newRttProvider = new RTT(dimension.Width, dimension.Height); } else { oldRttProvider = new IrrDriver::RTTProvider(dimension, name, true); } irr_driver->getSceneManager()->setAmbientLight(video::SColor(255, 255, 255, 255)); video::SColor red(128, 255, 0, 0); createMesh(/*show_invisible part of the track*/ false, /*enable_transparency*/ false, /*track_color*/ &fill_color, /*lap line color*/ &red ); m_node = irr_driver->addMesh(m_mesh, "mini_map"); #ifdef DEBUG m_node->setName("minimap-mesh"); #endif m_node->setAutomaticCulling(0); m_node->setMaterialFlag(video::EMF_LIGHTING, false); // Add the camera: // --------------- scene::ICameraSceneNode *camera = irr_driver->addCameraSceneNode(); Vec3 bb_min, bb_max; QuadSet::get()->getBoundingBox(&bb_min, &bb_max); Vec3 center = (bb_max+bb_min)*0.5f; float dx = bb_max.getX()-bb_min.getX(); float dz = bb_max.getZ()-bb_min.getZ(); // Set the scaling correctly. Also the center point (which is used // as the camera position) needs to be adjusted: the track must // be aligned to the left/top of the texture which is used (otherwise // mapPoint2MiniMap doesn't work), so adjust the camera position // that the track is properly aligned (view from the side): // c camera // / \ . // / \ <--- camera angle // / \ . // { [-] } <--- track flat (viewed from the side) // If [-] is the shorter side of the track, then the camera will // actually render the area in { } - which is the length of the // longer side of the track. // To align the [-] side to the left, the camera must be moved // the distance betwwen '{' and '[' to the right. This distance // is exacly (longer_side - shorter_side) / 2. // So, adjust the center point by this amount: if(dz > dx) { center.setX(center.getX() + (dz-dx)*0.5f); m_scaling = dimension.Width / dz; } else { center.setZ(center.getZ() + (dx-dz)*0.5f); m_scaling = dimension.Width / dx; } float range = (dx>dz) ? dx : dz; core::matrix4 projection; projection.buildProjectionMatrixOrthoLH(range /* width */, range /* height */, -1, bb_max.getY()-bb_min.getY()+1); camera->setProjectionMatrix(projection, true); irr_driver->suppressSkyBox(); irr_driver->clearLights(); // Adjust Y position by +1 for max, -1 for min - this helps in case that // the maximum Y coordinate is negative (otherwise the minimap is mirrored) // and avoids problems for tracks which have a flat (max Y = min Y) minimap. camera->setPosition(core::vector3df(center.getX(), bb_min.getY() + 1.0f, center.getZ())); //camera->setPosition(core::vector3df(center.getX() - 5.0f, bb_min.getY() - 1 - 5.0f, center.getZ() - 15.0f)); camera->setUpVector(core::vector3df(0, 0, 1)); camera->setTarget(core::vector3df(center.getX(),bb_min.getY()-1,center.getZ())); //camera->setAspectRatio(1.0f); camera->updateAbsolutePosition(); video::ITexture* texture = NULL; FrameBuffer* frame_buffer = NULL; if (CVS->isGLSL()) { frame_buffer = newRttProvider->render(camera, GUIEngine::getLatestDt()); } else { texture = oldRttProvider->renderToTexture(); delete oldRttProvider; } cleanupDebugMesh(); irr_driver->removeCameraSceneNode(camera); m_min_coord = bb_min; if (texture == NULL && frame_buffer == NULL) { Log::error("Quad Graph", "[makeMiniMap] WARNING: RTT does not appear to work," "mini-map will not be available."); } *oldRttMinimap = texture; *newRttMinimap = frame_buffer; World::getWorld()->setClearbackBufferColor(oldClearColor); World::getWorld()->forceFogDisabled(false); irr_driver->getSceneManager()->clear(); VAOManager::kill(); irr_driver->clearGlowingNodes(); irr_driver->clearLights(); irr_driver->clearForcedBloom(); irr_driver->clearBackgroundNodes(); } // makeMiniMap