This commit is contained in:
halx99 2020-02-23 21:27:14 +08:00
parent 82808a321d
commit 734b5bd44f
5 changed files with 36 additions and 91 deletions

View File

@ -1,64 +0,0 @@
#pragma once
#include <type_traits>
namespace cocos2d{
template<typename Enum>
struct EnableBitMaskOperators
{
static const bool enable = false;
};
template<typename Enum>
typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type
operator |(Enum lhs, Enum rhs)
{
using underlying = typename std::underlying_type<Enum>::type;
return static_cast<Enum> (
static_cast<underlying>(lhs) |
static_cast<underlying>(rhs)
);
}
template<typename Enum>
typename std::enable_if<EnableBitMaskOperators<Enum>::enable, bool>::type
operator ==(Enum lhs, Enum rhs)
{
using underlying = typename std::underlying_type<Enum>::type;
static_cast<underlying>(lhs) == static_cast<underlying>(rhs);
}
template<typename Enum>
typename std::enable_if<EnableBitMaskOperators<Enum>::enable, Enum>::type&
operator |=(Enum& lhs, Enum rhs)
{
using underlying = typename std::underlying_type<Enum>::type;
lhs = static_cast<Enum> (
static_cast<underlying>(lhs) |
static_cast<underlying>(rhs)
);
return lhs;
}
template<typename Enum>
typename std::enable_if<EnableBitMaskOperators<Enum>::enable, unsigned int>::type
operator &(Enum lhs, Enum rhs)
{
using underlying = typename std::underlying_type<Enum>::type;
using impl_type = typename std::make_unsigned<underlying>::type;
return impl_type (
static_cast<impl_type>(lhs) &
static_cast<impl_type>(rhs)
);
}
#define ENABLE_BITMASK_OPERATORS(x) \
template<> \
struct EnableBitMaskOperators<x> \
{ \
static const bool enable = true; \
};
} // end of namespace cocos2d{

View File

