From 7a98e422682f128aa06110f16b145a9227dff08d Mon Sep 17 00:00:00 2001 From: Chris Laurel Date: Wed, 28 Feb 2001 01:59:05 +0000 Subject: [PATCH] Converted to use Surface class instead of independent material properties. --- src/body.cpp | 57 ++++++++++-------------------------------------- src/body.h | 25 ++++++++------------- src/render.cpp | 40 ++++++++++++++++++++++++++------- src/render.h | 2 ++ src/solarsys.cpp | 21 +++++++++--------- 5 files changed, 64 insertions(+), 81 deletions(-) diff --git a/src/body.cpp b/src/body.cpp index cbe610f2..f30e9d6b 100644 --- a/src/body.cpp +++ b/src/body.cpp @@ -1,7 +1,11 @@ // body.cpp // // Copyright (C) 2001 Chris Laurel - +// +// 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 #include "mathlib.h" @@ -16,9 +20,8 @@ Body::Body(PlanetarySystem* _system) : satellites(NULL), rings(NULL), rotationPeriod(1), - color(1.0f, 1.0f, 1.0f), - oblateness(0), - appearanceFlags(0) + surface(Color(1.0f, 1.0f, 1.0f)), + oblateness(0) { system = _system; } @@ -128,27 +131,15 @@ void Body::setRotationPeriod(float _rotationPeriod) } -Color Body::getColor() const +const Surface& Body::getSurface() const { - return color; + return surface; } -void Body::setColor(Color _color) +void Body::setSurface(const Surface& surf) { - color = _color; -} - - -string Body::getTexture() const -{ - return texture; -} - - -void Body::setTexture(const string _texture) -{ - texture = _texture; + surface = surf; } @@ -157,38 +148,12 @@ string Body::getMesh() const return mesh; } - void Body::setMesh(const string _mesh) { mesh = _mesh; } -uint32 Body::getAppearanceFlags() const -{ - return appearanceFlags; -} - - -void Body::setAppearanceFlags(uint32 flags) -{ - appearanceFlags = flags; -} - - -bool Body::getAppearanceFlag(uint32 flag) const -{ - return (appearanceFlags & flag) != 0; -} - - -void Body::setAppearanceFlag(uint32 flag, bool on) -{ - appearanceFlags &= ~flag; - appearanceFlags |= on ? flag : 0; -} - - const PlanetarySystem* Body::getSatellites() const { return satellites; diff --git a/src/body.h b/src/body.h index 1d2b0c56..a379cc99 100644 --- a/src/body.h +++ b/src/body.h @@ -1,6 +1,11 @@ // body.h // // Copyright (C) 2001 Chris Laurel +// +// 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. #ifndef _BODY_H_ #define _BODY_H_ @@ -8,6 +13,7 @@ #include #include #include "color.h" +#include "surface.h" #include "orbit.h" #include "star.h" @@ -89,16 +95,10 @@ class Body RingSystem* getRings() const; void setRings(RingSystem&); - void setColor(Color); - Color getColor() const; - void setTexture(std::string); - std::string getTexture() const; void setMesh(std::string); std::string getMesh() const; - void setAppearanceFlags(uint32); - uint32 getAppearanceFlags() const; - void setAppearanceFlag(uint32, bool); - bool getAppearanceFlag(uint32) const; + void setSurface(const Surface&); + const Surface& getSurface() const; float getLuminosity(const Star& sun, float distanceFromSun) const; @@ -112,11 +112,6 @@ class Body Mat4d getLocalToHeliocentric(double when); Point3d getHeliocentricPosition(double when); - // Appearance flags - enum { - BlendTexture = 1, - }; - private: std::string name; @@ -130,10 +125,8 @@ class Body float albedo; float rotationPeriod; - Color color; - std::string texture; std::string mesh; - uint32 appearanceFlags; + Surface surface; RingSystem* rings; diff --git a/src/render.cpp b/src/render.cpp index e097d156..1497ec53 100644 --- a/src/render.cpp +++ b/src/render.cpp @@ -27,6 +27,8 @@ using namespace std; #define RENDER_DISTANCE 10.0f +#define FAINTEST_MAGNITUDE 5.5f + // Static meshes and textures used by all instances of Simulation static bool commonDataInitialized = false; @@ -36,6 +38,8 @@ static bool commonDataInitialized = false; static SphereMesh* sphereMesh[SPHERE_LODS]; static SphereMesh* asteroidMesh = NULL; +static CTexture* normalizationTex = NULL; + static CTexture* starTex = NULL; static CTexture* glareTex = NULL; static CTexture* ringsTex = NULL; @@ -52,7 +56,9 @@ Renderer::Renderer() : labelMode(NoLabels), ambientLightLevel(0.1f), console(NULL), - nSimultaneousTextures(1) + nSimultaneousTextures(1), + useRegisterCombiners(false), + useCubeMaps(false) { textureManager = new TextureManager("textures"); meshManager = new MeshManager("models"); @@ -180,9 +186,13 @@ bool Renderer::init(int winWidth, int winHeight) if (font != NULL) txfEstablishTexture(font, 0, GL_TRUE); + // Initialize GL extensions if (ExtensionSupported("GL_ARB_multitexture")) InitExtMultiTexture(); - + if (ExtensionSupported("GL_NV_register_combiners")) + InitExtRegisterCombiners(); + if (ExtensionSupported("GL_EXT_texture_cube_map")) + normalizationTex = CreateNormalizationCubeMap(64); commonDataInitialized = true; } @@ -192,7 +202,20 @@ bool Renderer::init(int winWidth, int winHeight) // Get GL extension information if (ExtensionSupported("GL_ARB_multitexture")) + { + DPRINTF("Renderer: multi-texture supported.\n"); glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &nSimultaneousTextures); + } + if (ExtensionSupported("GL_NV_register_combiners")) + { + DPRINTF("Renderer: nVidia register combiners supported.\n"); + useRegisterCombiners = true; + } + if (ExtensionSupported("GL_EXT_texture_cube_map")) + { + DPRINTF("Renderer: cube texture maps supported.\n"); + useCubeMaps = true; + } cout << "Simultaneous textures supported: " << nSimultaneousTextures << '\n'; @@ -714,12 +737,13 @@ void Renderer::renderPlanet(const Body& body, glLightColor(GL_LIGHT0, GL_DIFFUSE, Vec3f(1.0f, 1.0f, 1.0f)); glEnable(GL_LIGHT0); + const Surface& surface = body.getSurface(); // Get the texture . . . CTexture* tex = NULL; - if (body.getTexture() != "") + if (surface.baseTexture != "") { - if (!textureManager->find(body.getTexture(), &tex)) - tex = textureManager->load(body.getTexture()); + if (!textureManager->find(surface.baseTexture, &tex)) + tex = textureManager->load(surface.baseTexture); } if (tex == NULL) @@ -732,8 +756,8 @@ void Renderer::renderPlanet(const Body& body, glBindTexture(GL_TEXTURE_2D, tex->getName()); } - if (tex == NULL || body.getAppearanceFlag(Body::BlendTexture)) - glColor(body.getColor()); + if (tex == NULL || (surface.appearanceFlags & Surface::BlendTexture) != 0) + glColor(surface.color); else glColor4f(1, 1, 1, 1); @@ -935,7 +959,7 @@ void Renderer::renderPlanet(const Body& body, renderBodyAsParticle(pos, appMag, discSizeInPixels, - body.getColor(), + body.getSurface().color, orientation, false); #if 0 diff --git a/src/render.h b/src/render.h index c7ce1cf6..e420ef76 100644 --- a/src/render.h +++ b/src/render.h @@ -161,6 +161,8 @@ class Renderer double projMatrix[16]; int nSimultaneousTextures; + bool useRegisterCombiners; + bool useCubeMaps; public: friend bool operator<(const Renderer::RenderListEntry&, diff --git a/src/solarsys.cpp b/src/solarsys.cpp index 9795b8da..945d3c81 100644 --- a/src/solarsys.cpp +++ b/src/solarsys.cpp @@ -167,22 +167,21 @@ static Body* CreatePlanet(PlanetarySystem* system, planetData->getNumber("RotationPeriod", rotationPeriod); body->setRotationPeriod(rotationPeriod); - Color color(1.0f, 1.0f, 1.0f); - planetData->getColor("Color", color); - body->setColor(color); - - string texture(""); - planetData->getString("Texture", texture); - body->setTexture(texture); + Surface surface; + surface.color = Color(1.0f, 1.0f, 1.0f); + planetData->getColor("Color", surface.color); + planetData->getString("Texture", surface.baseTexture); + planetData->getString("BumpMap", surface.bumpTexture); + bool blendTexture = false; + planetData->getBoolean("BlendTexture", blendTexture); + if (blendTexture) + surface.appearanceFlags |= Surface::BlendTexture; + body->setSurface(surface); string mesh(""); planetData->getString("Mesh", mesh); body->setMesh(mesh); - bool blendTexture = false; - planetData->getBoolean("BlendTexture", blendTexture); - body->setAppearanceFlag(Body::BlendTexture, blendTexture); - // Read the ring system { Value* ringsDataValue = planetData->getValue("Rings");