Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 617b23d

Browse files
committedNov 20, 2022
Get rid of NuklearRenderer interface.
1 parent afb18b2 commit 617b23d

11 files changed

+217
-233
lines changed
 

‎CMakeLists.txt

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ set(NuklearOgre_SOURCES
1616
include/CompositorPassNuklearProvider.h
1717
include/NuklearOgre.h
1818
include/NuklearRenderable.h
19-
include/NuklearRenderer.h
2019
)
2120

2221
add_library(NuklearOgre INTERFACE)

‎demo/NuklearOgreDemo.cpp

+95-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55

66
#include <OgreCamera.h>
77
#include <OgreFrustum.h>
8+
#include <OgreImage2.h>
89
#include <OgreRoot.h>
10+
#include <OgreTextureGpuManager.h>
911
#include <OgreWindow.h>
1012
#include <Compositor/OgreCompositorManager2.h>
1113
#include <OgreConfigFile.h>
@@ -18,6 +20,17 @@
1820
#include <System/Android/AndroidSystems.h>
1921
#include <System/MainEntryPoints.h>
2022

23+
#define NK_INCLUDE_FIXED_TYPES
24+
#define NK_INCLUDE_STANDARD_IO
25+
#define NK_INCLUDE_STANDARD_VARARGS
26+
#define NK_INCLUDE_DEFAULT_ALLOCATOR
27+
#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
28+
#define NK_INCLUDE_FONT_BAKING
29+
#define NK_INCLUDE_DEFAULT_FONT
30+
#define NK_IMPLEMENTATION
31+
#include <nuklear.h>
32+
#include <RegisterCompositor.h>
33+
2134
#if OGRE_PLATFORM != OGRE_PLATFORM_ANDROID
2235
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
2336
INT WINAPI WinMainApp( HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR strCmdLine, INT nCmdShow )
@@ -32,11 +45,75 @@ int mainApp( int argc, const char *argv[] )
3245

