celestia/src/celengine/rendcontext.h

163 lines
4.8 KiB
C++

// rendcontext.h
//
// Copyright (C) 2004-2010, Celestia Development Team
// Original version by Chris Laurel <claurel@gmail.com>
//
// 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.
#pragma once
#include <Eigen/Core>
#include <Eigen/Geometry>
#include <celmodel/material.h>
#include <celmodel/mesh.h>
#include "glsupport.h"
#include "shadermanager.h"
class Atmosphere;
class Color;
class LightingState;
class Renderer;
class RenderContext
{
public:
RenderContext(const cmod::Material*);
RenderContext(Renderer*);
virtual ~RenderContext() = default;
virtual void makeCurrent(const cmod::Material&) = 0;
virtual void setVertexArrays(const cmod::VertexDescription& desc,
const cmod::VWord* vertexData);
virtual void updateShader(const cmod::VertexDescription& desc, cmod::PrimitiveGroupType primType);
virtual void drawGroup(const cmod::PrimitiveGroup& group, bool useOverride);
const cmod::Material* getMaterial() const;
void setMaterial(const cmod::Material*);
void lock() { locked = true; }
void unlock() { locked = false; }
bool isLocked() const { return locked; }
bool shouldDrawLineAsTriangles() const;
enum RenderPass
{
PrimaryPass,
EmissivePass,
};
RenderPass getRenderPass() const { return renderPass; }
void setRenderPass(RenderPass rp) { renderPass = rp; }
void setPointScale(float);
float getPointScale() const;
void setCameraOrientation(const Eigen::Quaternionf& q);
Eigen::Quaternionf getCameraOrientation() const;
protected:
Renderer* renderer { nullptr };
bool usePointSize{ false };
bool useStaticPointSize{ false };
bool useNormals{ true };
bool useColors{ false };
bool useTexCoords{ true };
bool drawLine { false };
private:
const cmod::Material* material{ nullptr };
bool locked{ false };
RenderPass renderPass{ PrimaryPass };
float pointScale{ 1.0f };
Eigen::Quaternionf cameraOrientation; // required for drawing billboards
};
class Shadow_RenderContext : public RenderContext
{
public:
Shadow_RenderContext(Renderer *r) :
RenderContext(r)
{
}
void makeCurrent(const cmod::Material&) override
{
}
};
class GLSL_RenderContext : public RenderContext
{
public:
GLSL_RenderContext(Renderer* r,
const LightingState& ls,
float _objRadius,
const Eigen::Quaternionf& orientation,
const Eigen::Matrix4f *_modelViewMatrix,
const Eigen::Matrix4f *_projectionMatrix);
GLSL_RenderContext(Renderer* r,
const LightingState& ls,
const Eigen::Vector3f& _objScale,
const Eigen::Quaternionf& orientation,
const Eigen::Matrix4f *_modelViewMatrix,
const Eigen::Matrix4f *_projectionMatrix);
~GLSL_RenderContext() override;
void makeCurrent(const cmod::Material&) override;
void setLunarLambert(float);
void setAtmosphere(const Atmosphere*);
void setShadowMap(GLuint, GLuint, const Eigen::Matrix4f*);
private:
void initLightingEnvironment();
void setLightingParameters(CelestiaGLProgram& prog, Color diffuseColor, Color specularColor);
void setShadowParameters(CelestiaGLProgram& prog);
const LightingState& lightingState;
const Atmosphere* atmosphere{ nullptr };
cmod::BlendMode blendMode{ cmod::BlendMode::InvalidBlend };
float objRadius;
Eigen::Vector3f objScale;
Eigen::Quaternionf objOrientation;
// extended material properties
float lunarLambert{ 0.0f };
ShaderProperties shaderProps;
const Eigen::Matrix4f *modelViewMatrix;
const Eigen::Matrix4f *projectionMatrix;
const Eigen::Matrix4f *lightMatrix { nullptr };
GLuint shadowMap { 0 };
GLuint shadowMapWidth { 0 };
};
class GLSLUnlit_RenderContext : public RenderContext
{
public:
GLSLUnlit_RenderContext(Renderer* r,
float _objRadius,
const Eigen::Matrix4f *_modelViewMatrix,
const Eigen::Matrix4f *_projectionMatrix);
~GLSLUnlit_RenderContext() override;
void makeCurrent(const cmod::Material&) override;
private:
void initLightingEnvironment();
void setLightingParameters(CelestiaGLProgram& prog, Color diffuseColor, Color specularColor);
cmod::BlendMode blendMode;
float objRadius;
ShaderProperties shaderProps;
const Eigen::Matrix4f *modelViewMatrix;
const Eigen::Matrix4f *projectionMatrix;
};