108 lines
3.8 KiB
C
108 lines
3.8 KiB
C
|
//
|
||
|
// This source code is property of the Computer Graphics and Visualization
|
||
|
// chair of the TU Dresden. Do not distribute in modified or unmodified form!
|
||
|
// Copyright (C) 2016 CGV TU Dresden - All Rights Reserved
|
||
|
//
|
||
|
/*************************************************************************
|
||
|
The main program.
|
||
|
This class provides the functionality of the main program. The program
|
||
|
starts after calling the "run" method. This method initializes the GLUT
|
||
|
system for rendering (using OpenGL) and user interaction. During the
|
||
|
initialization process different methods are connected to certain events
|
||
|
such as "display the window content" or "act on key events".
|
||
|
Furthermore the main context menu is initialized by calling the method
|
||
|
"setup_context_menu".
|
||
|
Whenever one of the events described above occurs the appropriate functions
|
||
|
are called (They are however not called directly but via static functions
|
||
|
that forward the event. Read the included PDF if you are interested why
|
||
|
this is done and how it works).
|
||
|
The actual rendering happens in the "display" method that completely
|
||
|
handles the rendering over to the "render" method of the "content"-variable
|
||
|
which is an instance of a child class of abstract_scene.
|
||
|
For animations a timer is set up to call the "timer" method every 1/30 sec
|
||
|
which calls the "advance_frame" method of the current "content" and
|
||
|
refreshes the display.
|
||
|
**************************************************************************/
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
|
||
|
// Needed for openGL rendering and GLUT commands
|
||
|
#include "GL/glut.h"
|
||
|
// Needed for displaying text in the main window
|
||
|
#include "GL/freeglut_ext.h"
|
||
|
// Contains the interface for abstract_scene
|
||
|
#include "abstract_scene.h"
|
||
|
|
||
|
|
||
|
|
||
|
// An enumeration of menu actions. Whenever something
|
||
|
// from the context menu is selected the method "context_menu_select"
|
||
|
// is invoked with an element of this enumeration as a parameter
|
||
|
enum MenuActions
|
||
|
{
|
||
|
MA_CUBE_SYSTEM, // Render the cube system
|
||
|
MA_CUBE_SYSTEM_SPLIT, // Render the cube system in split screen
|
||
|
MA_CUBES_RECURSIVE, // Render the recursive cubes
|
||
|
MA_TERRAIN, // Render the terrain
|
||
|
MA_TERRAIN_SOLID, // Show the terrain as solid
|
||
|
MA_TERRAIN_WIREFRAME, // Show the terrain as wireframe
|
||
|
MA_TERRAIN_LEVELS, // Show height level lines
|
||
|
MA_EXAMPLE_PRIMITIVES, // Render the primitives example
|
||
|
MA_EXAMPLE_CPRIMITIVES, // Render the consecutive primitives example
|
||
|
MA_EXAMPLE_3D_PRIMITIVES, // Render the 3D primitives example
|
||
|
MA_EXAMPLE_TRANS_ORDER // Render the transformation order example
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
class application
|
||
|
{
|
||
|
public:
|
||
|
// Initialize all non-GLUT related variables
|
||
|
application();
|
||
|
|
||
|
// Run the program using the command line arguments
|
||
|
int run(int argc, char* argv[]);
|
||
|
|
||
|
private:
|
||
|
// The current scene to display
|
||
|
abstract_scene *content;
|
||
|
// States for the terrain scene
|
||
|
bool terrain_solid, terrain_wireframe, terrain_levels;
|
||
|
// Dirty flag to check if the menu must be updated
|
||
|
bool menu_dirty;
|
||
|
|
||
|
// The static instance of this program. Read the PDF for more details
|
||
|
static application *instance;
|
||
|
|
||
|
// Set the current scene
|
||
|
void set_content(abstract_scene *new_content);
|
||
|
|
||
|
// The event method on key presses
|
||
|
void key_down(unsigned char key, int x, int y);
|
||
|
|
||
|
// The event method on context menu selections
|
||
|
void context_menu_select(int item);
|
||
|
|
||
|
// The event method on timer callbacks
|
||
|
void timer(int value);
|
||
|
|
||
|
// The event method on window content rendering
|
||
|
void display();
|
||
|
|
||
|
// Initialize the context menu
|
||
|
void setup_context_menu();
|
||
|
|
||
|
// Update the context menu according to the settings
|
||
|
void update_context_menu();
|
||
|
|
||
|
// Static callbacks...
|
||
|
static void key_down_callback(unsigned char key, int x, int y);
|
||
|
static void context_menu_callback(int item);
|
||
|
static void display_callback();
|
||
|
static void timer_callback(int value);
|
||
|
static void idle_callback();
|
||
|
|
||
|
};
|