Skip to content

Commit 09247cb

Browse files
committed
Stencil override from GraphicInstance
1 parent 8ecabaf commit 09247cb

25 files changed

Lines changed: 337 additions & 22 deletions

‎Renderer.xml‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,5 +76,15 @@
7676
<Property type="EnumFlagsU32" name="m_renderPassFlags" value="ZPrepass|Opaque|Transparency"/>
7777
<Property type="Bool" name="m_particles" value="true"/>
7878
<Property type="Bool" name="m_debugFrustum" value="false"/>
79+
<Property type="String" name="m_stencilBitNames">
80+
<Value name="StencilBit_0" value="Bit 0"/>
81+
<Value name="StencilBit_1" value="Bit 1"/>
82+
<Value name="StencilBit_2" value="Bit 2"/>
83+
<Value name="StencilBit_3" value="Bit 3"/>
84+
<Value name="StencilBit_4" value="Bit 4"/>
85+
<Value name="StencilBit_5" value="Bit 5"/>
86+
<Value name="StencilBit_6" value="Bit 6"/>
87+
<Value name="StencilBit_7" value="Bit 7"/>
88+
</Property>
7989
</Object>
8090
</Root>

‎src/core/Misc/BitMask/BitMask.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace vg::core
1212
//--------------------------------------------------------------------------------------
1313
BitMask::BitMask(uint _bitCount, bool _default)
1414
{
15-
setBitCount(_bitCount);
15+
setBitCount(_bitCount, _default);
1616
}
1717

1818
//--------------------------------------------------------------------------------------

‎src/core/Misc/BitMask/BitMask.h‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,11 @@ namespace vg::core
1313
BitMask(core::uint _bitCount = 0, bool _default = false);
1414

1515
bool setBitCount(core::uint _count, bool _default = false);
16-
//bool setNames(const core::vector<core::string> & _names);
1716
bool setBitValue(core::uint _index, bool _value);
1817

1918
VG_INLINE core::uint getBitCount() const;
20-
//VG_INLINE const core::vector<core::string> & getNames() const;
2119
VG_INLINE bool getBitValue(core::uint _index) const;
20+
VG_INLINE T getValue(core::uint _pageIndex = 0) const;
2221

2322
core::string toString(bool _leadingZeroes = false) const;
2423
bool fromString(const core::string & _value, core::uint _bitCount);
@@ -34,7 +33,6 @@ namespace vg::core
3433
private:
3534
core::uint m_bitCount = 0;
3635
core::vector<T> m_bits;
37-
//core::vector<core::string> m_names;
3836
};
3937
}
4038

‎src/core/Misc/BitMask/BitMask.inl‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,6 @@ namespace vg::core
1212
return m_bitCount;
1313
}
1414

15-
//--------------------------------------------------------------------------------------
16-
//VG_INLINE const core::vector<core::string> & BitMask::getNames() const
17-
//{
18-
// return m_names;
19-
//}
20-
2115
//--------------------------------------------------------------------------------------
2216
VG_INLINE bool BitMask::getBitValue(core::uint _index) const
2317
{
@@ -29,4 +23,11 @@ namespace vg::core
2923

3024
return m_bits[itemIndex] & (T(1) << T(localBitIndex));
3125
}
26+
27+
//--------------------------------------------------------------------------------------
28+
VG_INLINE BitMask::T BitMask::getValue(core::uint _pageIndex) const
29+
{
30+
VG_ASSERT(_pageIndex < m_bits.size());
31+
return m_bits[_pageIndex];
32+
}
3233
}

‎src/core/Misc/GenericEnumTypes.h‎

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,35 @@
22

