1
0
mirror of https://github.com/rwengine/openrw.git synced 2024-11-10 12:52:39 +01:00
openrw/rwengine/include/render/GameRenderer.hpp

218 lines
4.9 KiB
C++
Raw Normal View History

2014-06-06 18:04:00 +02:00
#ifndef _GAMERENDERER_HPP_
#define _GAMERENDERER_HPP_
#include <rw/defines.hpp>
2015-03-30 03:45:58 +02:00
class Logger;
#include <gl/gl_core_3_3.h>
2013-07-04 03:40:47 +02:00
#include <memory>
#include <vector>
#include <render/ViewCamera.hpp>
2013-07-02 09:53:23 +02:00
2014-08-22 15:29:46 +02:00
#include <render/OpenGLRenderer.hpp>
#include "MapRenderer.hpp"
2015-02-07 23:55:06 +01:00
#include "TextRenderer.hpp"
#include "WaterRenderer.hpp"
2014-08-22 15:29:46 +02:00
2013-07-04 03:40:47 +02:00
class Model;
2014-02-09 04:14:43 +01:00
class ModelFrame;
2013-12-20 17:02:46 +01:00
class GameWorld;
class GameObject;
class AreaIndicatorInfo;
/// @todo migrate to some other way of rendering each object type.
class CharacterObject;
class VehicleObject;
class InstanceObject;
class PickupObject;
class ProjectileObject;
class CutsceneObject;
2013-09-11 01:26:13 +02:00
class Animator;
class InventoryItem;
2014-08-22 15:29:46 +02:00
class Renderer;
2014-02-13 11:55:11 +01:00
/**
* @brief Implements high level drawing logic and low level draw commands
*
* Rendering of object types is handled by drawWorld, calling the respective
* render function for each object.
2014-02-13 11:55:11 +01:00
*/
2014-06-06 18:04:00 +02:00
class GameRenderer
2013-07-02 09:53:23 +02:00
{
/** Game data to use for rendering */
GameData* data;
2015-03-30 03:45:58 +02:00
/** Logger to output messages */
Logger* logger;
2014-08-22 15:29:46 +02:00
/** The low-level drawing interface to use */
Renderer* renderer;
2014-08-22 15:29:46 +02:00
/** Stores data for deferring transparent objects */
struct RQueueEntry {
Model* model;
size_t g;
size_t sg;
glm::mat4 matrix;
2014-08-22 15:29:46 +02:00
Renderer::DrawParameters dp;
GameObject* object;
};
/**
* @brief renders a model's frame.
* @param m
* @param f
* @param matrix
* @param object
* @param queueTransparent abort the draw if the frame contains transparent materials
* @return True if the frame was drawn, false if it should be queued
*/
bool renderFrame(Model* m, ModelFrame* f, const glm::mat4& matrix, GameObject* object, float opacity, bool queueTransparent = true);
2014-08-22 15:29:46 +02:00
/** Transparent objects are queued into this list */
std::vector<RQueueEntry> transparentDrawQueue;
// Temporary variables used during rendering
float _renderAlpha;
GameWorld* _renderWorld;
/** Internal non-descript VAOs */
GLuint vao, debugVAO;
/** Camera values passed to renderWorld() */
ViewCamera _camera;
GLuint framebufferName;
GLuint fbTextures[2];
GLuint fbRenderBuffers[1];
Renderer::ShaderProgram* postProg;
2013-07-02 09:53:23 +02:00
public:
GameRenderer(Logger* log, GameData* data);
~GameRenderer();
2013-07-02 09:53:23 +02:00
/** Number of culling events */
2013-07-02 10:58:01 +02:00
size_t culled;
/** @todo Clean up all these shader program and location variables */
2014-08-22 15:29:46 +02:00
Renderer::ShaderProgram* worldProg;
Renderer::ShaderProgram* skyProg;
Renderer::ShaderProgram* particleProg;
2014-08-22 15:29:46 +02:00
GLuint ssRectProgram;
GLint ssRectTexture, ssRectColour, ssRectSize, ssRectOffset;
2014-06-08 20:04:47 +02:00
GLuint skydomeVBO, skydomeIBO, debugVBO;
2013-07-30 17:59:44 +02:00
GLuint debugTex;
2014-08-22 15:29:46 +02:00
DrawBuffer skyDbuff;
GeometryBuffer skyGbuff;
2013-07-04 12:43:28 +02:00
DrawBuffer cylinderBuffer;
GeometryBuffer cylinderGeometry;
GameData* getData() const { return data; }
2013-07-30 17:59:44 +02:00
/**
* Renders the world using the parameters of the passed Camera.
* Note: The camera's near and far planes are overriden by weather effects.
*
* - draws all objects (instances, vehicles etc.)
* - draws particles
* - draws water surfaces
* - draws the skybox
2013-07-30 17:59:44 +02:00
*/
void renderWorld(GameWorld* world, const ViewCamera &camera, float alpha);
2013-07-30 17:59:44 +02:00
/**
* @brief draws a CharacterObject and any item they are holding.
* @param pedestrian the character to render
*/
void renderPedestrian(CharacterObject* pedestrian);
/**
* @brief draws a VehicleObject and it's wheels.
* @param vehicle vehicle to render
*/
void renderVehicle(VehicleObject* vehicle);
/**
* @brief draw part of the world.
*/
void renderInstance(InstanceObject* instance);
/**
* @brief draws a pickup with it's model
* @param pickup
* @todo corona rendering, with tint.
*/
void renderPickup(PickupObject* pickup);
void renderProjectile(ProjectileObject* projectile);
void renderCutsceneObject(CutsceneObject *cutscene);
2014-06-01 18:41:09 +02:00
void renderWheel(Model*, const glm::mat4& matrix, const std::string& name);
void renderItem(InventoryItem* item, const glm::mat4& modelMatrix);
/**
* Renders the effects (Particles, Lighttrails etc)
*/
void renderEffects(GameWorld* world);
/**
* @brief Draws the current on screen text.
*/
void drawOnScreenText();
/**
* @brief Draws a texture on the screen
*/
void drawTexture(TextureData* texture, glm::vec4 extents);
2014-02-13 11:55:11 +01:00
/**
* Renders a model (who'd have thought)
*/
void renderModel(Model*, const glm::mat4& modelMatrix, GameObject* = nullptr, Animator* animator = nullptr);
2013-07-30 17:59:44 +02:00
void renderGeometry(Model*, size_t geom, const glm::mat4& modelMatrix, float opacity, GameObject* = nullptr);
/** Renders the area indicator */
void renderAreaIndicator(const AreaIndicatorInfo* info);
/** method for rendering AI debug information */
2014-08-01 23:03:00 +02:00
void renderPaths();
/** Increases cinematic value */
void renderLetterbox();
2014-06-17 22:46:54 +02:00
2015-04-13 02:48:29 +02:00
void setupRender();
void renderPostProcess();
Renderer* getRenderer()
{
return renderer;
}
void setViewport(int w, int h);
MapRenderer map;
WaterRenderer water;
2015-02-07 23:55:06 +01:00
TextRenderer text;
2015-04-12 20:47:47 +02:00
// Profiling data
Renderer::ProfileInfo profObjects;
Renderer::ProfileInfo profSky;
Renderer::ProfileInfo profWater;
Renderer::ProfileInfo profEffects;
2013-07-02 09:53:23 +02:00
};
#endif