Lots of enhancements for Unix Gtk Version

ver1_5_1
Deon Ramsey 2002-01-02 22:07:11 +00:00
parent 573e4a6042
commit 08de764143
7 changed files with 232 additions and 49 deletions

View File

@ -369,3 +369,6 @@ Code:
* Unix: Inserted testing code for GtkGLArea into configure.in (dramsey)
* Unix: Integrated a current gnome macros package. (dramsey)
* Removed many errors and compiler warnings (dramsey)
* Label Galaxies option. (dramsey)
* Unix: Added several menu options already present in the windows version to
the Gtk version. (dramsey)

View File

@ -72,5 +72,5 @@
{
Name "Comet Borrelly"
Target "Sol/Borrelly"
Description "One September 22, 2001, Comet Borrelly became the second comet to be imaged at close range by a spacecraft. Despite not being designed for a comet flyby, Deep Space 1 approached within 2200 kilometers of the Borrelly's nucleus to return the highest resolution pictures we have of a cometary cire."
Description "One September 22, 2001, Comet Borrelly became the second comet to be imaged at close range by a spacecraft. Despite not being designed for a comet flyby, Deep Space 1 approached within 2200 kilometers of the Borrelly's nucleus to return the highest resolution pictures we have of a cometary core."
}

View File

@ -361,6 +361,8 @@ int parseRenderFlags(string s)
flags |= Renderer::ShowPlanets;
else if (compareIgnoringCase(name, "stars") == 0)
flags |= Renderer::ShowStars;
else if (compareIgnoringCase(name, "nightmaps") == 0)
flags |= Renderer::ShowNightMaps;
ttype = tokenizer.nextToken();
if (ttype == Tokenizer::TokenBar)
@ -401,6 +403,8 @@ int parseLabelFlags(string s)
flags |= Renderer::ConstellationLabels;
else if (compareIgnoringCase(name, "stars") == 0)
flags |= Renderer::StarLabels;
else if (compareIgnoringCase(name, "galaxies") == 0)
flags |= Renderer::GalaxyLabels;
ttype = tokenizer.nextToken();
if (ttype == Tokenizer::TokenBar)

View File

@ -722,6 +722,8 @@ void Renderer::render(const Observer& observer,
}
}
if ((labelMode & GalaxyLabels) != 0)
labelGalaxies(*galaxies, observer);
if ((labelMode & StarLabels) != 0)
labelStars(labelledStars, starDB, observer);
if ((labelMode & ConstellationLabels) != 0 && asterisms != NULL)
@ -2616,6 +2618,28 @@ void Renderer::renderCelestialSphere(const Observer& observer)
}
void Renderer::labelGalaxies(const GalaxyList& galaxies,
const Observer& observer)
{
Point3f observerPos = (Point3f) observer.getPosition();
for (GalaxyList::const_iterator iter = galaxies.begin();
iter != galaxies.end(); iter++)
{
Galaxy* galaxy = *iter;
Point3d posd = galaxy->getPosition();
Point3f pos(posd.x,posd.y,posd.z);
Vec3f rpos = pos - observerPos;
if ((rpos * conjugate(observer.getOrientation()).toMatrix3()).z < 0)
{
addLabel(galaxy->getName(), Color(0.7f, 0.7f, 0.0f),
Point3f(rpos.x, rpos.y, rpos.z));
}
}
}
void Renderer::labelStars(const vector<Star*>& stars,
const StarDatabase& starDB,
const Observer& observer)

View File

@ -53,6 +53,7 @@ class Renderer
MajorPlanetLabels = 2,
MinorPlanetLabels = 4,
ConstellationLabels = 8,
GalaxyLabels = 16,
};
enum {
ShowNothing = 0,
@ -188,6 +189,8 @@ class Renderer
const Quatf& orientation,
float renderDistance,
bool useHaloes);
void labelGalaxies(const GalaxyList& galaxies,
const Observer& observer);
void labelStars(const std::vector<Star*>& stars,
const StarDatabase& starDB,
const Observer& observer);

View File