33
namespace vg::core
44
{
5+
#define vg_generic_enum_value_8(Namespace, enumTypename) vg_enum_class(Namespace, enumTypename, vg::core::u8, \
6+
enumTypename##_0, \
7+
enumTypename##_1, \
8+
enumTypename##_2, \
9+
enumTypename##_3, \
10+
enumTypename##_4, \
11+
enumTypename##_5, \
12+
enumTypename##_6, \
13+
enumTypename##_7 \
14+
);
15+
16+
#define vg_generic_enum_value_16(Namespace, enumTypename) vg_enum_class(Namespace, enumTypename, vg::core::u8, \
17+
enumTypename##_0, enumTypename##_1, enumTypename##_2, enumTypename##_3, \
18+
enumTypename##_4, enumTypename##_5, enumTypename##_6, enumTypename##_7, \
19+
enumTypename##_8, enumTypename##_9, enumTypename##_10, enumTypename##_11, \
20+
enumTypename##_12, enumTypename##_13, enumTypename##_14, enumTypename##_15 \
21+
);
22+
23+
#define vg_generic_enum_value_32(Namespace, enumTypename) vg_enum_class(Namespace, enumTypename, vg::core::u8, \
24+
enumTypename##_0, enumTypename##_1, enumTypename##_2, enumTypename##_3, \
25+
enumTypename##_4, enumTypename##_5, enumTypename##_6, enumTypename##_7, \
26+
enumTypename##_8, enumTypename##_9, enumTypename##_10, enumTypename##_11, \
27+
enumTypename##_12, enumTypename##_13, enumTypename##_14, enumTypename##_15, \
28+
enumTypename##_16, enumTypename##_17, enumTypename##_18, enumTypename##_19, \
29+
enumTypename##_20, enumTypename##_21, enumTypename##_22, enumTypename##_23, \
30+
enumTypename##_24, enumTypename##_25, enumTypename##_26, enumTypename##_27, \
31+
enumTypename##_28, enumTypename##_29, enumTypename##_30, enumTypename##_31 \
32+
);
33+
534
#define vg_generic_enum_value_64(Namespace, enumTypename) vg_enum_class(Namespace, enumTypename, vg::core::u8, \
635
enumTypename##_0, enumTypename##_1, enumTypename##_2, enumTypename##_3, \
736
enumTypename##_4, enumTypename##_5, enumTypename##_6, enumTypename##_7, \
@@ -21,7 +50,36 @@ namespace vg::core
2150
enumTypename##_60, enumTypename##_61, enumTypename##_62, enumTypename##_63 \
2251
);
2352

24-
#define vg_generic_enum_bitfield_64(Namespace, enumTypename) vg_enum_class(Namespace, enumTypename, vg::core::u64, \
53+
#define vg_generic_enum_bitfield_8(Namespace, enumTypename) vg_enum_class(Namespace, enumTypename, vg::core::u8, \
54+
enumTypename##_0 = 0x01, \
55+
enumTypename##_1 = 0x02, \
56+
enumTypename##_2 = 0x04, \
57+
enumTypename##_3 = 0x08, \
58+
enumTypename##_4 = 0x10, \
59+
enumTypename##_5 = 0x20, \
60+
enumTypename##_6 = 0x40, \
61+
enumTypename##_7 = 0x80 \
62+
);
63+
64+
#define vg_generic_enum_bitfield_16(Namespace, enumTypename) vg_enum_class(Namespace, enumTypename, vg::core::u16, \
65+
enumTypename##_0 = 0x00000001ULL, enumTypename##_1 = 0x00000002ULL, enumTypename##_2 = 0x00000004ULL, enumTypename##_3 = 0x00000008ULL, \
66+
enumTypename##_4 = 0x00000010ULL, enumTypename##_5 = 0x00000020ULL, enumTypename##_6 = 0x00000040ULL, enumTypename##_7 = 0x00000080ULL, \
67+
enumTypename##_8 = 0x00000100ULL, enumTypename##_9 = 0x00000200ULL, enumTypename##_10 = 0x00000400ULL, enumTypename##_11 = 0x00000800ULL, \
68+
enumTypename##_12 = 0x00001000ULL, enumTypename##_13 = 0x00002000ULL, enumTypename##_14 = 0x00004000ULL, enumTypename##_15 = 0x00008000ULL \
69+
);
70+
71+
#define vg_generic_enum_bitfield_32(Namespace, enumTypename) vg_enum_class(Namespace, enumTypename, vg::core::u32, \
72+
enumTypename##_0 = 0x00000001ULL, enumTypename##_1 = 0x00000002ULL, enumTypename##_2 = 0x00000004ULL, enumTypename##_3 = 0x00000008ULL, \
73+
enumTypename##_4 = 0x00000010ULL, enumTypename##_5 = 0x00000020ULL, enumTypename##_6 = 0x00000040ULL, enumTypename##_7 = 0x00000080ULL, \
74+
enumTypename##_8 = 0x00000100ULL, enumTypename##_9 = 0x00000200ULL, enumTypename##_10 = 0x00000400ULL, enumTypename##_11 = 0x00000800ULL, \
75+
enumTypename##_12 = 0x00001000ULL, enumTypename##_13 = 0x00002000ULL, enumTypename##_14 = 0x00004000ULL, enumTypename##_15 = 0x00008000ULL, \
76+
enumTypename##_16 = 0x00010000ULL, enumTypename##_17 = 0x00020000ULL, enumTypename##_18 = 0x00040000ULL, enumTypename##_19 = 0x00080000ULL, \
77+
enumTypename##_20 = 0x00100000ULL, enumTypename##_21 = 0x00200000ULL, enumTypename##_22 = 0x00400000ULL, enumTypename##_23 = 0x00800000ULL, \
78+
enumTypename##_24 = 0x01000000ULL, enumTypename##_25 = 0x02000000ULL, enumTypename##_26 = 0x04000000ULL, enumTypename##_27 = 0x08000000ULL, \
79+
enumTypename##_28 = 0x10000000ULL, enumTypename##_29 = 0x20000000ULL, enumTypename##_30 = 0x40000000ULL, enumTypename##_31 = 0x80000000ULL \
80+
);
81+
82+
#define vg_generic_enum_bitfield_64(Namespace, enumTypename) vg_enum_class(Namespace, enumTypename, vg::core::u64, \
2583
enumTypename##_0 = 0x0000000000000001ULL, enumTypename##_1 = 0x0000000000000002ULL, enumTypename##_2 = 0x0000000000000004ULL, enumTypename##_3 = 0x0000000000000008ULL, \
2684
enumTypename##_4 = 0x0000000000000010ULL, enumTypename##_5 = 0x0000000000000020ULL, enumTypename##_6 = 0x0000000000000040ULL, enumTypename##_7 = 0x0000000000000080ULL, \
2785
enumTypename##_8 = 0x0000000000000100ULL, enumTypename##_9 = 0x0000000000000200ULL, enumTypename##_10 = 0x0000000000000400ULL, enumTypename##_11 = 0x0000000000000800ULL, \

