Refactor boundaries rendering to have common and rendering parts
parent
c21934aee3
commit
3e133ba119
|
@ -12,6 +12,8 @@ set(CELENGINE_SOURCES
|
||||||
body.h
|
body.h
|
||||||
boundaries.cpp
|
boundaries.cpp
|
||||||
boundaries.h
|
boundaries.h
|
||||||
|
boundariesrenderer.cpp
|
||||||
|
boundariesrenderer.h
|
||||||
catalogxref.cpp
|
catalogxref.cpp
|
||||||
catalogxref.h
|
catalogxref.h
|
||||||
category.cpp
|
category.cpp
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// boundaries.cpp
|
// boundaries.cpp
|
||||||
//
|
//
|
||||||
// Copyright (C) 2002-2009, the Celestia Development Team
|
// Copyright (C) 2002-2019, the Celestia Development Team
|
||||||
// Original version by Chris Laurel <claurel@gmail.com>
|
// Original version by Chris Laurel <claurel@gmail.com>
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
|
@ -9,11 +9,8 @@
|
||||||
// of the License, or (at your option) any later version.
|
// of the License, or (at your option) any later version.
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <numeric>
|
|
||||||
#include <GL/glew.h>
|
|
||||||
#include "boundaries.h"
|
#include "boundaries.h"
|
||||||
#include "astro.h"
|
#include "astro.h"
|
||||||
#include "render.h"
|
|
||||||
|
|
||||||
using namespace Eigen;
|
using namespace Eigen;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -27,21 +24,19 @@ ConstellationBoundaries::ConstellationBoundaries()
|
||||||
}
|
}
|
||||||
|
|
||||||
ConstellationBoundaries::~ConstellationBoundaries()
|
ConstellationBoundaries::~ConstellationBoundaries()
|
||||||
{
|
|
||||||
cleanup();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConstellationBoundaries::cleanup()
|
|
||||||
{
|
{
|
||||||
for (const auto chain : chains)
|
for (const auto chain : chains)
|
||||||
delete chain;
|
delete chain;
|
||||||
chains.clear();
|
chains.clear();
|
||||||
|
|
||||||
delete currentChain;
|
delete currentChain;
|
||||||
currentChain = nullptr;
|
}
|
||||||
|
|
||||||
delete[] vtx_buf;
|
|
||||||
vtx_buf = nullptr;
|
const std::vector<ConstellationBoundaries::Chain*>&
|
||||||
|
ConstellationBoundaries::getChains() const
|
||||||
|
{
|
||||||
|
return chains;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -69,56 +64,6 @@ void ConstellationBoundaries::lineto(float ra, float dec)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ConstellationBoundaries::render(const Color& color, const Renderer& renderer)
|
|
||||||
{
|
|
||||||
m_vo.bind();
|
|
||||||
if (!m_vo.initialized())
|
|
||||||
{
|
|
||||||
prepare();
|
|
||||||
m_vo.allocate(vtx_num * 3 * sizeof(GLshort), vtx_buf);
|
|
||||||
cleanup();
|
|
||||||
m_vo.setVertices(3, GL_SHORT, false, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
CelestiaGLProgram* prog = renderer.getShaderManager().getShader(shadprop);
|
|
||||||
if (prog == nullptr)
|
|
||||||
return;
|
|
||||||
|
|
||||||
prog->use();
|
|
||||||
prog->color = color.toVector4();
|
|
||||||
m_vo.draw(GL_LINES, vtx_num);
|
|
||||||
|
|
||||||
glUseProgram(0);
|
|
||||||
m_vo.unbind();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ConstellationBoundaries::prepare()
|
|
||||||
{
|
|
||||||
vtx_num = accumulate(chains.begin(), chains.end(), 0,
|
|
||||||
[](int a, Chain* b) { return a + b->size(); });
|
|
||||||
|
|
||||||
// as we use GL_LINES we should double the number of vertices
|
|
||||||
vtx_num *= 2;
|
|
||||||
|
|
||||||
vtx_buf = new GLshort[vtx_num * 3];
|
|
||||||
GLshort* ptr = vtx_buf;
|
|
||||||
for (const auto chain : chains)
|
|
||||||
{
|
|
||||||
for (unsigned j = 0; j < 3; j++, ptr++)
|
|
||||||
*ptr = (GLshort) (*chain)[0][j];
|
|
||||||
for (unsigned i = 1; i < chain->size(); i++)
|
|
||||||
{
|
|
||||||
for (unsigned j = 0; j < 3; j++)
|
|
||||||
ptr[j] = ptr[j + 3] = (GLshort) (*chain)[i][j];
|
|
||||||
ptr += 6;
|
|
||||||
}
|
|
||||||
for (unsigned j = 0; j < 3; j++, ptr++)
|
|
||||||
*ptr = (GLshort) (*chain)[0][j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ConstellationBoundaries* ReadBoundaries(istream& in)
|
ConstellationBoundaries* ReadBoundaries(istream& in)
|
||||||
{
|
{
|
||||||
auto* boundaries = new ConstellationBoundaries();
|
auto* boundaries = new ConstellationBoundaries();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// boundaries.h
|
// boundaries.h
|
||||||
//
|
//
|
||||||
// Copyright (C) 2002-2009, the Celestia Development Team
|
// Copyright (C) 2002-2019, the Celestia Development Team
|
||||||
// Original version by Chris Laurel <claurel@gmail.com>
|
// Original version by Chris Laurel <claurel@gmail.com>
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
|
@ -12,20 +12,14 @@
|
||||||
#define _CELENGINE_BOUNDARIES_H_
|
#define _CELENGINE_BOUNDARIES_H_
|
||||||
|
|
||||||
#include <Eigen/Core>
|
#include <Eigen/Core>
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <celutil/color.h>
|
|
||||||
#include "shadermanager.h"
|
|
||||||
#include "vertexobject.h"
|
|
||||||
|
|
||||||
class Renderer;
|
|
||||||
|
|
||||||
class ConstellationBoundaries
|
class ConstellationBoundaries
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
using Chain = std::vector<Eigen::Vector3f>;
|
using Chain = std::vector<Eigen::Vector3f>;
|
||||||
|
|
||||||
public:
|
|
||||||
ConstellationBoundaries();
|
ConstellationBoundaries();
|
||||||
~ConstellationBoundaries();
|
~ConstellationBoundaries();
|
||||||
ConstellationBoundaries(const ConstellationBoundaries&) = delete;
|
ConstellationBoundaries(const ConstellationBoundaries&) = delete;
|
||||||
|
@ -35,20 +29,12 @@ class ConstellationBoundaries
|
||||||
|
|
||||||
void moveto(float ra, float dec);
|
void moveto(float ra, float dec);
|
||||||
void lineto(float ra, float dec);
|
void lineto(float ra, float dec);
|
||||||
void render(const Color& color, const Renderer& renderer);
|
|
||||||
|
const std::vector<Chain*>& getChains() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void cleanup();
|
|
||||||
void prepare();
|
|
||||||
|
|
||||||
Chain* currentChain{ nullptr };
|
Chain* currentChain{ nullptr };
|
||||||
std::vector<Chain*> chains;
|
std::vector<Chain*> chains;
|
||||||
|
|
||||||
GLshort *vtx_buf{ nullptr };
|
|
||||||
GLsizei vtx_num{ 0 };
|
|
||||||
celgl::VertexObject m_vo{GL_ARRAY_BUFFER, 0, GL_STATIC_DRAW};
|
|
||||||
|
|
||||||
ShaderProperties shadprop{ ShaderProperties::UniformColor };
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ConstellationBoundaries* ReadBoundaries(std::istream&);
|
ConstellationBoundaries* ReadBoundaries(std::istream&);
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
// boundariesrenderer.cpp
|
||||||
|
//
|
||||||
|
// Copyright (C) 2018-2019, the Celestia Development Team
|
||||||
|
//
|
||||||
|
// 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 <cassert>
|
||||||
|
#include <numeric>
|
||||||
|
#include <celengine/boundaries.h>
|
||||||
|
#include <celutil/color.h>
|
||||||
|
#include "boundariesrenderer.h"
|
||||||
|
#include "render.h"
|
||||||
|
|
||||||
|
using namespace Eigen;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
BoundariesRenderer::BoundariesRenderer(const ConstellationBoundaries *boundaries) :
|
||||||
|
m_boundaries(boundaries)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BoundariesRenderer::sameBoundaries(const ConstellationBoundaries *boundaries) const
|
||||||
|
{
|
||||||
|
return m_boundaries == boundaries;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoundariesRenderer::render(const Renderer &renderer, const Color &color)
|
||||||
|
{
|
||||||
|
auto *prog = renderer.getShaderManager().getShader(m_shadprop);
|
||||||
|
if (prog == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_vo.bind();
|
||||||
|
if (!m_vo.initialized())
|
||||||
|
{
|
||||||
|
auto *vtx_buf = prepare();
|
||||||
|
if (vtx_buf == nullptr)
|
||||||
|
{
|
||||||
|
m_vo.unbind();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_vo.allocate(m_vtxTotal * 3 * sizeof(GLshort), vtx_buf);
|
||||||
|
m_vo.setVertices(3, GL_SHORT, false, 0, 0);
|
||||||
|
delete[] vtx_buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
prog->use();
|
||||||
|
prog->color = color.toVector4();
|
||||||
|
m_vo.draw(GL_LINES, m_vtxTotal);
|
||||||
|
|
||||||
|
glUseProgram(0);
|
||||||
|
m_vo.unbind();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GLshort* BoundariesRenderer::prepare()
|
||||||
|
{
|
||||||
|
auto chains = m_boundaries->getChains();
|
||||||
|
auto vtx_num = accumulate(chains.begin(), chains.end(), 0,
|
||||||
|
[](int a, ConstellationBoundaries::Chain* b) { return a + b->size(); });
|
||||||
|
|
||||||
|
if (vtx_num == 0)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
// as we use GL_LINES we should double the number of vertices
|
||||||
|
vtx_num *= 2;
|
||||||
|
m_vtxTotal = vtx_num;
|
||||||
|
|
||||||
|
auto *vtx_buf = new GLshort[vtx_num * 3];
|
||||||
|
GLshort* ptr = vtx_buf;
|
||||||
|
for (const auto chain : chains)
|
||||||
|
{
|
||||||
|
for (unsigned j = 0; j < 3; j++, ptr++)
|
||||||
|
*ptr = (GLshort) (*chain)[0][j];
|
||||||
|
for (unsigned i = 1; i < chain->size(); i++)
|
||||||
|
{
|
||||||
|
for (unsigned j = 0; j < 3; j++)
|
||||||
|
ptr[j] = ptr[j + 3] = (GLshort) (*chain)[i][j];
|
||||||
|
ptr += 6;
|
||||||
|
}
|
||||||
|
for (unsigned j = 0; j < 3; j++, ptr++)
|
||||||
|
*ptr = (GLshort) (*chain)[0][j];
|
||||||
|
}
|
||||||
|
|
||||||
|
return vtx_buf;
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
// boundariesrenderer.h
|
||||||
|
//
|
||||||
|
// Copyright (C) 2018-2019, the Celestia Development Team
|
||||||
|
//
|
||||||
|
// 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 "shadermanager.h"
|
||||||
|
#include "vertexobject.h"
|
||||||
|
|
||||||
|
class Color;
|
||||||
|
class ConstellationBoundaries;
|
||||||
|
class Renderer;
|
||||||
|
|
||||||
|
class BoundariesRenderer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BoundariesRenderer(const ConstellationBoundaries*);
|
||||||
|
~BoundariesRenderer() = default;
|
||||||
|
BoundariesRenderer() = delete;
|
||||||
|
BoundariesRenderer(const BoundariesRenderer&) = delete;
|
||||||
|
BoundariesRenderer(BoundariesRenderer&&) = delete;
|
||||||
|
BoundariesRenderer& operator=(const BoundariesRenderer&) = delete;
|
||||||
|
BoundariesRenderer& operator=(BoundariesRenderer&&) = delete;
|
||||||
|
|
||||||
|
void render(const Renderer &renderer, const Color &color);
|
||||||
|
bool sameBoundaries(const ConstellationBoundaries*) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
GLshort* prepare();
|
||||||
|
|
||||||
|
celgl::VertexObject m_vo { GL_ARRAY_BUFFER, 0, GL_STATIC_DRAW };
|
||||||
|
ShaderProperties m_shadprop { ShaderProperties::UniformColor };
|
||||||
|
const ConstellationBoundaries *m_boundaries { nullptr };
|
||||||
|
GLsizei m_vtxTotal { 0 };
|
||||||
|
};
|
|
@ -63,6 +63,7 @@ std::ofstream hdrlog;
|
||||||
#include "pointstarrenderer.h"
|
#include "pointstarrenderer.h"
|
||||||
#include "orbitsampler.h"
|
#include "orbitsampler.h"
|
||||||
#include "asterismrenderer.h"
|
#include "asterismrenderer.h"
|
||||||
|
#include "boundariesrenderer.h"
|
||||||
#include <celutil/debug.h>
|
#include <celutil/debug.h>
|
||||||
#include <celmath/frustum.h>
|
#include <celmath/frustum.h>
|
||||||
#include <celmath/distance.h>
|
#include <celmath/distance.h>
|
||||||
|
@ -384,6 +385,7 @@ Renderer::~Renderer()
|
||||||
|
|
||||||
delete shaderManager;
|
delete shaderManager;
|
||||||
delete m_asterismRenderer;
|
delete m_asterismRenderer;
|
||||||
|
delete m_boundariesRenderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -4929,9 +4931,20 @@ void Renderer::renderAsterisms(const Universe& universe, float dist)
|
||||||
|
|
||||||
void Renderer::renderBoundaries(const Universe& universe, float dist)
|
void Renderer::renderBoundaries(const Universe& universe, float dist)
|
||||||
{
|
{
|
||||||
if ((renderFlags & ShowBoundaries) == 0 || universe.getBoundaries() == nullptr)
|
auto boundaries = universe.getBoundaries();
|
||||||
|
if ((renderFlags & ShowBoundaries) == 0 || boundaries == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (m_boundariesRenderer == nullptr)
|
||||||
|
{
|
||||||
|
m_boundariesRenderer = new BoundariesRenderer(boundaries);
|
||||||
|
}
|
||||||
|
else if (!m_boundariesRenderer->sameBoundaries(boundaries))
|
||||||
|
{
|
||||||
|
delete m_boundariesRenderer;
|
||||||
|
m_boundariesRenderer = new BoundariesRenderer(boundaries);
|
||||||
|
}
|
||||||
|
|
||||||
/* We'll linearly fade the boundaries as a function of the
|
/* We'll linearly fade the boundaries as a function of the
|
||||||
observer's distance to the origin of coordinates: */
|
observer's distance to the origin of coordinates: */
|
||||||
float opacity = 1.0f;
|
float opacity = 1.0f;
|
||||||
|
@ -4941,9 +4954,8 @@ void Renderer::renderBoundaries(const Universe& universe, float dist)
|
||||||
(MaxAsterismLabelsDist - MaxAsterismLabelsConstDist) + 1);
|
(MaxAsterismLabelsDist - MaxAsterismLabelsConstDist) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
glDisable(GL_TEXTURE_2D);
|
|
||||||
enableSmoothLines(renderFlags);
|
enableSmoothLines(renderFlags);
|
||||||
universe.getBoundaries()->render(Color(BoundaryColor, opacity), *this);
|
m_boundariesRenderer->render(*this, Color(BoundaryColor, opacity));
|
||||||
disableSmoothLines(renderFlags);
|
disableSmoothLines(renderFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@ class CurvePlot;
|
||||||
class Rect;
|
class Rect;
|
||||||
class PointStarVertexBuffer;
|
class PointStarVertexBuffer;
|
||||||
class AsterismRenderer;
|
class AsterismRenderer;
|
||||||
|
class BoundariesRenderer;
|
||||||
|
|
||||||
struct LightSource
|
struct LightSource
|
||||||
{
|
{
|
||||||
|
@ -753,6 +754,7 @@ class Renderer
|
||||||
bool settingsChanged;
|
bool settingsChanged;
|
||||||
|
|
||||||
AsterismRenderer* m_asterismRenderer { nullptr };
|
AsterismRenderer* m_asterismRenderer { nullptr };
|
||||||
|
BoundariesRenderer* m_boundariesRenderer { nullptr };
|
||||||
|
|
||||||
// True if we're in between a begin/endObjectAnnotations
|
// True if we're in between a begin/endObjectAnnotations
|
||||||
bool objectAnnotationSetOpen;
|
bool objectAnnotationSetOpen;
|
||||||
|
|
Loading…
Reference in New Issue