@ -4,6 +4,7 @@ Copyright (c) 2010-2012 cocos2d-x.org
Copyright (c) 2011 Zynga Inc. Copyright (c) 2011 Zynga Inc.
Copyright (c) 2013-2016 Chukong Technologies Inc. Copyright (c) 2013-2016 Chukong Technologies Inc.
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
Copyright (c) 2020 c4games.com.
http://www.cocos2d-x.org http://www.cocos2d-x.org
@ -32,7 +33,6 @@ THE SOFTWARE.
#include "math/CCGeometry.h" #include "math/CCGeometry.h"
#include "math/CCMath.h" #include "math/CCMath.h"
#include "base/CCRef.h" #include "base/CCRef.h"
#include "base/CCEnumClass.h"
#include "renderer/backend/Types.h" #include "renderer/backend/Types.h"
/** /**
@ -660,7 +660,7 @@ enum class ClearFlag : uint8_t
STENCIL = 1 << 2, STENCIL = 1 << 2,
ALL = COLOR | DEPTH | STENCIL ALL = COLOR | DEPTH | STENCIL
}; };
ENABLE_BITMASK_OPERATORS(ClearFlag) CC_ENABLE_BITMASK_OPS(ClearFlag)
enum class RenderTargetFlag : uint8_t enum class RenderTargetFlag : uint8_t
{ {
@ -669,7 +669,7 @@ enum class RenderTargetFlag : uint8_t
STENCIL = 1 << 2, STENCIL = 1 << 2,
ALL = COLOR | DEPTH | STENCIL ALL = COLOR | DEPTH | STENCIL
}; };
ENABLE_BITMASK_OPERATORS(RenderTargetFlag) CC_ENABLE_BITMASK_OPS(RenderTargetFlag)
using TextureUsage = backend::TextureUsage; using TextureUsage = backend::TextureUsage;
using PixelFormat = backend::PixelFormat; using PixelFormat = backend::PixelFormat;

View File

@ -1,6 +1,7 @@
/**************************************************************************** /****************************************************************************
Copyright (c) 2013-2016 Chukong Technologies Inc. Copyright (c) 2013-2016 Chukong Technologies Inc.
Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
Copyright (c) 2020 c4games.com.
http://www.cocos2d-x.org http://www.cocos2d-x.org
@ -594,8 +595,7 @@ void Renderer::drawBatchedTriangles()
if (!firstCommand) if (!firstCommand)
{ {
batchesTotal++; batchesTotal++;
_triBatchesToDraw[batchesTotal].offset = _triBatchesToDraw[batchesTotal].offset = _triBatchesToDraw[batchesTotal - 1].offset + _triBatchesToDraw[batchesTotal - 1].indicesToDraw;
_triBatchesToDraw[batchesTotal-1].offset + _triBatchesToDraw[batchesTotal-1].indicesToDraw;
} }
_triBatchesToDraw[batchesTotal].cmd = cmd; _triBatchesToDraw[batchesTotal].cmd = cmd;
@ -778,7 +778,7 @@ void Renderer::beginRenderPass(RenderCommand* cmd)
void Renderer::setRenderTarget(RenderTargetFlag flags, Texture2D* colorAttachment, Texture2D* depthAttachment, Texture2D* stencilAttachment) void Renderer::setRenderTarget(RenderTargetFlag flags, Texture2D* colorAttachment, Texture2D* depthAttachment, Texture2D* stencilAttachment)
{ {
_renderTargetFlag = flags; _renderTargetFlag = flags;
if (flags & RenderTargetFlag::COLOR) if (_Bitmask_includes(RenderTargetFlag::COLOR, flags))
{ {
_renderPassDescriptor.needColorAttachment = true; _renderPassDescriptor.needColorAttachment = true;
if (colorAttachment) if (colorAttachment)
@ -795,7 +795,7 @@ void Renderer::setRenderTarget(RenderTargetFlag flags, Texture2D* colorAttachmen
_renderPassDescriptor.colorAttachmentsTexture[0] = nullptr; _renderPassDescriptor.colorAttachmentsTexture[0] = nullptr;
} }
if (flags & RenderTargetFlag::DEPTH) if (_Bitmask_includes(RenderTargetFlag::DEPTH, flags))
{ {
_renderPassDescriptor.depthTestEnabled = true; _renderPassDescriptor.depthTestEnabled = true;
if (depthAttachment) if (depthAttachment)
@ -812,7 +812,7 @@ void Renderer::setRenderTarget(RenderTargetFlag flags, Texture2D* colorAttachmen
_depthAttachment = nullptr; _depthAttachment = nullptr;
} }
if (flags & RenderTargetFlag::STENCIL) if (_Bitmask_includes(RenderTargetFlag::STENCIL, flags))
{ {
_stencilAttachment = stencilAttachment; _stencilAttachment = stencilAttachment;
_renderPassDescriptor.stencilTestEnabled = true; _renderPassDescriptor.stencilTestEnabled = true;
@ -838,7 +838,7 @@ void Renderer::clear(ClearFlag flags, const Color4F& color, float depth, unsigne
command->func = [=]() -> void { command->func = [=]() -> void {
backend::RenderPassDescriptor descriptor; backend::RenderPassDescriptor descriptor;
if (flags & ClearFlag::COLOR) if (_Bitmask_includes(ClearFlag::COLOR, flags))
{ {
_clearColor = color; _clearColor = color;
descriptor.clearColorValue = {color.r, color.g, color.b, color.a}; descriptor.clearColorValue = {color.r, color.g, color.b, color.a};
@ -846,14 +846,14 @@ void Renderer::clear(ClearFlag flags, const Color4F& color, float depth, unsigne
descriptor.needColorAttachment = true; descriptor.needColorAttachment = true;
descriptor.colorAttachmentsTexture[0] = _renderPassDescriptor.colorAttachmentsTexture[0]; descriptor.colorAttachmentsTexture[0] = _renderPassDescriptor.colorAttachmentsTexture[0];
} }
if (flags & ClearFlag::DEPTH) if (_Bitmask_includes(ClearFlag::DEPTH, flags))
{ {
descriptor.clearDepthValue = depth; descriptor.clearDepthValue = depth;
descriptor.needClearDepth = true; descriptor.needClearDepth = true;
descriptor.depthTestEnabled = true; descriptor.depthTestEnabled = true;
descriptor.depthAttachmentTexture = _renderPassDescriptor.depthAttachmentTexture; descriptor.depthAttachmentTexture = _renderPassDescriptor.depthAttachmentTexture;
} }
if (flags & ClearFlag::STENCIL) if (_Bitmask_includes(ClearFlag::STENCIL, flags))
{ {
descriptor.clearStencilValue = stencil; descriptor.clearStencilValue = stencil;
descriptor.needClearStencil = true; descriptor.needClearStencil = true;

View File

@ -1,5 +1,6 @@
/**************************************************************************** /****************************************************************************
Copyright (c) 2018-2019 Xiamen Yaji Software Co., Ltd. Copyright (c) 2018-2019 Xiamen Yaji Software Co., Ltd.
Copyright (c) 2020 c4games.com.
http://www.cocos2d-x.org http://www.cocos2d-x.org
@ -28,6 +29,7 @@
#include <cstdint> #include <cstdint>
#include <string> #include <string>
#include "base/bitmask.h"
CC_BACKEND_BEGIN CC_BACKEND_BEGIN
@ -237,13 +239,19 @@ enum class BlendFactor : uint32_t
enum class ColorWriteMask : uint32_t enum class ColorWriteMask : uint32_t
{ {
NONE = 0x00000000, RED_BIT = 0,
RED = 0x00000001, GREEN_BIT = 1,
GREEN = 0x00000002, BLUE_BIT = 2,
BLUE = 0x00000004, ALPHA_BIT = 3,
ALPHA = 0x00000008, NONE = 0,
RED = 1 << RED_BIT,
GREEN = 1 << GREEN_BIT,
BLUE = 1 << BLUE_BIT,
ALPHA = 1 << ALPHA_BIT,
ALL = 0x0000000F ALL = 0x0000000F
}; };
CC_ENABLE_BITMASK_OPS(ColorWriteMask)
CC_ENABLE_BITSHIFT_OPS(ColorWriteMask)
struct SamplerDescriptor struct SamplerDescriptor
{ {

View File

@ -1,5 +1,6 @@
/**************************************************************************** /****************************************************************************
Copyright (c) 2018-2019 Xiamen Yaji Software Co., Ltd. Copyright (c) 2018-2019 Xiamen Yaji Software Co., Ltd.
Copyright (c) 2020 c4games.com.
http://www.cocos2d-x.org http://www.cocos2d-x.org
@ -53,10 +54,10 @@ void RenderPipelineGL::updateBlendState(const BlendDescriptor& descriptor)
auto destinationRGBBlendFactor = UtilsGL::toGLBlendFactor(descriptor.destinationRGBBlendFactor); auto destinationRGBBlendFactor = UtilsGL::toGLBlendFactor(descriptor.destinationRGBBlendFactor);
auto sourceAlphaBlendFactor = UtilsGL::toGLBlendFactor(descriptor.sourceAlphaBlendFactor); auto sourceAlphaBlendFactor = UtilsGL::toGLBlendFactor(descriptor.sourceAlphaBlendFactor);
auto destinationAlphaBlendFactor = UtilsGL::toGLBlendFactor(descriptor.destinationAlphaBlendFactor); auto destinationAlphaBlendFactor = UtilsGL::toGLBlendFactor(descriptor.destinationAlphaBlendFactor);
auto writeMaskRed = (uint32_t)descriptor.writeMask & (uint32_t)ColorWriteMask::RED; GLboolean writeMaskRed = (GLboolean)((descriptor.writeMask & ColorWriteMask::RED) >> ColorWriteMask::RED_BIT);
auto writeMaskGreen = (uint32_t)descriptor.writeMask & (uint32_t)ColorWriteMask::GREEN; GLboolean writeMaskGreen = (GLboolean)((descriptor.writeMask & ColorWriteMask::GREEN) >> ColorWriteMask::GREEN_BIT);
auto writeMaskBlue = (uint32_t)descriptor.writeMask & (uint32_t)ColorWriteMask::BLUE; GLboolean writeMaskBlue = (GLboolean)((descriptor.writeMask & ColorWriteMask::BLUE) >> ColorWriteMask::BLUE_BIT);
auto writeMaskAlpha = (uint32_t)descriptor.writeMask & (uint32_t)ColorWriteMask::ALPHA; GLboolean writeMaskAlpha = (GLboolean)((descriptor.writeMask & ColorWriteMask::ALPHA) >> ColorWriteMask::ALPHA_BIT);
if (blendEnabled) if (blendEnabled)
{ {