‎src/core/Object/Property.hpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ namespace vg::core
186186
rangeCallback(_other.rangeCallback),
187187
isHiddenCallback(_other.isHiddenCallback),
188188
isReadOnlyCallback(_other.isReadOnlyCallback),
189+
namesCallback(_other.namesCallback),
189190
enums(_other.enums)
190191
{
191192

‎src/engine/Component/Renderer/Instance/Mesh/MeshComponent.cpp‎

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ namespace vg::engine
5555

5656
registerProperty(MeshComponent, m_batchMask, "Batch Mask");
5757
setPropertyNamesCallback(MeshComponent, m_batchMask, getBatchNames);
58+
59+
registerPropertyGroupBegin(MeshComponent, "Stencil");
60+
registerProperty(MeshComponent, m_stencil, "Stencil");
61+
registerPropertyGroupEnd(MeshComponent);
5862

5963
return true;
6064
}
@@ -63,7 +67,8 @@ namespace vg::engine
6367
MeshComponent::MeshComponent(const core::string & _name, IObject * _parent) :
6468
super(_name, _parent),
6569
m_meshResource(_name, this),
66-
m_meshMaterials(_name, this)
70+
m_meshMaterials(_name, this),
71+
m_stencil(_name, this)
6772
{
6873
m_meshInstance = (IMeshInstance *)CreateFactoryObject(MeshInstance, _name, this);
6974

@@ -102,6 +107,13 @@ namespace vg::engine
102107
}
103108
}
104109

110+
//--------------------------------------------------------------------------------------
111+
bool MeshComponent::RegisterUID()
112+
{
113+
m_stencil.RegisterUID();
114+
return super::RegisterUID();
115+
}
116+
105117
//--------------------------------------------------------------------------------------
106118
void MeshComponent::Update(const Context & _context)
107119
{
@@ -220,6 +232,11 @@ namespace vg::engine
220232
}
221233
}
222234
}
235+
else if (!strcmp(_prop.GetName(), "m_stencil"))
236+
{
237+
if (nullptr != m_meshInstance)
238+
m_meshInstance->SetStencil(m_stencil.isEnabled(), m_stencil.getGfxStencilRef(), m_stencil.getGfxStencilState());
239+
}
223240

224241
super::OnPropertyChanged(_object, _prop, _notifyParent);
225242
}
@@ -235,8 +252,8 @@ namespace vg::engine
235252
IMeshModel * meshModel = m_meshResource.getMeshModel();
236253
m_meshInstance->SetModel(Lod::Lod0, meshModel);
237254
m_batchMask.setBitCount(meshModel->GetBatchCount(), true);
238-
//m_batchMask.setNames(meshModel->GetBatchNames());
239255
m_meshInstance->SetBatchMask(m_batchMask);
256+
m_meshInstance->SetStencil(m_stencil.isEnabled(), m_stencil.getGfxStencilRef(), m_stencil.getGfxStencilState());
240257

