kdeglwidget.cpp
来自「celestia源代码」· C++ 代码 · 共 496 行 · 第 1/2 页
CPP
496 行
/*************************************************************************** kdeglwidget.cpp - description ------------------- begin : Tue Jul 16 2002 copyright : (C) 2002 by Christophe Teyssier email : chris@teyssier.org ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/#include "kdeglwidget.h"#include <kaccel.h>#include <unistd.h> #include <celengine/gl.h>//#include <celengine/glext.h>#include <celengine/celestia.h>#include <celengine/starbrowser.h>#include <kmainwindow.h>#include <kconfig.h>#include <qcursor.h>#include <qpaintdevicemetrics.h>#ifndef DEBUG# define G_DISABLE_ASSERT#endif#include "celmath/vecmath.h"#include "celmath/quaternion.h"#include "celmath/mathlib.h"#include "celengine/astro.h"#include "celutil/util.h"#include "celutil/filetype.h"#include "celutil/debug.h"#include "imagecapture.h"#include "celestiacore.h"#include "celengine/simulation.h"#include "celengine/glcontext.h"#include "kdeapp.h"#include <math.h>#include <vector>KdeGlWidget::KdeGlWidget( QWidget* parent, const char* name, CelestiaCore* core) : QGLWidget( parent, name ){ actionColl = ((KdeApp*)parent)->actionCollection(); setFocusPolicy(QWidget::ClickFocus); appCore = core; appRenderer=appCore->getRenderer(); appSim = appCore->getSimulation(); setCursor(QCursor(Qt::CrossCursor)); currentCursor = CelestiaCore::CrossCursor; setMouseTracking(true); appCore->setCursorHandler(this); lastX = lastY = 0;}/*! Release allocated resources*/KdeGlWidget::~KdeGlWidget(){}/*! Paint the box. The actual openGL commands for drawing the box are performed here.*/void KdeGlWidget::paintGL(){ appCore->draw();}/*! Set up the OpenGL rendering state, and define display list*/void KdeGlWidget::initializeGL(){ if (!appCore->initRenderer()) {// cerr << "Failed to initialize renderer.\n"; exit(1); } time_t curtime=time(NULL); appCore->start((double) curtime / 86400.0 + (double) astro::Date(1970, 1, 1)); localtime(&curtime); /* Only doing this to set timezone as a side effect*/ appCore->setTimeZoneBias(-timezone+3600*daylight); appCore->setTimeZoneName(tzname[daylight?0:1]); KGlobal::config()->setGroup("Preferences"); if (KGlobal::config()->hasKey("RendererFlags")) appRenderer->setRenderFlags(KGlobal::config()->readNumEntry("RendererFlags")); if (KGlobal::config()->hasKey("OrbitMask")) appRenderer->setOrbitMask(KGlobal::config()->readNumEntry("OrbitMask")); if (KGlobal::config()->hasKey("LabelMode")) appRenderer->setLabelMode(KGlobal::config()->readNumEntry("LabelMode")); if (KGlobal::config()->hasKey("AmbientLightLevel")) appRenderer->setAmbientLightLevel(KGlobal::config()->readDoubleNumEntry("AmbientLightLevel")); if (KGlobal::config()->hasKey("FaintestVisible")) appCore->setFaintest(KGlobal::config()->readDoubleNumEntry("FaintestVisible")); if (KGlobal::config()->hasKey("HudDetail")) appCore->setHudDetail(KGlobal::config()->readNumEntry("HudDetail")); if (KGlobal::config()->hasKey("TimeZoneBias")) appCore->setTimeZoneBias(KGlobal::config()->readNumEntry("TimeZoneBias")); if (KGlobal::config()->hasKey("MinFeatureSize")) appRenderer->setMinimumFeatureSize(KGlobal::config()->readNumEntry("MinFeatureSize")); if (!appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_Basic)) ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathBasic")))->setEnabled(false); if (!appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_Multitexture)) ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathMultitexture")))->setEnabled(false); if (!appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_NvCombiner)) ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathNvCombiner")))->setEnabled(false); if (!appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_DOT3_ARBVP)) ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathDOT3ARBVP")))->setEnabled(false); if (!appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_NvCombiner_NvVP)) ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathNvCombinerNvVP")))->setEnabled(false); if (!appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_NvCombiner_ARBVP)) ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathNvCombinerARBVP")))->setEnabled(false); if (!appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_ARBFP_ARBVP)) ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathARBFPARBVP")))->setEnabled(false); if (!appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_NV30)) ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathNV30")))->setEnabled(false); if (!appCore->getRenderer()->getGLContext()->renderPathSupported(GLContext::GLPath_GLSL)) ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathGLSL")))->setEnabled(false); if (KGlobal::config()->hasKey("RenderPath")) { GLContext::GLRenderPath path = (GLContext::GLRenderPath)KGlobal::config()->readNumEntry("RenderPath"); if (appCore->getRenderer()->getGLContext()->renderPathSupported(path)) { appCore->getRenderer()->getGLContext()->setRenderPath(path); } } switch (appCore->getRenderer()->getGLContext()->getRenderPath()) { case GLContext::GLPath_Basic: ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathBasic")))->setChecked(true); break; case GLContext::GLPath_Multitexture: ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathMultitexture")))->setChecked(true); break; case GLContext::GLPath_NvCombiner: ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathNvCombiner")))->setChecked(true); break; case GLContext::GLPath_DOT3_ARBVP: ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathDOT3ARBVP")))->setChecked(true); break; case GLContext::GLPath_NvCombiner_NvVP: ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathNvCombinerNvVP")))->setChecked(true); break; case GLContext::GLPath_NvCombiner_ARBVP: ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathNvCombinerARBVP")))->setChecked(true); break; case GLContext::GLPath_ARBFP_ARBVP: ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathARBFPARBVP")))->setChecked(true); break; case GLContext::GLPath_NV30: ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathNV30")))->setChecked(true); break; case GLContext::GLPath_GLSL: ((KToggleAction*)(((KdeApp*)parentWidget())->action("renderPathGLSL")))->setChecked(true); break; } KGlobal::config()->setGroup(0); QPaintDeviceMetrics pdm(this); appCore->setScreenDpi(pdm.logicalDpiY());}void KdeGlWidget::resizeGL( int w, int h ){/* QPaintDeviceMetrics pdm(this); double fov = 2 * atan(h / (pdm.logicalDpiY() / 25.4) / 2. / 400.); appCore->getSimulation()->getActiveObserver()->setFOV(fov);*/ appCore->resize(w, h);}void KdeGlWidget::mouseMoveEvent( QMouseEvent* m ){ int x = (int) m->x(); int y = (int) m->y(); int buttons = 0; if (m->state() & LeftButton) buttons |= CelestiaCore::LeftButton; if (m->state() & MidButton) buttons |= CelestiaCore::MiddleButton; if (m->state() & RightButton) buttons |= CelestiaCore::RightButton; if (m->state() & ShiftButton) buttons |= CelestiaCore::ShiftKey; if (m->state() & ControlButton) buttons |= CelestiaCore::ControlKey; if (buttons != 0) appCore->mouseMove(x - lastX, y - lastY, buttons); else appCore->mouseMove(x, y); lastX = x; lastY = y;}void KdeGlWidget::mousePressEvent( QMouseEvent* m ){ lastX = (int) m->x(); lastY = (int) m->y(); if (m->button() == LeftButton) appCore->mouseButtonDown(m->x(), m->y(), CelestiaCore::LeftButton); else if (m->button() == MidButton) appCore->mouseButtonDown(m->x(), m->y(), CelestiaCore::MiddleButton); else if (m->button() == RightButton) appCore->mouseButtonDown(m->x(), m->y(), CelestiaCore::RightButton);}void KdeGlWidget::mouseReleaseEvent( QMouseEvent* m ){ lastX = (int) m->x(); lastY = (int) m->y(); if (m->button() == LeftButton)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?