3346
namespace Demo
3447
{
48+
void nk_font_stash_begin(nk_font_atlas *atlas)
49+
{
50+
nk_font_atlas_init_default(atlas);
51+
nk_font_atlas_begin(atlas);
52+
}
53+
54+
void nk_font_stash_end(nk_font_atlas *atlas, nk_context *ctx,
55+
Ogre::TextureGpuManager *textureManager,
56+
nk_draw_null_texture *texNull)
57+
{
58+
const void *image; int w, h;
59+
image = nk_font_atlas_bake(atlas, &w, &h, NK_FONT_ATLAS_RGBA32);
60+
61+
Ogre::Image2 *imagePtr = new Ogre::Image2;
62+
imagePtr->loadDynamicImage(const_cast<void *>(image), w, h, 1, Ogre::TextureTypes::Type2D, Ogre::PFG_RGBA8_UNORM_SRGB, false, 1);
63+
64+
Ogre::TextureGpu *texture = textureManager->createTexture("FontAtlas", Ogre::GpuPageOutStrategy::Discard,
65+
Ogre::TextureFlags::AutomaticBatching |
66+
Ogre::TextureFlags::PrefersLoadingFromFileAsSRGB,
67+
Ogre::TextureTypes::Type2D);
68+
texture->scheduleTransitionTo(Ogre::GpuResidency::Resident, imagePtr, true);
69+
70+
nk_font_atlas_end(atlas, nk_handle_ptr(texture), texNull);
71+
72+
if (atlas->default_font)
73+
nk_style_set_font(ctx, &atlas->default_font->handle);
74+
}
75+
3576
class NuklearOgreGraphicsSystem : public GraphicsSystem
3677
{
3778
Ogre::CompositorWorkspace* setupCompositor() override
3879
{
39-
RegisterNuklearCompositor(mRoot, mRenderer);
80+
mNuklearCtx.reset(new nk_context);
81+
mFontAtlas.reset(new nk_font_atlas);
82+
nk_init_default(mNuklearCtx.get(), 0);
83+
84+
nk_convert_config config;
85+
memset(&config, 0, sizeof(config));
86+
config.circle_segment_count = 22;
87+
config.curve_segment_count = 22;
88+
config.arc_segment_count = 22;
89+
config.global_alpha = 1.0f;
90+
config.shape_AA = NK_ANTI_ALIASING_OFF;
91+
config.line_AA = NK_ANTI_ALIASING_OFF;
92+
93+
/* Load Fonts: if none of these are loaded a default font will be used */
94+
/* Load Cursor: if you uncomment cursor loading please hide the cursor */
95+
nk_font_atlas *atlas = mFontAtlas.get();
96+
nk_font_stash_begin(atlas);
97+
/*struct nk_font *droid = nk_font_atlas_add_from_file(atlas, "../../../extra_font/DroidSans.ttf", 14, 0);*/
98+
/*struct nk_font *roboto = nk_font_atlas_add_from_file(atlas, "../../../extra_font/Roboto-Regular.ttf", 16, 0);*/
99+
/*struct nk_font *future = nk_font_atlas_add_from_file(atlas, "../../../extra_font/kenvector_future_thin.ttf", 13, 0);*/
100+
/*struct nk_font *clean = nk_font_atlas_add_from_file(atlas, "../../../extra_font/ProggyClean.ttf", 12, 0);*/
101+
/*struct nk_font *tiny = nk_font_atlas_add_from_file(atlas, "../../../extra_font/ProggyTiny.ttf", 10, 0);*/
102+
/*struct nk_font *cousine = nk_font_atlas_add_from_file(atlas, "../../../extra_font/Cousine-Regular.ttf", 13, 0);*/
103+
nk_context *ctx = mNuklearCtx.get();
104+
Ogre::TextureGpuManager *textureManager = getRoot()->getHlmsManager()->getRenderSystem()->getTextureGpuManager();
105+
nk_font_stash_end(atlas, ctx, textureManager, &config.tex_null);
106+
/*nk_style_load_all_cursors(ctx, atlas->cursors);*/
107+
/*nk_style_set_font(ctx, &roboto->handle);*/
108+
109+
mNuklearRenderer.reset(new NuklearOgre::NuklearRenderer(getRoot(), getSceneManager(), config));
110+
mNuklearRenderer->addContext(mNuklearCtx.get());
111+
112+
NuklearOgreGameState *gameState = static_cast<NuklearOgreGameState *>(mCurrentGameState);
113+
gameState->mNuklearCtx = mNuklearCtx.get();
114+
gameState->mNuklearRenderer = mNuklearRenderer.get();
115+
116+
NuklearOgre::RegisterCompositor(mRoot, mNuklearRenderer.get());
40117

41118
addResourceLocation(mResourcePath + "resources", "FileSystem", "Nuklear");
42119
Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup("Nuklear", true);
@@ -171,15 +248,28 @@ namespace Demo
171248
}
172249
}
173250

251+
void deinitialize() override
252+
{
253+
nk_font_atlas_clear(mFontAtlas.get());
254+
nk_free(mNuklearCtx.get());
255+
mNuklearCtx.reset();
256+
mFontAtlas.reset();
257+
mNuklearRenderer.reset();
258+
259+
GraphicsSystem::deinitialize();
260+
}
261+
174262
public:
175-
NuklearOgreGraphicsSystem(GameState *gameState, NuklearOgre::NuklearRenderer *renderer) :
176-
GraphicsSystem(gameState), mRenderer(renderer)
263+
NuklearOgreGraphicsSystem(GameState *gameState) :
264+
GraphicsSystem(gameState)
177265
{
178266
mAlwaysAskForConfig = false;
179267
}
180268

181269
private:
182-
NuklearOgre::NuklearRenderer *mRenderer;
270+
std::unique_ptr<nk_context> mNuklearCtx;
271+
std::unique_ptr<nk_font_atlas> mFontAtlas;
272+
std::unique_ptr<NuklearOgre::NuklearRenderer> mNuklearRenderer;
183273
};
184274

