📄 main.cpp
字号:
// ___ ___ ___ ___ ___ // /\__\ ___ /\__\ /\ \ /\__\ /\ \. // /::| | /\ \ /::| | /::\ \ /:/ / /::\ \. // /:|:| | \:\ \ /:|:| | /:/\:\ \ /:/ / /:/\:\ \. // /:/|:|__|__ /::\__\ /:/|:| |__ /:/ \:\ \ /:/ / /::\~\:\ \.// /:/ |::::\__\ __/:/\/__/ /:/ |:| /\__\ /:/__/_\:\__\ /:/__/ /:/\:\ \:\__\.// \/__/~~/:/ / /\/:/ / \/__|:|/:/ / \:\ /\ \/__/ \:\ \ \:\~\:\ \/__/// /:/ / \::/__/ |:/:/ / \:\ \:\__\ \:\ \ \:\ \:\__\. // /:/ / \:\__\ |::/ / \:\/:/ / \:\ \ \:\ \/__/ // /:/ / \/__/ /:/ / \::/ / \:\__\ \:\__\. // \/__/ \/__/ \/__/ \/__/ \/__/ // // =============================================================================// Minimalist OpenGL Environment// =============================================================================//// Copyright 2007 Balazs Domonkos// // 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.// // This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// // You should have received a copy of the GNU General Public License// along with this program; if not, write to the Free Software// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.//// Simple Application data preloader// mingle.h should be included before all other// OpenGL headers#include <mingle.h>using namespace MinGLE;#include <GL/glut.h>#include <iostream>class SceneRenderer : public WindowListener { protected: double mScale; bool mRender; public: SceneRenderer() : mScale(0.3), mRender(true) { } double *getScalePtr() { return &mScale; } bool *getRenderPtr() { return &mRender; } protected: virtual bool onRender() { if(mRender) glutSolidTeapot(mScale); // Enable the next window listener to render return false; }};class GuiDemo : public GuiSheet { protected: Font *mFont; TextField *text; public: GuiDemo(double *scale, bool *render) { mFont = new Font("zekton.xml"); TextField::setDefaultFont(mFont); Panel *panel = new Panel("myPanel"); panel->setColor(0.1, 0.0, 0.0); panel->setHeightAbs(64); add(panel); text = new TextField("myText", "??? FPS"); text->setColor(0.2, 0.3, 0.6); text->setPositionAbs(8, 8); text->setWidthRel(0.5); panel->add(text); CheckBox *checkBox = new CheckBox("myCheckBox", true); checkBox->setLeftRel(0.5); checkBox->setTopAbs(8); checkBox->setUserData(render); panel->add(checkBox); Slider *mSlider = new Slider("mySlider"); mSlider->setLeftRel(0.5); mSlider->setTopAbs(32); mSlider->setWidthAbs(200); mSlider->setUserData(scale); panel->add(mSlider); } ~GuiDemo() { delete mFont; } // This method is called before rendering the gui virtual void onUpdate() { text->setText(StringUtils::toString(mWindow->getFrameRate(), 2) + " FPS"); }};class Preloader : public WindowListener, Process { protected: SceneRenderer *mSceneRenderer; public: Preloader(SceneRenderer *sceneRenderer) : mSceneRenderer(sceneRenderer) { } protected: virtual void onRegistered() { glMatrixMode(GL_PROJECTION); gluPerspective(90.0, (double) mWindow->getWidth() / mWindow->getHeight(), 0.01, 100.0); glMatrixMode(GL_MODELVIEW); gluLookAt(1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glColor4f(1.0, 1.0, 1.0, 0.9); // Start the thread start(); } virtual bool onRender() { // Check load finish if(isFinished()) { switchSceneRenderer(); return true; } // Render "hourglass" glMatrixMode(GL_MODELVIEW); glPushMatrix(); glRotatef(360.0*mStatus, 0.0, 1.0, 0.0); glutSolidTeapot(0.25); //glEnable(GL_BLEND); // TODO glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glScalef(1.0, mStatus, 1.0); glutSolidCube(0.7); glDisable(GL_BLEND); glPopMatrix(); return false; } virtual void process() { while(mStatus < 1.0) { Thread::sleep(0.05); mStatus += 0.01; } } void switchSceneRenderer() { Window *win = mWindow; // Detach this renderer mWindow->removeWindowListener(this); // Register the scene renderer win->registerWindowListener(mSceneRenderer); // Add navigator win->registerWindowListener(new ExaminerNavigator()); // Register gui sheet // Note that the order of the rendering is: // (ApplicationKeyHandler) -> SceneRenderer -> (ExaminerNavigator) -> GuiSheet // but the order of input handling is reversed: // GuiSheet -> ExaminerNavigator -> SceneRenderer -> ApplicationKeyHandler GuiDemo *guiDemo = new GuiDemo(mSceneRenderer->getScalePtr(), mSceneRenderer->getRenderPtr()); win->registerWindowListener(guiDemo); // Kick the window (TODO) win->setSize(win->getWidth(), win->getHeight()+1); win->setRenderMode(WindowAttributes::RENDER_WHEN_IDLE); }};int main(int argc, char **argv) { try { // Initialize rendering system System::initialize(&argc, argv); // Create window Window *win = System::createWindow(); win->setRenderMode(WindowAttributes::RENDER_ON_TIMER); win->setDesiredFPS(10); // Add keyhandler win->registerWindowListener(new ApplicationKeyHandler()); // Create scene renderer, but do not register it SceneRenderer *sceneRenderer = new SceneRenderer(); // Create preloader for the scene renderer and register it Preloader *preloader = new Preloader(sceneRenderer); win->registerWindowListener(preloader); // Setup OpenGL glEnable(GL_DEPTH_TEST); glShadeModel(GL_SMOOTH); GLfloat position[] = { 3.0f, 3.0f, 3.0f, 1.0f }; GLfloat diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f }; GLfloat specular[] = {1.0f, 1.0f, 1.0f , 1.0f}; glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_POSITION, position); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, specular); GLfloat material_ambient[] = {0.25f, 0.25f, 0.25f}; GLfloat material_diffuse[] = {0.90f, 0.90f, 0.90f}; GLfloat material_specular[] = {0.90f, 0.90f, 0.90f}; GLfloat material_shininess = 25.0f; glMaterialfv(GL_FRONT, GL_AMBIENT, material_ambient); glMaterialfv(GL_FRONT, GL_DIFFUSE, material_diffuse); glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular); glMaterialf(GL_FRONT, GL_SHININESS, material_shininess); // Enter the event handing loop System::enterMainLoop(); } catch(const Exception& e) { std::cerr << "Error: " << e.mDescription << " (Thrown in " << e.mFile << ':' << e.mMethod << " line " << e.mLine << ')' << std::endl; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -