vladislavbelov
a1f98b016b
Differential Revision: https://code.wildfiregames.com/D4471 This was SVN commit r26286.
136 lines
3.1 KiB
C++
136 lines
3.1 KiB
C++
/* Copyright (C) 2022 Wildfire Games.
|
|
* This file is part of 0 A.D.
|
|
*
|
|
* 0 A.D. 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.
|
|
*
|
|
* 0 A.D. 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 0 A.D. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "precompiled.h"
|
|
|
|
#include "Mapping.h"
|
|
|
|
#include "lib/code_annotation.h"
|
|
#include "lib/config2.h"
|
|
|
|
namespace Renderer
|
|
{
|
|
|
|
namespace Backend
|
|
{
|
|
|
|
namespace GL
|
|
{
|
|
|
|
namespace Mapping
|
|
{
|
|
|
|
GLenum FromCompareOp(const CompareOp compareOp)
|
|
{
|
|
GLenum op = GL_NEVER;
|
|
switch (compareOp)
|
|
{
|
|
#define CASE(NAME, GL_NAME) case CompareOp::NAME: op = GL_NAME; break
|
|
CASE(NEVER, GL_NEVER);
|
|
CASE(LESS, GL_LESS);
|
|
CASE(EQUAL, GL_EQUAL);
|
|
CASE(LESS_OR_EQUAL, GL_LEQUAL);
|
|
CASE(GREATER, GL_GREATER);
|
|
CASE(NOT_EQUAL, GL_NOTEQUAL);
|
|
CASE(GREATER_OR_EQUAL, GL_GEQUAL);
|
|
CASE(ALWAYS, GL_ALWAYS);
|
|
#undef CASE
|
|
}
|
|
return op;
|
|
}
|
|
|
|
GLenum FromStencilOp(const StencilOp stencilOp)
|
|
{
|
|
GLenum op = GL_KEEP;
|
|
switch (stencilOp)
|
|
{
|
|
#define CASE(NAME, GL_NAME) case StencilOp::NAME: op = GL_NAME; break
|
|
CASE(KEEP, GL_KEEP);
|
|
CASE(ZERO, GL_ZERO);
|
|
CASE(REPLACE, GL_REPLACE);
|
|
CASE(INCREMENT_AND_CLAMP, GL_INCR);
|
|
CASE(DECREMENT_AND_CLAMP, GL_DECR);
|
|
CASE(INVERT, GL_INVERT);
|
|
CASE(INCREMENT_AND_WRAP, GL_INCR_WRAP);
|
|
CASE(DECREMENT_AND_WRAP, GL_DECR_WRAP);
|
|
#undef CASE
|
|
}
|
|
return op;
|
|
}
|
|
|
|
GLenum FromBlendFactor(const BlendFactor blendFactor)
|
|
{
|
|
GLenum factor = GL_ZERO;
|
|
switch (blendFactor)
|
|
{
|
|
#define CASE(NAME) case BlendFactor::NAME: factor = GL_##NAME; break
|
|
CASE(ZERO);
|
|
CASE(ONE);
|
|
CASE(SRC_COLOR);
|
|
CASE(ONE_MINUS_SRC_COLOR);
|
|
CASE(DST_COLOR);
|
|
CASE(ONE_MINUS_DST_COLOR);
|
|
CASE(SRC_ALPHA);
|
|
CASE(ONE_MINUS_SRC_ALPHA);
|
|
CASE(DST_ALPHA);
|
|
CASE(ONE_MINUS_DST_ALPHA);
|
|
CASE(CONSTANT_COLOR);
|
|
CASE(ONE_MINUS_CONSTANT_COLOR);
|
|
CASE(CONSTANT_ALPHA);
|
|
CASE(ONE_MINUS_CONSTANT_ALPHA);
|
|
CASE(SRC_ALPHA_SATURATE);
|
|
#undef CASE
|
|
// Dual source blending presents only in GL_VERSION >= 3.3.
|
|
case BlendFactor::SRC1_COLOR: FALLTHROUGH;
|
|
case BlendFactor::ONE_MINUS_SRC1_COLOR: FALLTHROUGH;
|
|
case BlendFactor::SRC1_ALPHA: FALLTHROUGH;
|
|
case BlendFactor::ONE_MINUS_SRC1_ALPHA:
|
|
debug_warn("Unsupported blend factor.");
|
|
break;
|
|
}
|
|
return factor;
|
|
}
|
|
|
|
GLenum FromBlendOp(const BlendOp blendOp)
|
|
{
|
|
GLenum mode = GL_FUNC_ADD;
|
|
switch (blendOp)
|
|
{
|
|
case BlendOp::ADD: mode = GL_FUNC_ADD; break;
|
|
case BlendOp::SUBTRACT: mode = GL_FUNC_SUBTRACT; break;
|
|
case BlendOp::REVERSE_SUBTRACT: mode = GL_FUNC_REVERSE_SUBTRACT; break;
|
|
#if !CONFIG2_GLES
|
|
case BlendOp::MIN: mode = GL_MIN; break;
|
|
case BlendOp::MAX: mode = GL_MAX; break;
|
|
#else
|
|
case BlendOp::MIN: FALLTHROUGH;
|
|
case BlendOp::MAX:
|
|
debug_warn("Unsupported blend op.");
|
|
break;
|
|
#endif
|
|
};
|
|
return mode;
|
|
}
|
|
|
|
} // namespace Mapping
|
|
|
|
} // namespace GL
|
|
|
|
} // namespace Backend
|
|
|
|
} // namespace Renderer
|