185275
void MainEntryPoints::createSystems( GameState **outGraphicsGameState,
@@ -191,7 +281,7 @@ namespace Demo
191281
"OgreNext backend for Nuklear immediate-mode GUI. \n"
192282
);
193283

194-
GraphicsSystem *graphicsSystem = new NuklearOgreGraphicsSystem(gfxGameState, gfxGameState);
284+
GraphicsSystem *graphicsSystem = new NuklearOgreGraphicsSystem(gfxGameState);
195285

196286
gfxGameState->_notifyGraphicsSystem( graphicsSystem );
197287

‎demo/NuklearOgreGameState.cpp

+6-96
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
#include <Math/Array/OgreObjectMemoryManager.h>
44
#include <OgreCommon.h>
55
#include <OgreGpuResource.h>
6-
#include <OgreImage2.h>
76
#include <OgreRoot.h>
8-
#include <OgreTextureGpu.h>
9-
#include <OgreTextureGpuManager.h>
107
#include <OgreWindow.h>
118
#include <SDL_events.h>
129
#include <TutorialGameState.h>
@@ -21,120 +18,33 @@
2118
#define NK_INCLUDE_VERTEX_BUFFER_OUTPUT
2219
#define NK_INCLUDE_FONT_BAKING
2320
#define NK_INCLUDE_DEFAULT_FONT
24-
#define NK_IMPLEMENTATION
2521
#include <nuklear.h>
26-
#include "NuklearOgre.h"
22+
#include <NuklearRenderer.h>
2723

2824
#include "../../Nuklear/demo/common/overview.c"
2925

3026
#define GUI_RENDER_QUEUE_ID 200u
3127

