2015-05-19 12:29:31 +00:00
|
|
|
/*
|
|
|
|
* This file is part of the Colobot: Gold Edition source code
|
2021-09-11 13:52:34 +00:00
|
|
|
* Copyright (C) 2001-2021, Daniel Roux, EPSITEC SA & TerranovaTeam
|
2015-08-22 14:40:02 +00:00
|
|
|
* http://epsitec.ch; http://colobot.info; http://github.com/colobot
|
2015-05-19 12:29:31 +00:00
|
|
|
*
|
|
|
|
* 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 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
* See the GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program. If not, see http://gnu.org/licenses
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \file graphics/opengl/gl33device.h
|
|
|
|
* \brief OpenGL 3.3 implementation - CGL33Device class
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "graphics/core/device.h"
|
2015-08-02 11:09:48 +00:00
|
|
|
|
2015-09-27 14:28:11 +00:00
|
|
|
#include "graphics/core/material.h"
|
|
|
|
|
2015-06-21 16:48:31 +00:00
|
|
|
#include "graphics/opengl/glframebuffer.h"
|
2015-08-02 11:09:48 +00:00
|
|
|
#include "graphics/opengl/glutil.h"
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2015-08-12 19:07:16 +00:00
|
|
|
#include <map>
|
|
|
|
#include <memory>
|
|
|
|
#include <set>
|
2015-05-19 12:29:31 +00:00
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
2021-08-08 12:32:14 +00:00
|
|
|
#include <unordered_set>
|
2015-05-19 12:29:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
// Graphics module namespace
|
2015-08-02 09:40:47 +00:00
|
|
|
namespace Gfx
|
|
|
|
{
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2016-03-22 14:16:08 +00:00
|
|
|
//! Struct for dynamic buffers
|
|
|
|
struct DynamicBuffer
|
|
|
|
{
|
|
|
|
//! Auxiliary VAO for rendering primitives with DrawPrimitive*
|
|
|
|
GLuint vao = 0;
|
|
|
|
//! Dynamic buffer
|
|
|
|
GLuint vbo = 0;
|
|
|
|
//! Dynamic buffer size
|
|
|
|
unsigned int size = 0;
|
|
|
|
//! Dynamic buffer offset
|
|
|
|
unsigned int offset = 0;
|
|
|
|
};
|
|
|
|
|
2021-08-08 12:32:14 +00:00
|
|
|
class CGL33VertexBuffer : public CVertexBuffer
|
|
|
|
{
|
|
|
|
GLuint m_vao = 0;
|
|
|
|
GLuint m_vbo = 0;
|
|
|
|
|
|
|
|
public:
|
|
|
|
CGL33VertexBuffer(PrimitiveType type, size_t size);
|
|
|
|
virtual ~CGL33VertexBuffer();
|
|
|
|
|
|
|
|
virtual void Update() override;
|
|
|
|
|
|
|
|
GLuint GetVAO() const
|
|
|
|
{
|
|
|
|
return m_vao;
|
|
|
|
}
|
|
|
|
|
|
|
|
GLuint GetVBO() const
|
|
|
|
{
|
|
|
|
return m_vbo;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-06-16 00:33:15 +00:00
|
|
|
class CGL33UIRenderer;
|
2021-08-14 13:06:09 +00:00
|
|
|
class CGL33TerrainRenderer;
|
2021-12-01 16:05:20 +00:00
|
|
|
class CGL33ObjectRenderer;
|
2022-01-20 20:38:58 +00:00
|
|
|
class CGL33ParticleRenderer;
|
2021-10-17 14:05:20 +00:00
|
|
|
class CGL33ShadowRenderer;
|
2021-06-16 00:33:15 +00:00
|
|
|
|
2015-05-19 12:29:31 +00:00
|
|
|
/**
|
|
|
|
\class CGL33Device
|
|
|
|
\brief Implementation of CDevice interface in OpenGL 3.3
|
|
|
|
|
|
|
|
Provides the concrete implementation of 3D device in OpenGL.
|
|
|
|
|
|
|
|
This class should be initialized (by calling Initialize() ) only after
|
|
|
|
setting the video mode by CApplication, once the OpenGL context is defined.
|
|
|
|
Because of that, CGLDeviceConfig is outside the CDevice class and must be set
|
|
|
|
in CApplication.
|
|
|
|
*/
|
|
|
|
class CGL33Device : public CDevice
|
|
|
|
{
|
|
|
|
public:
|
2015-06-16 13:31:59 +00:00
|
|
|
CGL33Device(const DeviceConfig &config);
|
2015-05-19 12:29:31 +00:00
|
|
|
virtual ~CGL33Device();
|
|
|
|
|
2016-03-06 19:25:50 +00:00
|
|
|
std::string GetName() override;
|
2016-03-06 18:32:37 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
bool Create() override;
|
|
|
|
void Destroy() override;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
void ConfigChanged(const DeviceConfig &newConfig) override;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
void BeginScene() override;
|
|
|
|
void EndScene() override;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
void Clear() override;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2021-06-16 00:33:15 +00:00
|
|
|
CUIRenderer* GetUIRenderer() override;
|
2021-08-14 13:06:09 +00:00
|
|
|
CTerrainRenderer* GetTerrainRenderer() override;
|
2021-12-01 16:05:20 +00:00
|
|
|
CObjectRenderer* GetObjectRenderer() override;
|
2022-01-20 20:38:58 +00:00
|
|
|
CParticleRenderer* GetParticleRenderer() override;
|
2021-10-17 14:05:20 +00:00
|
|
|
CShadowRenderer* GetShadowRenderer() override;
|
2016-02-13 02:54:49 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
Texture CreateTexture(CImage *image, const TextureCreateParams ¶ms) override;
|
|
|
|
Texture CreateTexture(ImageData *data, const TextureCreateParams ¶ms) override;
|
|
|
|
Texture CreateDepthTexture(int width, int height, int depth) override;
|
2021-12-23 21:35:28 +00:00
|
|
|
void UpdateTexture(const Texture& texture, const glm::ivec2& offset, ImageData* data, TexImgFormat format) override;
|
2015-08-17 19:53:28 +00:00
|
|
|
void DestroyTexture(const Texture &texture) override;
|
|
|
|
void DestroyAllTextures() override;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2021-08-08 12:32:14 +00:00
|
|
|
CVertexBuffer* CreateVertexBuffer(PrimitiveType primitiveType, const Vertex3D* vertices, int vertexCount) override;
|
|
|
|
void DestroyVertexBuffer(CVertexBuffer*) override;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
void SetViewport(int x, int y, int width, int height) override;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
void SetRenderState(RenderState state, bool enabled) override;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
void SetColorMask(bool red, bool green, bool blue, bool alpha) override;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
void SetClearColor(const Color &color) override;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
void CopyFramebufferToTexture(Texture& texture, int xOffset, int yOffset, int x, int y, int width, int height) override;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
std::unique_ptr<CFrameBufferPixels> GetFrameBufferPixels() const override;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
CFramebuffer* GetFramebuffer(std::string name) override;
|
2015-06-21 16:48:31 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
CFramebuffer* CreateFramebuffer(std::string name, const FramebufferParams& params) override;
|
2015-06-21 16:48:31 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
void DeleteFramebuffer(std::string name) override;
|
2015-06-21 16:48:31 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
bool IsAnisotropySupported() override;
|
|
|
|
int GetMaxAnisotropyLevel() override;
|
2015-07-20 11:56:45 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
int GetMaxSamples() override;
|
2015-07-20 14:29:09 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
bool IsShadowMappingSupported() override;
|
2015-07-20 20:34:39 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
int GetMaxTextureSize() override;
|
2015-07-20 20:34:39 +00:00
|
|
|
|
2015-08-17 19:53:28 +00:00
|
|
|
bool IsFramebufferSupported() override;
|
2015-07-20 20:34:39 +00:00
|
|
|
|
2015-05-19 12:29:31 +00:00
|
|
|
private:
|
|
|
|
//! Current config
|
2015-06-16 13:31:59 +00:00
|
|
|
DeviceConfig m_config;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
|
|
|
//! Set of all created textures
|
|
|
|
std::set<Texture> m_allTextures;
|
|
|
|
|
|
|
|
//! Detected capabilities
|
2021-08-08 12:32:14 +00:00
|
|
|
//! Set of vertex buffers
|
|
|
|
std::unordered_set<CVertexBuffer*> m_buffers;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2016-02-17 23:57:37 +00:00
|
|
|
//! Total memory allocated in VBOs
|
|
|
|
unsigned long m_vboMemory = 0;
|
|
|
|
|
2015-06-21 16:48:31 +00:00
|
|
|
//! Map of framebuffers
|
2015-08-12 19:07:16 +00:00
|
|
|
std::map<std::string, std::unique_ptr<CFramebuffer>> m_framebuffers;
|
2015-05-19 12:29:31 +00:00
|
|
|
|
2021-06-16 00:33:15 +00:00
|
|
|
//! Interface renderer
|
|
|
|
std::unique_ptr<CGL33UIRenderer> m_uiRenderer;
|
2021-08-14 13:06:09 +00:00
|
|
|
//! Terrain renderer
|
|
|
|
std::unique_ptr<CGL33TerrainRenderer> m_terrainRenderer;
|
2021-12-01 16:05:20 +00:00
|
|
|
//! Object renderer
|
|
|
|
std::unique_ptr<CGL33ObjectRenderer> m_objectRenderer;
|
2022-01-20 20:38:58 +00:00
|
|
|
//! Particle renderer
|
|
|
|
std::unique_ptr<CGL33ParticleRenderer> m_particleRenderer;
|
2021-10-17 14:05:20 +00:00
|
|
|
//! Shadow renderer
|
|
|
|
std::unique_ptr<CGL33ShadowRenderer> m_shadowRenderer;
|
2015-05-19 12:29:31 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace Gfx
|