as I wrote in my first thread, registering custom overlay element factories is now possible. Because of org.ogre.OverlayElementFactory is not abstract and does not contain a constructor, it results in compiler error https://docs.microsoft.com/en-us/dotnet ... Dk(CS1729) when I try to extend a CustomOverlayElementFactory from it. So I implemented my factory by extending org.ogre.PanelOverlayElementFactory. But this does not work either, because the getTypeName() method is not overridden and log shows multiple registrations of "Panel" as type name:
Code: Select all
....
03:14:54: *-*-* Version 1.12.12 (Rhagorthua)
03:14:54: OverlayElementFactory for type Panel registered.
03:14:54: OverlayElementFactory for type BorderPanel registered.
03:14:54: OverlayElementFactory for type TextArea registered.
03:14:54: Registering ResourceManager for type Font
....
03:14:54: Creating resources for group OgreInternal
03:14:54: All done
03:14:54: D3D9 : RenderSystem Option: FSAA = 0
03:14:54: D3D9 : RenderSystem Option: Full Screen = No
03:14:54: D3D9 : RenderSystem Option: Video Mode = 1024 x 768 @ 32-bit colour
03:14:54: OverlayElementFactory for type Panel registered.
03:14:54: OverlayElementFactory for type Panel registered.
03:14:54: OverlayElementFactory for type Panel registered.
....
Code: Select all
using System;
using org.ogre;
namespace OgreTest
{
public class KeyListener : InputListener
{
ApplicationContext ctx;
public KeyListener(ApplicationContext ctx)
{
this.ctx = ctx;
}
public override bool keyPressed(KeyboardEvent evt)
{
if (evt.keysym.sym == 27)
ctx.getRoot().queueEndRendering();
return true;
}
}
public class CustomOverlayElement : PanelOverlayElement
{
public CustomOverlayElement(string instanceName) : base(instanceName)
{
}
}
public class CustomOverlayFactory : PanelOverlayElementFactory
{
public override OverlayElement createOverlayElement(string instanceName)
{
return new CustomOverlayElement(instanceName);
}
public override string getTypeName()
{
return "Custom";
}
}
public class OverlayFactoriesExample : ApplicationContext
{
InputListener listener;
public OverlayFactoriesExample()
{
listener = new KeyListener(this);
}
public override void setup()
{
base.setup();
addInputListener(listener);
var root = getRoot();
var scnMgr = root.createSceneManager();
var shadergen = ShaderGenerator.getSingleton();
shadergen.addSceneManager(scnMgr); // must be done before we do anything with the scene
scnMgr.setAmbientLight(new ColourValue(.1f, .1f, .1f));
var light = scnMgr.createLight("MainLight");
var lightnode = scnMgr.getRootSceneNode().createChildSceneNode();
lightnode.setPosition(0f, 10f, 15f);
lightnode.attachObject(light);
var cam = scnMgr.createCamera("myCam");
cam.setAutoAspectRatio(true);
cam.setNearClipDistance(5);
var camnode = scnMgr.getRootSceneNode().createChildSceneNode();
camnode.attachObject(cam);
var camman = new CameraMan(camnode);
camman.setStyle(CameraStyle.CS_ORBIT);
camman.setYawPitchDist(new Radian(0), new Radian(0.3f), 15f);
addInputListener(camman);
var vp = getRenderWindow().addViewport(cam);
vp.setBackgroundColour(new ColourValue(.3f, .3f, .3f));
var fac = new CustomOverlayFactory();
GC.SuppressFinalize(fac);
OverlayManager.getSingleton().addOverlayElementFactory(fac);
scnMgr.addRenderQueueListener(OverlaySystem.getSingleton());
}
public static void Start()
{
var app = new OverlayFactoriesExample();
app.initApp();
app.getRoot().startRendering();
app.closeApp();
}
}
}
Best regards