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 + -
显示快捷键?