3228
namespace Demo
3329
{
34-
void RegisterNuklearCompositor(Ogre::Root *root, NuklearOgre::NuklearRenderer *renderer)
35-
{
36-
NuklearOgre::RegisterCompositor(root, renderer);
37-
}
38-
3930
NuklearOgreGameState::NuklearOgreGameState(const Ogre::String &helpDescription)
4031
: TutorialGameState(helpDescription)
4132
{
4233

4334
}
4435

45-
void nk_font_stash_begin(nk_font_atlas *atlas)
46-
{
47-
nk_font_atlas_init_default(atlas);
48-
nk_font_atlas_begin(atlas);
49-
}
50-
51-
void nk_font_stash_end(nk_font_atlas *atlas, nk_context *ctx,
52-
Ogre::TextureGpuManager *textureManager,
53-
nk_draw_null_texture *texNull)
54-
{
55-
const void *image; int w, h;
56-
image = nk_font_atlas_bake(atlas, &w, &h, NK_FONT_ATLAS_RGBA32);
57-
58-
Ogre::Image2 *imagePtr = new Ogre::Image2;
59-
imagePtr->loadDynamicImage(const_cast<void *>(image), w, h, 1, Ogre::TextureTypes::Type2D, Ogre::PFG_RGBA8_UNORM_SRGB, false, 1);
60-
61-
Ogre::TextureGpu *texture = textureManager->createTexture("FontAtlas", Ogre::GpuPageOutStrategy::Discard,
62-
Ogre::TextureFlags::AutomaticBatching |
63-
Ogre::TextureFlags::PrefersLoadingFromFileAsSRGB,
64-
Ogre::TextureTypes::Type2D);
65-
texture->scheduleTransitionTo(Ogre::GpuResidency::Resident, imagePtr, true);
66-
67-
nk_font_atlas_end(atlas, nk_handle_ptr(texture), texNull);
68-
69-
if (atlas->default_font)
70-
nk_style_set_font(ctx, &atlas->default_font->handle);
71-
}
72-
7336
void NuklearOgreGameState::createScene01(void)
7437
{
75-
mNuklearCtx.reset(new nk_context);
76-
mFontAtlas.reset(new nk_font_atlas);
77-
nk_init_default(mNuklearCtx.get(), 0);
78-
79-
nk_convert_config config;
80-
memset(&config, 0, sizeof(config));
81-
config.circle_segment_count = 22;
82-
config.curve_segment_count = 22;
83-
config.arc_segment_count = 22;
84-
config.global_alpha = 1.0f;
85-
config.shape_AA = NK_ANTI_ALIASING_OFF;
86-
config.line_AA = NK_ANTI_ALIASING_OFF;
87-
88-
/* Load Fonts: if none of these are loaded a default font will be used */
89-
/* Load Cursor: if you uncomment cursor loading please hide the cursor */
90-
nk_font_atlas *atlas = mFontAtlas.get();
91-
nk_font_stash_begin(atlas);
92-
/*struct nk_font *droid = nk_font_atlas_add_from_file(atlas, "../../../extra_font/DroidSans.ttf", 14, 0);*/
93-
/*struct nk_font *roboto = nk_font_atlas_add_from_file(atlas, "../../../extra_font/Roboto-Regular.ttf", 16, 0);*/
94-
/*struct nk_font *future = nk_font_atlas_add_from_file(atlas, "../../../extra_font/kenvector_future_thin.ttf", 13, 0);*/
95-
/*struct nk_font *clean = nk_font_atlas_add_from_file(atlas, "../../../extra_font/ProggyClean.ttf", 12, 0);*/
96-
/*struct nk_font *tiny = nk_font_atlas_add_from_file(atlas, "../../../extra_font/ProggyTiny.ttf", 10, 0);*/
97-
/*struct nk_font *cousine = nk_font_atlas_add_from_file(atlas, "../../../extra_font/Cousine-Regular.ttf", 13, 0);*/
98-
nk_context *ctx = mNuklearCtx.get();
99-
Ogre::TextureGpuManager *textureManager = mGraphicsSystem->getRoot()->getHlmsManager()->getRenderSystem()->getTextureGpuManager();
100-
nk_font_stash_end(atlas, ctx, textureManager, &config.tex_null);
101-
/*nk_style_load_all_cursors(ctx, atlas->cursors);*/
102-
/*nk_style_set_font(ctx, &roboto->handle);*/
103-
104-
Ogre::SceneManager *sceneManager = mGraphicsSystem->getSceneManager();
105-
Ogre::ObjectMemoryManager *memManager = &sceneManager->_getEntityMemoryManager(Ogre::SCENE_DYNAMIC);
106-
mNuklearOgre.reset(new NuklearOgre::NuklearOgre(mGraphicsSystem->getRoot(), mGraphicsSystem->getSceneManager(), config));
107-
mNuklearOgre->addContext(mNuklearCtx.get());
108-
10938
mCameraController = new CameraController( mGraphicsSystem, false );
11039

11140
TutorialGameState::createScene01();
11241

113-
nk_input_begin(mNuklearCtx.get());
114-
}
115-
116-
void NuklearOgreGameState::destroyScene(void)
117-
{
118-
Ogre::SceneManager *sceneManager = mGraphicsSystem->getSceneManager();
119-
sceneManager->getRootSceneNode(Ogre::SCENE_DYNAMIC)->removeAndDestroyAllChildren();
120-
121-
nk_font_atlas_clear(mFontAtlas.get());
122-
nk_free(mNuklearCtx.get());
123-
mNuklearCtx.reset();
124-
mFontAtlas.reset();
125-
mNuklearOgre.reset();
126-
127-
TutorialGameState::destroyScene();
128-
}
129-
130-
void NuklearOgreGameState::render(Ogre::SceneManager *sceneManager)
131-
{
132-
mNuklearOgre->render(sceneManager);
42+
nk_input_begin(mNuklearCtx);
13343
}
13444

13545
void NuklearOgreGameState::update(float timeSinceLast)
13646
{
137-
nk_context *ctx = mNuklearCtx.get();
47+
nk_context *ctx = mNuklearCtx;
13848

13949
nk_input_end(ctx);
14050

@@ -182,7 +92,7 @@ namespace Demo
18292

18393
void NuklearOgreGameState::mouseMoved(const SDL_Event &evt)
18494
{
185-
nk_context *ctx = mNuklearCtx.get();
95+
nk_context *ctx = mNuklearCtx;
18696

18797
if (evt.type == SDL_MOUSEMOTION)
18898
{
@@ -228,14 +138,14 @@ namespace Demo
228138

229139
void NuklearOgreGameState::mousePressed(const SDL_MouseButtonEvent &button, Ogre::uint8 id)
230140
{
231-
nk_context *ctx = mNuklearCtx.get();
141+
nk_context *ctx = mNuklearCtx;
232142
handleMouseButton(button, true, ctx);
233143

234144
TutorialGameState::mousePressed(button, id);
235145
}
236146
void NuklearOgreGameState::mouseReleased(const SDL_MouseButtonEvent &button, Ogre::uint8 id)
237147
{
238-
nk_context *ctx = mNuklearCtx.get();
148+
nk_context *ctx = mNuklearCtx;
239149
handleMouseButton(button, false, ctx);
240150

241151
TutorialGameState::mouseReleased(button, id);

‎demo/NuklearOgreGameState.h

+4-13
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,22 @@
44
#include <OgrePrerequisites.h>
55
#include <TutorialGameState.h>
66
#include <memory>
7-
#include <NuklearRenderer.h>
87

98
struct nk_context;
10-
struct nk_font_atlas;
119

1210
namespace NuklearOgre
1311
{
14-
class NuklearOgre;
12+
class NuklearRenderer;
1513
}
1614

1715
namespace Demo
1816
{
19-
void RegisterNuklearCompositor(Ogre::Root *root, NuklearOgre::NuklearRenderer *renderer);
20-
21-
class NuklearOgreGameState : public TutorialGameState, public NuklearOgre::NuklearRenderer
17+
class NuklearOgreGameState : public TutorialGameState
2218
{
2319
public:
2420
NuklearOgreGameState(const Ogre::String &helpDescription);
2521

2622
void createScene01(void) override;
27-
void destroyScene(void) override;
28-
29-
void render(Ogre::SceneManager *) override;
3023

3124
void update(float timeSinceLast) override;
3225

@@ -39,9 +32,7 @@ namespace Demo
3932
void keyPressed(const SDL_KeyboardEvent &arg) override;
4033
void keyReleased(const SDL_KeyboardEvent &arg) override;
4134

42-
private:
43-
std::unique_ptr<nk_context> mNuklearCtx;
44-
std::unique_ptr<nk_font_atlas> mFontAtlas;
45-
std::unique_ptr<NuklearOgre::NuklearOgre> mNuklearOgre;
35+
NuklearOgre::NuklearRenderer *mNuklearRenderer;
36+
nk_context *mNuklearCtx;
4637
};
4738
}

‎include/CompositorPassNuklear.h

+5-9
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,15 @@
66

77
namespace NuklearOgre
88
{
9-
class NuklearOgre;
10-
119
class CompositorPassNuklear : public Ogre::CompositorPass
1210
{
1311
public:
1412
CompositorPassNuklear(const Ogre::CompositorPassDef *definition,
1513
Ogre::Camera *defaultCamera,
16-
Ogre::SceneManager *sceneManager,
1714
const Ogre::RenderTargetViewDef *rtv,
1815
Ogre::CompositorNode *parentNode,
1916
NuklearRenderer *renderer)
2017
: Ogre::CompositorPass(definition, parentNode)
21-
, mSceneManager(sceneManager)
2218
, mCamera(defaultCamera)
2319
, mRenderer(renderer)
2420
{
@@ -38,14 +34,15 @@ namespace NuklearOgre
3834

3935
notifyPassEarlyPreExecuteListeners();
4036

41-
mSceneManager->_setCamerasInProgress(Ogre::CamerasInProgress(mCamera));
42-
mSceneManager->_setCurrentCompositorPass(this);
37+
Ogre::SceneManager *sceneManager = mRenderer->getSceneManager();
38+
sceneManager->_setCamerasInProgress(Ogre::CamerasInProgress(mCamera));
39+
sceneManager->_setCurrentCompositorPass(this);
4340

4441
notifyPassPreExecuteListeners();
4542

46-
mRenderer->render(mSceneManager);
43+
mRenderer->render();
4744

48-
mSceneManager->_setCurrentCompositorPass(0);
45+
sceneManager->_setCurrentCompositorPass(0);
4946

5047
notifyPassPosExecuteListeners();
5148

@@ -54,7 +51,6 @@ namespace NuklearOgre
5451

5552
private:
5653
NuklearRenderer *mRenderer;
57-
Ogre::SceneManager *mSceneManager;
5854
Ogre::Camera *mCamera;
5955
};
6056
}

‎include/CompositorPassNuklearProvider.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace NuklearOgre
3232
Ogre::SceneManager *sceneManager) override
3333
{
3434
const CompositorPassNuklearDef *def = static_cast<const CompositorPassNuklearDef *>(definition);
35-
return OGRE_NEW CompositorPassNuklear(def, defaultCamera, sceneManager, rtvDef, parentNode, mRenderer);
35+
return OGRE_NEW CompositorPassNuklear(def, defaultCamera, rtvDef, parentNode, mRenderer);
3636
}
3737

3838
private:

‎include/HlmsNuklear.h

-2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22

33
#include <CommandBuffer/OgreCbShaderBuffer.h>
44
#include <OgreDescriptorSetTexture.h>
5-
#include <OgreHlmsCommon.h>
65
#include <OgreHlmsListener.h>
76
#include <OgreHlmsUnlit.h>
87
#include <OgreHlmsUnlitDatablock.h>
98
#include <OgreMatrix4.h>
109
#include <OgreQuaternion.h>
11-
#include <OgreUnlitProperty.h>
1210
#include <Vao/OgreConstBufferPacked.h>
1311
#include <Vao/OgreTexBufferPacked.h>
1412
#include <CommandBuffer/OgreCommandBuffer.h>

‎include/HlmsNuklearDatablock.h

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#pragma once
22

33
#include <OgreHlmsUnlitDatablock.h>
4+
45
namespace NuklearOgre
56
{
67
class HlmsNuklearDatablock : public Ogre::HlmsUnlitDatablock

‎include/NuklearOgre.h

-104
This file was deleted.

‎include/NuklearRenderer.h

+89-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,100 @@
11
#pragma once
22

3+
#include <CommandBuffer/OgreCommandBuffer.h>
4+
#include <Compositor/OgreCompositorManager2.h>
5+
#include <OgreHlmsManager.h>
6+
#include <OgreHlmsCommon.h>
7+
#include <OgreRoot.h>
8+
#include <OgreHlms.h>
39
#include <OgreSceneManager.h>
10+
#include "NuklearRenderable.h"
411

512
namespace NuklearOgre
613
{
14+
static const Ogre::HlmsCache c_dummyCache(0, Ogre::HLMS_MAX, Ogre::HlmsPso());
15+
16+
struct UIVertex {
17+
float position[2];
18+
float uv[2];
19+
nk_byte col[4];
20+
};
21+
722
class NuklearRenderer
823
{
924
public:
10-
virtual void render(Ogre::SceneManager *sceneManager) = 0;
11-
virtual ~NuklearRenderer() {}
25+
NuklearRenderer(Ogre::Root *root, Ogre::SceneManager *sceneManager, const nk_convert_config &config)
26+
: mRoot(root)
27+
, mSceneManager(sceneManager)
28+
, mNuklearConfig(config)
29+
{
30+
static const struct nk_draw_vertex_layout_element vertex_layout[] = {
31+
{NK_VERTEX_POSITION, NK_FORMAT_FLOAT, NK_OFFSETOF(UIVertex, position)},
32+
{NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT, NK_OFFSETOF(UIVertex, uv)},
33+
{NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8, NK_OFFSETOF(UIVertex, col)},
34+
{NK_VERTEX_LAYOUT_END}
35+
};
36+
mNuklearConfig.vertex_layout = vertex_layout;
37+
mNuklearConfig.vertex_size = sizeof(UIVertex);
38+
mNuklearConfig.vertex_alignment = NK_ALIGNOF(UIVertex);
39+
40+
mVertexElements.reserve(4);
41+
mVertexElements.push_back(Ogre::VertexElement2( Ogre::VET_FLOAT2, Ogre::VES_POSITION ));
42+
mVertexElements.push_back(Ogre::VertexElement2( Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES ));
43+
mVertexElements.push_back(Ogre::VertexElement2( Ogre::VET_UBYTE4_NORM, Ogre::VES_DIFFUSE ));
44+
}
45+
46+
void addContext(nk_context *ctx)
47+
{
48+
mRenderables.emplace_back(
49+
new NuklearRenderable(mSceneManager, mRoot->getHlmsManager(), ctx, mNuklearConfig, mVertexElements));
50+
}
51+
52+
void removeContext(nk_context *ctx)
53+
{
54+
for (size_t i = 0; i < mRenderables.size(); ++i)
55+
{
56+
if (mRenderables[i]->getContext() == ctx)
57+
{
58+
mRenderables[i] = std::move(mRenderables.back());
59+
mRenderables.pop_back();
60+
break;
61+
}
62+
}
63+
}
64+
65+
void render()
66+
{
67+
mCommandBuffer.setCurrentRenderSystem(mSceneManager->getDestinationRenderSystem());
68+
69+
Ogre::Hlms *hlms = mRoot->getHlmsManager()->getHlms(Ogre::HLMS_UNLIT);
70+
Ogre::HlmsCache passCache = hlms->preparePassHash(0, false, false, mSceneManager);
71+
Ogre::uint32 lastVaoName = 0;
72+
Ogre::uint32 lastHlmsCacheHash = 0;
73+
const Ogre::HlmsCache *lastHlmsCache = &c_dummyCache;
74+
75+
for (size_t i = 0; i < mRenderables.size(); ++i)
76+
{
77+
mRenderables[i]->addCommands(mCommandBuffer, &lastHlmsCache, passCache, lastVaoName, lastHlmsCacheHash);
78+
}
79+
80+
hlms->preCommandBufferExecution(&mCommandBuffer);
81+
82+
mCommandBuffer.execute();
83+
84+
hlms->postCommandBufferExecution(&mCommandBuffer);
85+
}
86+
87+
Ogre::SceneManager *getSceneManager()
88+
{
89+
return mSceneManager;
90+
}
91+
92+
private:
93+
Ogre::Root *mRoot;
94+
Ogre::SceneManager *mSceneManager;
95+
std::vector<std::unique_ptr<NuklearRenderable>> mRenderables;
96+
Ogre::CommandBuffer mCommandBuffer;
97+
nk_convert_config mNuklearConfig;
98+
Ogre::VertexElement2Vec mVertexElements;
1299
};
13100
}

‎include/RegisterCompositor.h

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#pragma once
2+
3+
#include <OgreRoot.h>
4+
#include "CompositorPassNuklearProvider.h"
5+
6+
namespace NuklearOgre
7+
{
8+
class NuklearRenderer;
9+
10+
void RegisterCompositor(Ogre::Root *root, NuklearRenderer *renderer)
11+
{
12+
CompositorPassNuklearProvider *compoProvider = OGRE_NEW CompositorPassNuklearProvider(renderer);
13+
Ogre::CompositorManager2 *compositorManager = root->getCompositorManager2();
14+
compositorManager->setCompositorPassProvider(compoProvider);
15+
}
16+
}

0 commit comments

Comments
 (0)
Please sign in to comment.