mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-05-11 22:10:07 -05:00
@@ -22,7 +22,8 @@ local LaunchTrail = {
|
||||
Color = { 0.70, 0.50, 0.20 },
|
||||
StartTime = "1968 DEC 21 12:51:00",
|
||||
EndTime = "1968 DEC 21 23:23:22",
|
||||
SampleInterval = 30
|
||||
SampleInterval = 30,
|
||||
RenderBinMode = "PostDeferredTransparent"
|
||||
},
|
||||
GUI = {
|
||||
Name = "Apollo 8 Launch Trail",
|
||||
|
||||
@@ -91,7 +91,8 @@ local initializeAndAddNodes = function()
|
||||
Body = identifier,
|
||||
Observer = transforms.EarthInertial.Identifier,
|
||||
File = path,
|
||||
LineNumber = 1
|
||||
LineNumber = 1,
|
||||
RenderBinMode = "PostDeferredTransparent"
|
||||
},
|
||||
Color = { 0.9, 0.6715, 0.0 },
|
||||
Fade = 1.5,
|
||||
|
||||
@@ -16,7 +16,7 @@ local SunGlare = {
|
||||
Texture = textures .. "/halo.png",
|
||||
BlendMode = "Additive",
|
||||
Opacity = 0.65,
|
||||
RenderableType = "Transparency"
|
||||
RenderableType = "PreDeferredTransparency"
|
||||
},
|
||||
Transform = {
|
||||
Translation = {
|
||||
|
||||
@@ -84,7 +84,8 @@ function satellites(title, file, color, group)
|
||||
Path = file,
|
||||
SegmentQuality = 3,
|
||||
Color = color,
|
||||
Fade = 1.5
|
||||
Fade = 1.5,
|
||||
RenderBinMode = "PostDeferredTransparent"
|
||||
},
|
||||
Tag = { "earth_satellites" },
|
||||
GUI = {
|
||||
|
||||
@@ -53,8 +53,9 @@ public:
|
||||
enum class RenderBin : int {
|
||||
Background = 1,
|
||||
Opaque = 2,
|
||||
Transparent = 4,
|
||||
Overlay = 8
|
||||
PreDeferredTransparent = 4,
|
||||
PostDeferredTransparent = 8,
|
||||
Overlay = 16
|
||||
};
|
||||
|
||||
static std::unique_ptr<Renderable> createFromDictionary(
|
||||
|
||||
@@ -621,7 +621,7 @@ void main() {
|
||||
// All calculations are done in Km:
|
||||
pixelDepth *= 0.001;
|
||||
positionObjectsCoords.xyz *= 0.001;
|
||||
|
||||
|
||||
if (pixelDepth < offset) {
|
||||
// ATM Occluded - Something in fron of ATM.
|
||||
atmosphereFinalColor += color;
|
||||
|
||||
@@ -350,7 +350,7 @@ RenderableLabels::RenderableLabels(const ghoul::Dictionary& dictionary)
|
||||
setRenderBinFromOpacity();
|
||||
break;
|
||||
case BlendModeAdditive:
|
||||
setRenderBin(Renderable::RenderBin::Transparent);
|
||||
setRenderBin(Renderable::RenderBin::PreDeferredTransparent);
|
||||
break;
|
||||
default:
|
||||
throw ghoul::MissingCaseException();
|
||||
@@ -608,7 +608,7 @@ void RenderableLabels::initialize() {
|
||||
throw ghoul::RuntimeError("Error loading objects labels data.");
|
||||
}
|
||||
|
||||
setRenderBin(Renderable::RenderBin::Transparent);
|
||||
setRenderBin(Renderable::RenderBin::PreDeferredTransparent);
|
||||
}
|
||||
|
||||
void RenderableLabels::initializeGL() {
|
||||
|
||||
@@ -130,7 +130,7 @@ RenderablePlane::RenderablePlane(const ghoul::Dictionary& dictionary)
|
||||
setRenderBinFromOpacity();
|
||||
break;
|
||||
case BlendModeAdditive:
|
||||
setRenderBin(Renderable::RenderBin::Transparent);
|
||||
setRenderBin(Renderable::RenderBin::PreDeferredTransparent);
|
||||
break;
|
||||
default:
|
||||
throw ghoul::MissingCaseException();
|
||||
|
||||
@@ -117,8 +117,11 @@ RenderablePlaneImageLocal::RenderablePlaneImageLocal(const ghoul::Dictionary& di
|
||||
else if (renderType == "Opaque") {
|
||||
setRenderBin(Renderable::RenderBin::Opaque);
|
||||
}
|
||||
else if (renderType == "Transparent") {
|
||||
setRenderBin(Renderable::RenderBin::Transparent);
|
||||
else if (renderType == "PreDeferredTransparent") {
|
||||
setRenderBin(Renderable::RenderBin::PreDeferredTransparent);
|
||||
}
|
||||
else if (renderType == "PostDeferredTransparent") {
|
||||
setRenderBin(Renderable::RenderBin::PostDeferredTransparent);
|
||||
}
|
||||
else if (renderType == "Overlay") {
|
||||
setRenderBin(Renderable::RenderBin::Overlay);
|
||||
|
||||
@@ -264,7 +264,7 @@ RenderableSphere::RenderableSphere(const ghoul::Dictionary& dictionary)
|
||||
_useAdditiveBlending = dictionary.value<bool>(UseAdditiveBlendingInfo.identifier);
|
||||
|
||||
if (_useAdditiveBlending) {
|
||||
setRenderBin(Renderable::RenderBin::Transparent);
|
||||
setRenderBin(Renderable::RenderBin::PreDeferredTransparent);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -68,6 +68,14 @@ namespace {
|
||||
{ "Points+Lines", RenderingModeLinesPoints }
|
||||
};
|
||||
|
||||
// Fragile! Keep in sync with documentation
|
||||
const std::map<std::string, openspace::Renderable::RenderBin> RenderBinModeConversion = {
|
||||
{ "Background", openspace::Renderable::RenderBin::Background },
|
||||
{ "Opaque", openspace::Renderable::RenderBin::Opaque },
|
||||
{ "PreDeferredTransparent", openspace::Renderable::RenderBin::PreDeferredTransparent},
|
||||
{ "PostDeferredTransparent", openspace::Renderable::RenderBin::PostDeferredTransparent}
|
||||
};
|
||||
|
||||
static const openspace::properties::PropertyOwner::PropertyOwnerInfo
|
||||
AppearanceInfo = {
|
||||
"Appearance",
|
||||
@@ -122,6 +130,13 @@ namespace {
|
||||
"corresponding points (and subpoints) are shown. 'Lines+Points' shows both parts."
|
||||
};
|
||||
|
||||
constexpr openspace::properties::Property::PropertyInfo RenderBinModeInfo = {
|
||||
"RenderBinMode",
|
||||
"RenderBin Mode",
|
||||
"Determines if the trails will be rendered after all other elements, including"
|
||||
"atmospheres if needed."
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
namespace openspace {
|
||||
@@ -255,6 +270,13 @@ RenderableTrail::RenderableTrail(const ghoul::Dictionary& dictionary)
|
||||
}
|
||||
|
||||
addPropertySubOwner(_appearance);
|
||||
|
||||
if (dictionary.hasKeyAndValue<std::string>(RenderBinModeInfo.identifier)) {
|
||||
openspace::Renderable::RenderBin cfgRenderBin = RenderBinModeConversion.at(
|
||||
dictionary.value<std::string>(RenderBinModeInfo.identifier)
|
||||
);
|
||||
setRenderBin(cfgRenderBin);
|
||||
}
|
||||
}
|
||||
|
||||
void RenderableTrail::initializeGL() {
|
||||
|
||||
@@ -184,8 +184,11 @@ RenderableTrailOrbit::RenderableTrailOrbit(const ghoul::Dictionary& dictionary)
|
||||
else if (renderType == "Opaque") {
|
||||
setRenderBin(Renderable::RenderBin::Opaque);
|
||||
}
|
||||
else if (renderType == "Transparent") {
|
||||
setRenderBin(Renderable::RenderBin::Transparent);
|
||||
else if (renderType == "PreDeferredTransparent") {
|
||||
setRenderBin(Renderable::RenderBin::PreDeferredTransparent);
|
||||
}
|
||||
else if (renderType == "PostDeferredTransparent") {
|
||||
setRenderBin(Renderable::RenderBin::PostDeferredTransparent);
|
||||
}
|
||||
else if (renderType == "Overlay") {
|
||||
setRenderBin(Renderable::RenderBin::Overlay);
|
||||
|
||||
@@ -67,13 +67,16 @@ Fragment getFragment() {
|
||||
|
||||
if (distanceCenter > dLW) {
|
||||
frag.color.a = 0.0;
|
||||
//discard;
|
||||
}
|
||||
else {
|
||||
frag.color.a *= pow(float((dLW - distanceCenter) / dLW), blendFactor);
|
||||
// if (frag.color.a < 0.4)
|
||||
// discard;
|
||||
}
|
||||
|
||||
frag.gPosition = vs_gPosition;
|
||||
|
||||
|
||||
// There is no normal here
|
||||
frag.gNormal = vec4(0.0, 0.0, -1.0, 1.0);
|
||||
|
||||
|
||||
@@ -699,7 +699,7 @@ void RenderableBillboardsCloud::initialize() {
|
||||
_colorOption.setValue(static_cast<int>(_colorRangeData.size() - 1));
|
||||
}
|
||||
|
||||
setRenderBin(Renderable::RenderBin::Transparent);
|
||||
setRenderBin(Renderable::RenderBin::PreDeferredTransparent);
|
||||
}
|
||||
|
||||
void RenderableBillboardsCloud::initializeGL() {
|
||||
|
||||
@@ -435,7 +435,7 @@ RenderablePlanesCloud::RenderablePlanesCloud(const ghoul::Dictionary& dictionary
|
||||
setRenderBin(Renderable::RenderBin::Opaque);
|
||||
break;
|
||||
case BlendModeAdditive:
|
||||
setRenderBin(Renderable::RenderBin::Transparent);
|
||||
setRenderBin(Renderable::RenderBin::PreDeferredTransparent);
|
||||
break;
|
||||
default:
|
||||
throw ghoul::MissingCaseException();
|
||||
|
||||
@@ -50,6 +50,14 @@ namespace {
|
||||
constexpr const char* KeyFile = "Path";
|
||||
constexpr const char* KeyLineNum = "LineNumber";
|
||||
|
||||
// Fragile! Keep in sync with documentation
|
||||
const std::map<std::string, openspace::Renderable::RenderBin> RenderBinModeConversion = {
|
||||
{ "Background", openspace::Renderable::RenderBin::Background },
|
||||
{ "Opaque", openspace::Renderable::RenderBin::Opaque },
|
||||
{ "PreDeferredTransparent", openspace::Renderable::RenderBin::PreDeferredTransparent},
|
||||
{ "PostDeferredTransparent", openspace::Renderable::RenderBin::PostDeferredTransparent}
|
||||
};
|
||||
|
||||
constexpr const std::array<int, 36> LeapYears = {
|
||||
1956, 1960, 1964, 1968, 1972, 1976, 1980, 1984, 1988, 1992, 1996,
|
||||
2000, 2004, 2008, 2012, 2016, 2020, 2024, 2028, 2032, 2036, 2040,
|
||||
@@ -152,6 +160,13 @@ namespace {
|
||||
"Number of objects to render sequentially from StartRenderIdx"
|
||||
};
|
||||
|
||||
constexpr openspace::properties::Property::PropertyInfo RenderBinModeInfo = {
|
||||
"RenderBinMode",
|
||||
"RenderBin Mode",
|
||||
"Determines if the trails will be rendered after all other elements, including"
|
||||
"atmospheres if needed."
|
||||
};
|
||||
|
||||
// Count the number of full days since the beginning of 2000 to the beginning of
|
||||
// the parameter 'year'
|
||||
int countDays(int year) {
|
||||
@@ -345,8 +360,8 @@ double RenderableOrbitalKepler::epochFromYMDdSubstring(const std::string& epochS
|
||||
|
||||
RenderableOrbitalKepler::RenderableOrbitalKepler(const ghoul::Dictionary& dict)
|
||||
: Renderable(dict)
|
||||
, _path(PathInfo)
|
||||
, _segmentQuality(SegmentQualityInfo, 2, 1, 10)
|
||||
, _path(PathInfo)
|
||||
, _upperLimit(UpperLimitInfo, 1000, 1, 1000000)
|
||||
, _startRenderIdx(StartRenderIdxInfo, 0, 0, 1)
|
||||
, _sizeRender(RenderSizeInfo, 1, 1, 2)
|
||||
@@ -400,7 +415,14 @@ RenderableOrbitalKepler::RenderableOrbitalKepler(const ghoul::Dictionary& dict)
|
||||
_startRenderIdxCallbackHandle = _startRenderIdx.onChange(_updateStartRenderIdxSelect);
|
||||
_sizeRenderCallbackHandle = _sizeRender.onChange(_updateRenderSizeSelect);
|
||||
|
||||
setRenderBin(Renderable::RenderBin::Overlay);
|
||||
if (dict.hasKeyAndValue<std::string>(RenderBinModeInfo.identifier)) {
|
||||
openspace::Renderable::RenderBin cfgRenderBin = RenderBinModeConversion.at(
|
||||
dict.value<std::string>(RenderBinModeInfo.identifier)
|
||||
);
|
||||
setRenderBin(cfgRenderBin);
|
||||
} else {
|
||||
setRenderBin(Renderable::RenderBin::PostDeferredTransparent);
|
||||
}
|
||||
}
|
||||
|
||||
void RenderableOrbitalKepler::initializeGL() {
|
||||
|
||||
@@ -585,7 +585,8 @@ void ABufferRenderer::render(Scene* scene, Camera* camera, float blackoutFactor)
|
||||
// Render the scene to the fragment buffer. Collect renderer tasks (active raycasters)
|
||||
int renderBinMask = static_cast<int>(Renderable::RenderBin::Background) |
|
||||
static_cast<int>(Renderable::RenderBin::Opaque) |
|
||||
static_cast<int>(Renderable::RenderBin::Transparent) |
|
||||
static_cast<int>(Renderable::RenderBin::PreDeferredTransparent) |
|
||||
static_cast<int>(Renderable::RenderBin::PostDeferredTransparent) |
|
||||
static_cast<int>(Renderable::RenderBin::Overlay);
|
||||
|
||||
Time time = global::timeManager.time();
|
||||
|
||||
@@ -1226,8 +1226,8 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac
|
||||
}
|
||||
|
||||
{
|
||||
GLDebugGroup group("Transparent");
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Transparent);
|
||||
GLDebugGroup group("PreDeferredTransparent");
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::PreDeferredTransparent);
|
||||
scene->render(data, tasks);
|
||||
}
|
||||
|
||||
@@ -1265,10 +1265,16 @@ void FramebufferRenderer::render(Scene* scene, Camera* camera, float blackoutFac
|
||||
}
|
||||
performDeferredTasks(tasks.deferredcasterTasks);
|
||||
}
|
||||
|
||||
|
||||
glDrawBuffers(1, &ColorAttachment01Array[_pingPongIndex]);
|
||||
glEnablei(GL_BLEND, 0);
|
||||
|
||||
{
|
||||
GLDebugGroup group("PostDeferredTransparent");
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::PostDeferredTransparent);
|
||||
scene->render(data, tasks);
|
||||
}
|
||||
|
||||
{
|
||||
GLDebugGroup group("Overlay");
|
||||
data.renderBinMask = static_cast<int>(Renderable::RenderBin::Overlay);
|
||||
|
||||
@@ -235,21 +235,25 @@ void Renderable::onEnabledChange(std::function<void(bool)> callback) {
|
||||
}
|
||||
|
||||
void Renderable::setRenderBinFromOpacity() {
|
||||
if (_opacity > 0.f && _opacity < 1.f) {
|
||||
setRenderBin(Renderable::RenderBin::Transparent);
|
||||
}
|
||||
else {
|
||||
setRenderBin(Renderable::RenderBin::Opaque);
|
||||
if (_renderBin != Renderable::RenderBin::PostDeferredTransparent) {
|
||||
if (_opacity >= 0.f && _opacity < 1.f) {
|
||||
setRenderBin(Renderable::RenderBin::PreDeferredTransparent);
|
||||
}
|
||||
else {
|
||||
setRenderBin(Renderable::RenderBin::Opaque);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Renderable::registerUpdateRenderBinFromOpacity() {
|
||||
_opacity.onChange([this](){
|
||||
if (_opacity > 0.f && _opacity < 1.f) {
|
||||
setRenderBin(Renderable::RenderBin::Transparent);
|
||||
}
|
||||
else {
|
||||
setRenderBin(Renderable::RenderBin::Opaque);
|
||||
if (_renderBin != Renderable::RenderBin::PostDeferredTransparent) {
|
||||
if (_opacity >= 0.f && _opacity < 1.f) {
|
||||
setRenderBin(Renderable::RenderBin::PreDeferredTransparent);
|
||||
}
|
||||
else {
|
||||
setRenderBin(Renderable::RenderBin::Opaque);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
+4
-1
@@ -57,9 +57,12 @@ namespace {
|
||||
return "Opaque";
|
||||
}
|
||||
else if (renderBin == 4) {
|
||||
return "Transparent";
|
||||
return "PreDeferredTransparent";
|
||||
}
|
||||
else if (renderBin == 8) {
|
||||
return "PostDeferredTransparent";
|
||||
}
|
||||
else if (renderBin == 16) {
|
||||
return "Overlay";
|
||||
}
|
||||
else {
|
||||
|
||||
Reference in New Issue
Block a user