241258
if (GetGameObject()->isEnabledInHierarchy() && isEnabled())
242259
{

‎src/engine/Component/Renderer/Instance/Mesh/MeshComponent.h‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "engine/IMeshComponent.h"
55
#include "engine/Resource/Mesh/MeshResource.h"
66
#include "engine/Component/Renderer/MaterialResourceList.h"
7+
#include "engine/Component/Renderer/RenderStates.h"
78

89
namespace vg::renderer
910
{
@@ -23,6 +24,8 @@ namespace vg::engine
2324
MeshComponent (const core::string & _name, IObject * _parent);
2425
~MeshComponent ();
2526

27+
bool RegisterUID () final override;
28+
2629
void Update (const Context & _context) override;
2730

2831
void OnPropertyChanged (IObject * _object, const core::IProperty & _prop, bool _notifyParent) override;
@@ -55,6 +58,7 @@ namespace vg::engine
5558
MeshResource m_meshResource;
5659
MaterialResourceList m_meshMaterials;
5760
core::BitMask m_batchMask;
61+
StencilState m_stencil;
5862
};
5963
}
6064

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#include "engine/Precomp.h"
2+
#include "RenderStates.h"
3+
#include "engine/Engine.h"
4+
#include "renderer/IRendererOptions.h"
5+
6+
#if !VG_ENABLE_INLINE
7+
#include "RenderStates.inl"
8+
#endif
9+
10+
using namespace vg::core;
11+
using namespace vg::renderer;
12+
13+
namespace vg::engine
14+
{
15+
VG_REGISTER_OBJECT_CLASS(StencilState, "StencilState");
16+
17+
//--------------------------------------------------------------------------------------
18+
bool isStencilOptionReadOnly(const IObject * _object, const IProperty * _prop, uint _index)
19+
{
20+
const StencilState * state = VG_SAFE_STATIC_CAST(const StencilState, _object);
21+
return !state->isEnabled();
22+
}
23+
24+
//--------------------------------------------------------------------------------------
25+
core::vector<core::string> getStencilRefNames(const IObject * _object, const IProperty * _prop, core::uint _index)
26+
{
27+
IRendererOptions * rendererOptions = Engine::get()->getRendererOptions();
28+
29+
core::vector<core::string> names(8);
30+
for (uint i = 0; i < 8; ++i)
31+
names[i] = rendererOptions->GetStencilBitName(i);
32+
33+
return names;
34+
}
35+
36+
//--------------------------------------------------------------------------------------
37+
bool StencilState::registerProperties(IClassDesc & _desc)
38+
{
39+
super::registerProperties(_desc);
40+
41+
registerProperty(StencilState, m_enable, "Enable");
42+
43+
registerProperty(StencilState, m_ref, "Ref");
44+
setPropertyNamesCallback(StencilState, m_ref, getStencilRefNames);
45+
setPropertyReadOnlyCallback(StencilState, m_ref, isStencilOptionReadOnly);
46+
47+
registerPropertyEnum(StencilState, gfx::ComparisonFunc, m_func, "Func");
48+
setPropertyReadOnlyCallback(StencilState, m_func, isStencilOptionReadOnly);
49+
50+
registerPropertyEnum(StencilState, gfx::StencilOp, m_passOp, "Pass");
51+
setPropertyReadOnlyCallback(StencilState, m_passOp, isStencilOptionReadOnly);
52+
53+
registerPropertyEnum(StencilState, gfx::StencilOp, m_failOp, "Fail");
54+
setPropertyReadOnlyCallback(StencilState, m_failOp, isStencilOptionReadOnly);
55+
56+
registerPropertyEnum(StencilState, gfx::StencilOp, m_depthFailOp, "DepthFail");
57+
setPropertyReadOnlyCallback(StencilState, m_depthFailOp, isStencilOptionReadOnly);
58+
59+
return true;
60+
}
61+
62+
//--------------------------------------------------------------------------------------
63+
StencilState::StencilState(const vg::core::string & _name, vg::core::IObject * _parent) :
64+
super(_name, _parent),
65+
m_ref(8)
66+
{
67+
}
68+
69+
//--------------------------------------------------------------------------------------
70+
StencilState::~StencilState()
71+
{
72+
}
73+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#pragma once
2+
3+
#include "core/Object/Object.h"
4+
#include "core/Misc/BitMask/BitMask.h"
5+
#include "gfx/PipelineState/Graphic/DepthStencilState.h"
6+
7+
namespace vg::engine
8+
{
9+
class StencilState : public core::Object
10+
{
11+
public:
12+
VG_CLASS_DECL(StencilState, core::Object);
13+
14+
StencilState(const vg::core::string & _name, vg::core::IObject * _parent);
15+
~StencilState();
16+
17+
VG_INLINE bool isEnabled() const;
18+
VG_INLINE core::u8 getGfxStencilRef() const;
19+
VG_INLINE gfx::StencilState getGfxStencilState() const;
20+
21+
private:
22+
bool m_enable = false;
23+
core::BitMask m_ref = 0x0;
24+
gfx::ComparisonFunc m_func = gfx::ComparisonFunc::Always;
25+
gfx::StencilOp m_passOp = gfx::StencilOp::Keep;
26+
gfx::StencilOp m_failOp = gfx::StencilOp::Keep;
27+
gfx::StencilOp m_depthFailOp = gfx::StencilOp::Keep;
28+
};
29+
}
30+
31+
#if VG_ENABLE_INLINE
32+
#include "RenderStates.inl"
33+
#endif

0 commit comments

Comments
 (0)