mirror of
https://github.com/glest/glest-source.git
synced 2025-02-25 20:22:31 +01:00
434 lines
12 KiB
C++
434 lines
12 KiB
C++
// ==============================================================
|
|
// This file is part of Glest (www.glest.org)
|
|
//
|
|
// Copyright (C) 2001-2008 Martio Figueroa
|
|
//
|
|
// You can redistribute this code 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 _GLEST_GAME_RENDERER_H_
|
|
#define _GLEST_GAME_RENDERER_H_
|
|
|
|
#include "vec.h"
|
|
#include "math_util.h"
|
|
#include "model.h"
|
|
#include "particle.h"
|
|
#include "pixmap.h"
|
|
#include "font.h"
|
|
#include "matrix.h"
|
|
#include "selection.h"
|
|
#include "components.h"
|
|
#include "texture.h"
|
|
#include "model_manager.h"
|
|
#include "graphics_factory_gl.h"
|
|
#include "font_manager.h"
|
|
#include "camera.h"
|
|
#include <vector>
|
|
#include "model_renderer.h"
|
|
#include "model.h"
|
|
|
|
namespace Glest{ namespace Game{
|
|
|
|
using Shared::Graphics::Texture;
|
|
using Shared::Graphics::Texture2D;
|
|
using Shared::Graphics::Texture3D;
|
|
using Shared::Graphics::ModelRenderer;
|
|
using Shared::Graphics::TextRenderer2D;
|
|
using Shared::Graphics::ParticleRenderer;
|
|
using Shared::Graphics::ParticleManager;
|
|
using Shared::Graphics::ModelManager;
|
|
using Shared::Graphics::TextureManager;
|
|
using Shared::Graphics::FontManager;
|
|
using Shared::Graphics::Font2D;
|
|
using Shared::Graphics::Matrix4f;
|
|
using Shared::Graphics::Vec2i;
|
|
using Shared::Graphics::Quad2i;
|
|
using Shared::Graphics::Vec3f;
|
|
using Shared::Graphics::Model;
|
|
using Shared::Graphics::ParticleSystem;
|
|
using Shared::Graphics::Pixmap2D;
|
|
using Shared::Graphics::Camera;
|
|
using Shared::Graphics::MeshCallback;
|
|
using Shared::Graphics::Mesh;
|
|
|
|
// =====================================================
|
|
// class MeshCallbackTeamColor
|
|
// =====================================================
|
|
|
|
class MeshCallbackTeamColor: public MeshCallback{
|
|
private:
|
|
const Texture *teamTexture;
|
|
|
|
public:
|
|
void setTeamTexture(const Texture *teamTexture) {this->teamTexture= teamTexture;}
|
|
virtual void execute(const Mesh *mesh);
|
|
|
|
static bool noTeamColors;
|
|
};
|
|
|
|
//non shared classes
|
|
class Config;
|
|
class Game;
|
|
class MainMenu;
|
|
class Console;
|
|
class MenuBackground;
|
|
class ChatManager;
|
|
class Texture;
|
|
class Object;
|
|
|
|
enum ResourceScope{
|
|
rsGlobal,
|
|
rsMenu,
|
|
rsGame,
|
|
|
|
rsCount
|
|
};
|
|
|
|
// ===========================================================
|
|
// class Renderer
|
|
//
|
|
/// OpenGL renderer, uses the shared library
|
|
// ===========================================================
|
|
|
|
enum RenderEntityState {
|
|
resNone,
|
|
resInterpolated,
|
|
resRendered
|
|
};
|
|
|
|
enum RenderEntityType {
|
|
retObject,
|
|
retUnit,
|
|
retUnitFast
|
|
};
|
|
|
|
class RenderEntity {
|
|
protected:
|
|
RenderEntityState state;
|
|
|
|
void CopyAll(const RenderEntity &obj) {
|
|
this->type = obj.type;
|
|
this->state = obj.state;
|
|
this->o = obj.o;
|
|
this->mapPos = obj.mapPos;
|
|
this->unit = obj.unit;
|
|
this->teamTexture = obj.teamTexture;;
|
|
}
|
|
|
|
public:
|
|
|
|
static bool forceRenderWithIterpolation;
|
|
|
|
RenderEntity() {
|
|
this->type = retObject;
|
|
this->o = NULL;
|
|
this->unit = NULL;
|
|
this->teamTexture = NULL;
|
|
setState(resNone);
|
|
}
|
|
RenderEntity(RenderEntityType type,Object *o, Vec2i mapPos, Unit *unit,const Texture2D *teamTexture=NULL) {
|
|
this->type = type;
|
|
this->o = o;
|
|
this->mapPos = mapPos;
|
|
this->unit = unit;
|
|
this->teamTexture = teamTexture;
|
|
setState(resNone);
|
|
}
|
|
RenderEntity(const RenderEntity &obj) {
|
|
CopyAll(obj);
|
|
}
|
|
RenderEntity & operator=(const RenderEntity &obj) {
|
|
CopyAll(obj);
|
|
return *this;
|
|
}
|
|
bool operator<(const RenderEntity &rhs) const;
|
|
bool operator()(const RenderEntity &lhs,const RenderEntity &rhs) const;
|
|
|
|
RenderEntityType type;
|
|
Object *o;
|
|
Vec2i mapPos;
|
|
Unit *unit;
|
|
const Texture2D *teamTexture;
|
|
|
|
RenderEntityState getState() {
|
|
return this->state;
|
|
}
|
|
void setState(RenderEntityState value) {
|
|
this->state = value;
|
|
}
|
|
};
|
|
|
|
class Renderer {
|
|
public:
|
|
//progress bar
|
|
static const int maxProgressBar;
|
|
static const Vec4f progressBarBack1;
|
|
static const Vec4f progressBarBack2;
|
|
static const Vec4f progressBarFront1;
|
|
static const Vec4f progressBarFront2;
|
|
|
|
//sun and moon
|
|
static const float sunDist;
|
|
static const float moonDist;
|
|
static const float lightAmbFactor;
|
|
|
|
//mouse
|
|
static const int maxMouse2dAnim;
|
|
|
|
//texture units
|
|
static const GLenum baseTexUnit;
|
|
static const GLenum fowTexUnit;
|
|
static const GLenum shadowTexUnit;
|
|
|
|
//selection
|
|
static const float selectionCircleRadius;
|
|
static const float magicCircleRadius;
|
|
|
|
//perspective values
|
|
static const float perspFov;
|
|
static const float perspNearPlane;
|
|
static const float perspFarPlane;
|
|
|
|
//default values
|
|
static const float ambFactor;
|
|
static const Vec4f defSpecularColor;
|
|
static const Vec4f defDiffuseColor;
|
|
static const Vec4f defAmbientColor;
|
|
static const Vec4f defColor;
|
|
static const Vec4f fowColor;
|
|
|
|
//light
|
|
static const float maxLightDist;
|
|
|
|
public:
|
|
enum Shadows{
|
|
sDisabled,
|
|
sProjected,
|
|
sShadowMapping,
|
|
|
|
sCount
|
|
};
|
|
|
|
private:
|
|
//config
|
|
int maxLights;
|
|
bool photoMode;
|
|
int shadowTextureSize;
|
|
int shadowFrameSkip;
|
|
float shadowAlpha;
|
|
bool focusArrows;
|
|
bool textures3D;
|
|
Shadows shadows;
|
|
int maxConsoleLines;
|
|
|
|
//game
|
|
const Game *game;
|
|
const MainMenu *menu;
|
|
|
|
//misc
|
|
int triangleCount;
|
|
int pointCount;
|
|
Quad2i visibleQuad;
|
|
Vec4f nearestLightPos;
|
|
|
|
//renderers
|
|
ModelRenderer *modelRenderer;
|
|
TextRenderer2D *textRenderer;
|
|
ParticleRenderer *particleRenderer;
|
|
|
|
//texture managers
|
|
ModelManager *modelManager[rsCount];
|
|
TextureManager *textureManager[rsCount];
|
|
FontManager *fontManager[rsCount];
|
|
ParticleManager *particleManager[rsCount];
|
|
|
|
//state lists
|
|
GLuint list3d;
|
|
GLuint list2d;
|
|
GLuint list3dMenu;
|
|
|
|
//shadows
|
|
GLuint shadowMapHandle;
|
|
Matrix4f shadowMapMatrix;
|
|
int shadowMapFrame;
|
|
|
|
//water
|
|
float waterAnim;
|
|
|
|
bool allowRenderUnitTitles;
|
|
std::vector<std::pair<Unit *,Vec3f> > renderUnitTitleList;
|
|
|
|
private:
|
|
Renderer();
|
|
~Renderer();
|
|
|
|
public:
|
|
static Renderer &getInstance();
|
|
|
|
void reinitAll();
|
|
|
|
|
|
//init
|
|
void init();
|
|
void initGame(const Game *game);
|
|
void initMenu(const MainMenu *mm);
|
|
void reset3d();
|
|
void reset2d();
|
|
void reset3dMenu();
|
|
|
|
//end
|
|
void end();
|
|
void endMenu();
|
|
void endGame();
|
|
|
|
//get
|
|
int getTriangleCount() const {return triangleCount;}
|
|
int getPointCount() const {return pointCount;}
|
|
|
|
//misc
|
|
void reloadResources();
|
|
|
|
//engine interface
|
|
void initTexture(ResourceScope rs, Texture *texture);
|
|
void endTexture(ResourceScope rs, Texture **texture);
|
|
|
|
Model *newModel(ResourceScope rs);
|
|
Texture2D *newTexture2D(ResourceScope rs);
|
|
Texture3D *newTexture3D(ResourceScope rs);
|
|
Font2D *newFont(ResourceScope rs);
|
|
TextRenderer2D *getTextRenderer() const {return textRenderer;}
|
|
void manageParticleSystem(ParticleSystem *particleSystem, ResourceScope rs);
|
|
void updateParticleManager(ResourceScope rs);
|
|
void renderParticleManager(ResourceScope rs);
|
|
void swapBuffers();
|
|
|
|
//lights and camera
|
|
void setupLighting();
|
|
void loadGameCameraMatrix();
|
|
void loadCameraMatrix(const Camera *camera);
|
|
void computeVisibleQuad();
|
|
|
|
//basic rendering
|
|
void renderMouse2d(int mouseX, int mouseY, int anim, float fade= 0.f);
|
|
void renderMouse3d();
|
|
void renderBackground(const Texture2D *texture);
|
|
void renderTextureQuad(int x, int y, int w, int h, const Texture2D *texture, float alpha=1.f);
|
|
void renderConsole(const Console *console, const bool showAll=false, const bool showMenuConsole=false);
|
|
void renderChatManager(const ChatManager *chatManager);
|
|
void renderResourceStatus();
|
|
void renderSelectionQuad();
|
|
void renderText(const string &text, const Font2D *font, float alpha, int x, int y, bool centered= false);
|
|
void renderText(const string &text, const Font2D *font, const Vec3f &color, int x, int y, bool centered= false);
|
|
void renderTextShadow(const string &text, const Font2D *font,const Vec4f &color, int x, int y, bool centered= false);
|
|
|
|
//components
|
|
void renderLabel(const GraphicLabel *label);
|
|
void renderButton(const GraphicButton *button);
|
|
void renderListBox(const GraphicListBox *listBox);
|
|
void renderMessageBox(const GraphicMessageBox *listBox);
|
|
|
|
//complex rendering
|
|
void renderSurface();
|
|
void renderObjects(const int renderFps, const int worldFrameCount);
|
|
void renderObject(RenderEntity &entity,const Vec3f &baseFogColor,const int renderFps, const int worldFrameCount);
|
|
void renderObject(Object *o,const Vec2i &mapPos,const Vec3f &baseFogColor,const int worldFrameCount);
|
|
void prepareObjectForRender(RenderEntity &entity);
|
|
void renderObjectList(std::vector<RenderEntity> &vctEntity,const Vec3f &baseFogColor,const int renderFps, const int worldFrameCount);
|
|
|
|
void renderWater();
|
|
void renderUnits(const int renderFps, const int worldFrameCount);
|
|
void prepareUnitForRender(RenderEntity &entity);
|
|
void renderUnitList(std::vector<RenderEntity> &vctEntity,MeshCallbackTeamColor *meshCallbackTeamColor,const int renderFps, const int worldFrameCount);
|
|
void renderUnit(RenderEntity &entity,MeshCallbackTeamColor *meshCallbackTeamColor,const int renderFps, const int worldFrameCount);
|
|
void renderUnit(Unit *unit,MeshCallbackTeamColor *meshCallbackTeamColor, const Texture2D *teamTexture, const int worldFrameCount);
|
|
|
|
void renderSelectionEffects();
|
|
void renderWaterEffects();
|
|
void renderMinimap();
|
|
void renderDisplay();
|
|
void renderMenuBackground(const MenuBackground *menuBackground);
|
|
|
|
//computing
|
|
bool computePosition(const Vec2i &screenPos, Vec2i &worldPos);
|
|
void computeSelected(Selection::UnitContainer &units, const Vec2i &posDown, const Vec2i &posUp);
|
|
|
|
//gl wrap
|
|
string getGlInfo();
|
|
string getGlMoreInfo();
|
|
void autoConfig();
|
|
|
|
//clear
|
|
void clearBuffers();
|
|
void clearZBuffer();
|
|
|
|
//shadows
|
|
void renderShadowsToTexture(const int renderFps);
|
|
|
|
//misc
|
|
void loadConfig();
|
|
void saveScreen(const string &path);
|
|
Quad2i getVisibleQuad() const {return visibleQuad;}
|
|
|
|
//static
|
|
static Shadows strToShadows(const string &s);
|
|
static string shadowsToStr(Shadows shadows);
|
|
|
|
const Game * getGame() { return game; }
|
|
|
|
void setAllowRenderUnitTitles(bool value);
|
|
bool getAllowRenderUnitTitles() { return allowRenderUnitTitles; }
|
|
void renderUnitTitles(Font2D *font, Vec3f color);
|
|
Vec3f computeScreenPosition(const Vec3f &worldPos);
|
|
|
|
void setPhotoMode(bool value) { photoMode = value; }
|
|
|
|
private:
|
|
//private misc
|
|
float computeSunAngle(float time);
|
|
float computeMoonAngle(float time);
|
|
Vec4f computeSunPos(float time);
|
|
Vec4f computeMoonPos(float time);
|
|
Vec3f computeLightColor(float time);
|
|
Vec4f computeWaterColor(float waterLevel, float cellHeight);
|
|
void checkExtension(const string &extension, const string &msg);
|
|
|
|
//selection render
|
|
void renderObjectsFast();
|
|
void renderObjectFastList(std::vector<RenderEntity> &vctEntity);
|
|
void renderUnitsFast();
|
|
void renderUnitFastList(std::vector<RenderEntity> &vctEntity);
|
|
void renderUnitFast(RenderEntity &entity);
|
|
void renderUnitFast(Unit *unit, int x, int y);
|
|
void prepareUnitFastForRender(RenderEntity &entity);
|
|
|
|
//gl requirements
|
|
void checkGlCaps();
|
|
void checkGlOptionalCaps();
|
|
|
|
//gl init
|
|
void init3dList();
|
|
void init2dList();
|
|
void init3dListMenu(const MainMenu *mm);
|
|
|
|
//misc
|
|
void loadProjectionMatrix();
|
|
void enableProjectiveTexturing();
|
|
|
|
//private aux drawing
|
|
void renderSelectionCircle(Vec3f v, int size, float radius);
|
|
void renderArrow(const Vec3f &pos1, const Vec3f &pos2, const Vec3f &color, float width);
|
|
void renderProgressBar(int size, int x, int y, Font2D *font);
|
|
void renderTile(const Vec2i &pos);
|
|
void renderQuad(int x, int y, int w, int h, const Texture2D *texture);
|
|
|
|
//static
|
|
static Texture2D::Filter strToTextureFilter(const string &s);
|
|
};
|
|
|
|
}} //end namespace
|
|
|
|
#endif
|