@ -20,18 +20,18 @@
#include <cstdlib>
#include <cctype>
#include <cstring>
#include "../celengine/gl.h"
#include <celmath/vecmath.h>
#include <celmath/quaternion.h>
#include <celmath/mathlib.h>
#include <celutil/util.h>
#include <celengine/stardb.h>
#include <celengine/solarsys.h>
#include <celengine/asterism.h>
#include <celengine/astro.h>
#include <celengine/overlay.h>
#include <celengine/execution.h>
#include <celengine/cmdparser.h>
#include "celengine/gl.h"
#include "celmath/vecmath.h"
#include "celmath/quaternion.h"
#include "celmath/mathlib.h"
#include "celutil/util.h"
#include "celengine/stardb.h"
#include "celengine/solarsys.h"
#include "celengine/asterism.h"
#include "celengine/astro.h"
#include "celengine/overlay.h"
#include "celengine/execution.h"
#include "celengine/cmdparser.h"
#include "favorites.h"
#include "celestiacore.h"
@ -133,6 +133,10 @@ CelestiaCore::CelestiaCore() :
logoTexture(NULL),
alerter(NULL)
{
/* Get a renderer here so it may be queried for capabilities of the
underlying engine even before rendering is enabled. It's initRenderer()
routine will be called much later. */
renderer = new Renderer();
timer = CreateTimer();
execEnv = new CoreExecutionEnvironment(*this);
@ -604,6 +608,10 @@ void CelestiaCore::charEntered(char c)
runningScript = new Execution(*demoScript, *execEnv);
break;
case 'E':
renderer->setLabelMode(renderer->getLabelMode() ^ Renderer::GalaxyLabels);
break;
case '1':
case '2':
case '3':
@ -1066,8 +1074,6 @@ void CelestiaCore::renderOverlay()
}
else
{
*overlay << setprecision(0);
double timeScale = sim->getTimeScale();
if (abs(abs(timeScale) - 1) < 1e-6)
{
@ -1082,8 +1088,6 @@ void CelestiaCore::renderOverlay()
*overlay << timeScale << "x faster";
else
*overlay << 1.0 / timeScale << "x slower";
*overlay << setprecision(3);
}
overlay->endText();
glPopMatrix();
@ -1143,9 +1147,9 @@ void CelestiaCore::renderOverlay()
case astro::Geographic:
modeName = "Sync Orbiting";
break;
default:
//Prevent Gnu C compiler from warning about unhandled case.
break;
default:
// Keep compiler from warning about unhandled cases
break;
}
}
@ -1463,8 +1467,6 @@ bool CelestiaCore::initSimulation()
bool CelestiaCore::initRenderer()
{
renderer = new Renderer();
renderer->setRenderFlags(Renderer::ShowStars |
Renderer::ShowPlanets |
Renderer::ShowAtmospheres);

View File

@ -18,12 +18,17 @@
#include <time.h>
#include <unistd.h>
#include "celengine/gl.h"
#include "celengine/celestia.h"
#ifndef DEBUG
# define G_DISABLE_ASSERT
#endif
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <gdk/gdkkeysyms.h>
#include <gtkgl/gtkglarea.h>
#include <gnome.h>
#include "celengine/celestia.h"
#include "celmath/vecmath.h"
#include "celmath/quaternion.h"
#include "celmath/mathlib.h"
@ -81,8 +86,16 @@ enum
Menu_ShowConstellations = 2003,
Menu_ShowAtmospheres = 2004,
Menu_PlanetLabels = 2005,
Menu_StarLabels = 2006,
Menu_ConstellationLabels = 2007,
Menu_ShowClouds = 2005,
Menu_ShowCelestialSphere = 2006,
Menu_ShowNightSideMaps = 2007,
Menu_MajorPlanetLabels = 2008,
Menu_MinorPlanetLabels = 2009,
Menu_StarLabels = 2010,
Menu_GalaxyLabels = 2011,
Menu_ConstellationLabels = 2012,
Menu_PixelShaders = 2013,
Menu_VertexShaders = 2014,
};
static void menuSelectSol()
@ -100,6 +113,16 @@ static void menuGoto()
appCore->charEntered('G');
}
static void menuSync()
{
appCore->charEntered('Y');
}
static void menuTrack()
{
appCore->charEntered('T');
}
static void menuFollow()
{
appCore->charEntered('F');
@ -122,7 +145,7 @@ static void menuPause()
static void menuRealTime()
{
// sim->setTimeScale(1.0);
appCore->charEntered('\\');
}
static void menuReverse()
@ -132,7 +155,7 @@ static void menuReverse()
static gint menuShowGalaxies(GtkWidget* w, gpointer data)
{
bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetRenderFlag(Renderer::ShowGalaxies, on);
appCore->charEntered('U');
return TRUE;
@ -140,23 +163,63 @@ static gint menuShowGalaxies(GtkWidget* w, gpointer data)
static gint menuShowOrbits(GtkWidget* w, gpointer data)
{
bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetRenderFlag(Renderer::ShowOrbits, on);
appCore->charEntered('O');
return TRUE;
}
static gint menuShowAtmospheres(GtkWidget* w, gpointer data)
static gint menuShowClouds(GtkWidget* w, gpointer data)
{
bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetRenderFlag(Renderer::ShowCloudMaps, on);
appCore->charEntered('I');
return TRUE;
}
static gint menuShowAtmospheres(GtkWidget* w, gpointer data)
{
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetRenderFlag(Renderer::ShowAtmospheres, on);
appCore->charEntered('\001'); //Ctrl+A
return TRUE;
}
static gint menuPixelShaders(GtkWidget* w, gpointer data)
{
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetRenderFlag(Renderer::ShowNightSideMaps, on);
appCore->charEntered('\020'); //Ctrl+P
return TRUE;
}
static gint menuVertexShaders(GtkWidget* w, gpointer data)
{
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetRenderFlag(Renderer::ShowNightSideMaps, on);
appCore->charEntered('\026'); //Ctrl+V
return TRUE;
}
static gint menuShowNightSideMaps(GtkWidget* w, gpointer data)
{
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetRenderFlag(Renderer::ShowNightSideMaps, on);
appCore->charEntered('\014'); //Ctrl+L
return TRUE;
}
static gint menuShowCelestialSphere(GtkWidget* w, gpointer data)
{
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetRenderFlag(Renderer::ShowCelestialSphere, on);
appCore->charEntered(';');
return TRUE;
}
static gint menuShowConstellations(GtkWidget* w, gpointer data)
{
bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetRenderFlag(Renderer::ShowDiagrams, on);
appCore->charEntered('/');
return TRUE;
@ -164,28 +227,43 @@ static gint menuShowConstellations(GtkWidget* w, gpointer data)
static gint menuStarLabels(GtkWidget* w, gpointer data)
{
bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetLabelFlag(Renderer::StarLabels, on);
appCore->charEntered('B');
return TRUE;
}
static gint menuGalaxyLabels(GtkWidget* w, gpointer data)
{
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetLabelFlag(Renderer::StarLabels, on);
appCore->charEntered('E');
return TRUE;
}
static gint menuConstellationLabels(GtkWidget* w, gpointer data)
{
bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetLabelFlag(Renderer::ConstellationLabels, on);
appCore->charEntered('=');
return TRUE;
}
static gint menuPlanetLabels(GtkWidget* w, gpointer data)
static gint menuMajorPlanetLabels(GtkWidget* w, gpointer data)
{
bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetLabelFlag(Renderer::MajorPlanetLabels, on);
appCore->charEntered('N');
return TRUE;
}
static gint menuMinorPlanetLabels(GtkWidget* w, gpointer data)
{
// bool on = (GTK_CHECK_MENU_ITEM(w)->active == 1);
// SetLabelFlag(Renderer::MinorPlanetLabels, on);
appCore->charEntered('M');
return TRUE;
}
static void menuMoreStars()
{
@ -197,6 +275,31 @@ static void menuLessStars()
appCore->charEntered('[');
}
static void menuNoAmbient()
{
appCore->getRenderer()->setAmbientLightLevel(0.0f);
}
static void menuLowAmbient()
{
appCore->getRenderer()->setAmbientLightLevel(0.02f);
}
static void menuMedAmbient()
{
appCore->getRenderer()->setAmbientLightLevel(0.1f);
}
static void menuHiAmbient()
{
appCore->getRenderer()->setAmbientLightLevel(0.25f);
}
static void menuShowInfo()
{
appCore->charEntered('V');
}
static void menuRunDemo()
{
appCore->charEntered('D');
@ -702,40 +805,59 @@ static void menuTourGuide()
static GtkItemFactoryEntry menuItems[] =
{
{ "/_File", NULL, NULL, 0, "<Branch>" },
{ "/File/Capture Image...", "F10", menuCaptureImage, 0, NULL },
{ "/File/Capture Image...", "F10", menuCaptureImage,0, NULL },
{ "/File/Quit", "<control>Q", gtk_main_quit, 0, NULL },
{ "/_Navigation", NULL, NULL, 0, "<Branch>" },
{ "/Navigation/Select Sol", "H", menuSelectSol, 0, NULL },
{ "/Navigation/Tour Guide", NULL, menuTourGuide, 0, NULL },
{ "/Navigation/Select Object...", NULL, menuSelectObject, 0, NULL },
{ "/Navigation/Goto Object...", NULL, menuGotoObject, 0, NULL },
{ "/Navigation/Goto Object...", NULL, menuGotoObject,0, NULL },
{ "/Navigation/sep1", NULL, NULL, 0, "<Separator>" },
{ "/Navigation/Center Selection", "C", menuCenter, 0, NULL },
{ "/Navigation/Goto Selection", "G", menuGoto, 0, NULL },
{ "/Navigation/Follow Selection", "F", menuFollow, 0, NULL },
{ "/Navigation/Sync Orbit", "Y", menuSync, 0, NULL },
{ "/Navigation/Track Selection", "T", menuTrack, 0, NULL },
{ "/_Time", NULL, NULL, 0, "<Branch>" },
{ "/Time/10x Faster", "L", menuFaster, 0, NULL },
{ "/Time/10x Slower", "K", menuSlower, 0, NULL },
{ "/Time/Pause", " ", menuPause, 0, NULL },
{ "/Time/Real Time", NULL, menuRealTime, 0, NULL },
{ "/Time/Pause", "space", menuPause, 0, NULL },
{ "/Time/Real Time", "backslash", menuRealTime, 0, NULL },
{ "/Time/Reverse", "J", menuReverse, 0, NULL },
{ "/_Render", NULL, NULL, 0, "<Branch>" },
{ "/Render/Show Galaxies", "U", NULL, Menu_ShowGalaxies, "<ToggleItem>" },
{ "/Render/Show Atmospheres", "I", NULL, Menu_ShowAtmospheres, "<ToggleItem>" },
{ "/Render/Show Orbits", "O", NULL, Menu_ShowOrbits, "<ToggleItem>" },
{ "/Render/Show Constellations", "-", NULL, Menu_ShowConstellations, "<ToggleItem>" },
{ "/Render/Show Galaxies", "U", NULL, Menu_ShowGalaxies, "<ToggleItem>" },
{ "/Render/Show Atmospheres", "<control>A",NULL, Menu_ShowAtmospheres, "<ToggleItem>" },
{ "/Render/Show Clouds", "I", NULL, Menu_ShowClouds, "<ToggleItem>" },
{ "/Render/Show Orbits", "O", NULL, Menu_ShowOrbits, "<ToggleItem>" },
{ "/Render/Show Constellations", "minus",NULL, Menu_ShowConstellations, "<ToggleItem>" },
{ "/Render/Show Coordinate Sphere", "semicolon",NULL, Menu_ShowCelestialSphere, "<ToggleItem>" },
{ "/Render/Show Night Side Lights", "<control>L",NULL, Menu_ShowNightSideMaps, "<ToggleItem>" },
{ "/Render/sep1", NULL, NULL, 0, "<Separator>" },
{ "/Render/More Stars", "]", menuMoreStars, 0, NULL },
{ "/Render/Fewer Stars", "[", menuLessStars, 0, NULL },
{ "/Render/More Stars Visible", "bracketleft", menuMoreStars, 0, NULL },
{ "/Render/Fewer Stars Visible", "bracketright", menuLessStars, 0, NULL },
{ "/Render/sep2", NULL, NULL, 0, "<Separator>" },
{ "/Render/Label Planets", "N", NULL, Menu_PlanetLabels, "<ToggleItem>" },
{ "/Render/Label Major Planets", "N", NULL, Menu_MajorPlanetLabels, "<ToggleItem>" },
{ "/Render/Label Minor Planets", "M", NULL, Menu_MinorPlanetLabels, "<ToggleItem>" },
{ "/Render/Label Stars", "B", NULL, Menu_StarLabels, "<ToggleItem>" },
{ "/Render/LabelConstellations", "=", NULL, Menu_ConstellationLabels, "<ToggleItem>" },
{ "/Render/Label Galaxies", "E", NULL, Menu_GalaxyLabels, "<ToggleItem>" },
{ "/Render/LabelConstellations", "equal",NULL, Menu_ConstellationLabels, "<ToggleItem>" },
{ "/Render/Show Info Text", "V", menuShowInfo, 0, NULL },
{ "/Render/sep3", NULL, NULL, 0, "<Separator>" },
{ "/Render/_Ambient", NULL, NULL, 0, "<Branch>" },
{ "/Render/Ambient/None", NULL, menuNoAmbient, 0, NULL },
{ "/Render/Ambient/Low", NULL, menuLowAmbient,0, NULL },
{ "/Render/Ambient/Medium", NULL, menuMedAmbient,0, NULL },
{ "/Render/Ambient/High", NULL, menuHiAmbient, 0, NULL },
{ "/_Help", NULL, NULL, 0, "<LastBranch>" },
{ "/Help/Run Demo", "D", menuRunDemo, 0, NULL },
{ "/Help/About", NULL, menuAbout, 0, NULL },
};
static GtkItemFactoryEntry optMenuItems[] =
{
{ "/Render/Use Pixel Shaders", "<control>P", NULL, Menu_PixelShaders, "<ToggleItem>" },
{ "/Render/Use Vertex Shaders", "<control>V", NULL, Menu_PixelShaders, "<ToggleItem>" },
};
void setupCheckItem(GtkItemFactory* factory, int action, GtkSignalFunc func)
{
@ -758,6 +880,12 @@ void createMainMenu(GtkWidget* window, GtkWidget** menubar)
"<main>",
accelGroup);
gtk_item_factory_create_items(menuItemFactory, nItems, menuItems, NULL);
Renderer *renderer=appCore->getRenderer();
g_assert(renderer);
if(renderer->fragmentShaderSupported())
gtk_item_factory_create_item(menuItemFactory, &optMenuItems[0], NULL, 1);
if (renderer->vertexShaderSupported())
gtk_item_factory_create_item(menuItemFactory, &optMenuItems[1], NULL, 1);
gtk_window_add_accel_group(GTK_WINDOW(window), accelGroup);
if (menubar != NULL)
@ -769,14 +897,30 @@ void createMainMenu(GtkWidget* window, GtkWidget** menubar)
GTK_SIGNAL_FUNC(menuShowConstellations));
setupCheckItem(menuItemFactory, Menu_ShowAtmospheres,
GTK_SIGNAL_FUNC(menuShowAtmospheres));
setupCheckItem(menuItemFactory, Menu_ShowClouds,
GTK_SIGNAL_FUNC(menuShowClouds));
setupCheckItem(menuItemFactory, Menu_ShowNightSideMaps,
GTK_SIGNAL_FUNC(menuShowNightSideMaps));
setupCheckItem(menuItemFactory, Menu_ShowOrbits,
GTK_SIGNAL_FUNC(menuShowOrbits));
setupCheckItem(menuItemFactory, Menu_PlanetLabels,
GTK_SIGNAL_FUNC(menuPlanetLabels));
setupCheckItem(menuItemFactory, Menu_MajorPlanetLabels,
GTK_SIGNAL_FUNC(menuMajorPlanetLabels));
setupCheckItem(menuItemFactory, Menu_MinorPlanetLabels,
GTK_SIGNAL_FUNC(menuMinorPlanetLabels));
setupCheckItem(menuItemFactory, Menu_StarLabels,
GTK_SIGNAL_FUNC(menuStarLabels));
setupCheckItem(menuItemFactory, Menu_GalaxyLabels,
GTK_SIGNAL_FUNC(menuGalaxyLabels));
setupCheckItem(menuItemFactory, Menu_ConstellationLabels,
GTK_SIGNAL_FUNC(menuConstellationLabels));
setupCheckItem(menuItemFactory, Menu_ShowCelestialSphere,
GTK_SIGNAL_FUNC(menuShowCelestialSphere));
if(renderer->fragmentShaderSupported())
setupCheckItem(menuItemFactory, Menu_PixelShaders,
GTK_SIGNAL_FUNC(menuPixelShaders));
if (renderer->vertexShaderSupported())
setupCheckItem(menuItemFactory, Menu_VertexShaders,
GTK_SIGNAL_FUNC(menuVertexShaders));
}
@ -950,6 +1094,9 @@ static bool handleSpecialKey(int key, bool down)
case GDK_F6:
k = CelestiaCore::Key_F6;
break;
case GDK_F7:
k = CelestiaCore::Key_F7;
break;
case GDK_F10:
if (down)
menuCaptureImage();