157 lines
4.5 KiB
C++
157 lines
4.5 KiB
C++
//
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Copyright(C) 2000-2016 Christoph Oelckers
|
|
// All rights reserved.
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Lesser 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 Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
// along with this program. If not, see http://www.gnu.org/licenses/
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
//
|
|
|
|
#include "gl_load/gl_system.h"
|
|
#include "p_local.h"
|
|
#include "p_lnspec.h"
|
|
#include "a_sharedglobal.h"
|
|
#include "g_levellocals.h"
|
|
#include "actorinlines.h"
|
|
#include "hwrenderer/dynlights/hw_dynlightdata.h"
|
|
|
|
#include "gl_load/gl_interface.h"
|
|
#include "hwrenderer/utility/hw_cvars.h"
|
|
#include "gl/renderer/gl_renderer.h"
|
|
#include "hwrenderer/dynlights/hw_lightbuffer.h"
|
|
#include "gl/scene/gl_drawinfo.h"
|
|
|
|
EXTERN_CVAR(Bool, gl_seamless)
|
|
|
|
//==========================================================================
|
|
//
|
|
//
|
|
//
|
|
//==========================================================================
|
|
|
|
void FDrawInfo::AddWall(GLWall *wall)
|
|
{
|
|
if (wall->flags & GLWall::GLWF_TRANSLUCENT)
|
|
{
|
|
auto newwall = drawlists[GLDL_TRANSLUCENT].NewWall();
|
|
*newwall = *wall;
|
|
}
|
|
else
|
|
{
|
|
bool masked = GLWall::passflag[wall->type] == 1 ? false : (wall->gltexture && wall->gltexture->isMasked());
|
|
int list;
|
|
|
|
if ((wall->flags & GLWall::GLWF_SKYHACK && wall->type == RENDERWALL_M2S))
|
|
{
|
|
list = GLDL_MASKEDWALLSOFS;
|
|
}
|
|
else
|
|
{
|
|
list = masked ? GLDL_MASKEDWALLS : GLDL_PLAINWALLS;
|
|
}
|
|
auto newwall = drawlists[list].NewWall();
|
|
*newwall = *wall;
|
|
}
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
//
|
|
//
|
|
//==========================================================================
|
|
|
|
void FDrawInfo::AddMirrorSurface(GLWall *w)
|
|
{
|
|
w->type = RENDERWALL_MIRRORSURFACE;
|
|
auto newwall = drawlists[GLDL_TRANSLUCENTBORDER].NewWall();
|
|
*newwall = *w;
|
|
|
|
// Invalidate vertices to allow setting of texture coordinates
|
|
newwall->vertcount = 0;
|
|
|
|
FVector3 v = newwall->glseg.Normal();
|
|
auto tcs = newwall->tcs;
|
|
tcs[GLWall::LOLFT].u = tcs[GLWall::LORGT].u = tcs[GLWall::UPLFT].u = tcs[GLWall::UPRGT].u = v.X;
|
|
tcs[GLWall::LOLFT].v = tcs[GLWall::LORGT].v = tcs[GLWall::UPLFT].v = tcs[GLWall::UPRGT].v = v.Z;
|
|
newwall->MakeVertices(this, false);
|
|
newwall->ProcessDecals(this);
|
|
}
|
|
|
|
//==========================================================================
|
|
//
|
|
// FDrawInfo::AddFlat
|
|
//
|
|
// Checks texture, lighting and translucency settings and puts this
|
|
// plane in the appropriate render list.
|
|
//
|
|
//==========================================================================
|
|
|
|
void FDrawInfo::AddFlat(GLFlat *flat, bool fog)
|
|
{
|
|
int list;
|
|
|
|
if (flat->renderstyle != STYLE_Translucent || flat->alpha < 1.f - FLT_EPSILON || fog || flat->gltexture == nullptr)
|
|
{
|
|
// translucent 3D floors go into the regular translucent list, translucent portals go into the translucent border list.
|
|
list = (flat->renderflags&SSRF_RENDER3DPLANES) ? GLDL_TRANSLUCENT : GLDL_TRANSLUCENTBORDER;
|
|
}
|
|
else if (flat->gltexture->tex->GetTranslucency())
|
|
{
|
|
if (flat->stack)
|
|
{
|
|
list = GLDL_TRANSLUCENTBORDER;
|
|
}
|
|
else if ((flat->renderflags&SSRF_RENDER3DPLANES) && !flat->plane.plane.isSlope())
|
|
{
|
|
list = GLDL_TRANSLUCENT;
|
|
}
|
|
else
|
|
{
|
|
list = GLDL_PLAINFLATS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
bool masked = flat->gltexture->isMasked() && ((flat->renderflags&SSRF_RENDER3DPLANES) || flat->stack);
|
|
list = masked ? GLDL_MASKEDFLATS : GLDL_PLAINFLATS;
|
|
}
|
|
auto newflat = drawlists[list].NewFlat();
|
|
*newflat = *flat;
|
|
}
|
|
|
|
|
|
//==========================================================================
|
|
//
|
|
//
|
|
//
|
|
//==========================================================================
|
|
void FDrawInfo::AddSprite(GLSprite *sprite, bool translucent)
|
|
{
|
|
int list;
|
|
// [BB] Allow models to be drawn in the GLDL_TRANSLUCENT pass.
|
|
if (translucent || sprite->actor == nullptr || (!sprite->modelframe && (sprite->actor->renderflags & RF_SPRITETYPEMASK) != RF_WALLSPRITE))
|
|
{
|
|
list = GLDL_TRANSLUCENT;
|
|
}
|
|
else
|
|
{
|
|
list = GLDL_MODELS;
|
|
}
|
|
|
|
auto newsprt = drawlists[list].NewSprite();
|
|
*newsprt = *sprite;
|
|
}
|
|
|