170 lines
6.3 KiB
C#
170 lines
6.3 KiB
C#
using DoomDeathmatch.Component.UI;
|
|
using Engine.Asset.Font;
|
|
using Engine.Graphics.Pipeline;
|
|
using Engine.Graphics.Texture;
|
|
using Engine.Input;
|
|
using Engine.Scene;
|
|
using Engine.Scene.Component.BuiltIn;
|
|
using Engine.Scene.Component.BuiltIn.Renderer;
|
|
using OpenTK.Mathematics;
|
|
|
|
namespace DoomDeathmatch;
|
|
|
|
public static class UiUtil
|
|
{
|
|
public static Font GetDoomFont(Engine.Engine parEngine)
|
|
{
|
|
return parEngine.AssetResourceManager.Load<Font>("font/doom");
|
|
}
|
|
|
|
public static (GameObject, OrthographicCamera) CreateOrthographicCamera(Engine.Scene.Scene parScene,
|
|
RenderLayer? parRenderLayer = null)
|
|
{
|
|
OrthographicCamera camera;
|
|
var cameraObject = GameObjectUtil.CreateGameObject(parScene, [
|
|
camera = new OrthographicCamera { RenderLayer = parRenderLayer ?? RenderLayer.DEFAULT }
|
|
]);
|
|
|
|
return (cameraObject, camera);
|
|
}
|
|
|
|
public static (GameObject, PerspectiveCamera) CreatePerspectiveCamera(Engine.Scene.Scene parScene,
|
|
RenderLayer? parRenderLayer = null)
|
|
{
|
|
PerspectiveCamera camera;
|
|
var cameraObject = GameObjectUtil.CreateGameObject(parScene, [
|
|
camera = new PerspectiveCamera { RenderLayer = parRenderLayer ?? RenderLayer.DEFAULT }
|
|
]);
|
|
|
|
return (cameraObject, camera);
|
|
}
|
|
|
|
public static (GameObject, UiContainerComponent, (GameObject, TextRenderer)) CreateTextUi(Engine.Scene.Scene parScene,
|
|
UiContainerComponent parContainer,
|
|
Font parFont, string parText, TextAlignComponent.Align parAlign = TextAlignComponent.Align.Center,
|
|
RenderLayer? parRenderLayer = null)
|
|
{
|
|
var size = parFont.Measure(parText);
|
|
var outerObject = new GameObject
|
|
{
|
|
Transform = { Size = new Vector3(size.X, size.Y, 1f), Translation = new Vector3(0, 0, -1) }
|
|
};
|
|
var uiComponent = new UiContainerComponent { Container = parContainer };
|
|
outerObject.AddComponent(uiComponent);
|
|
outerObject.AddComponent(new Box2DRenderer
|
|
{
|
|
Color = new Vector4(0, 0, 1, 1), RenderLayer = parRenderLayer ?? RenderLayer.DEFAULT
|
|
});
|
|
|
|
var innerObject = new GameObject { Transform = { Translation = new Vector3(0, 0, -1) } };
|
|
// var innerUiComponent = new UiComponent { Container = uiComponent };
|
|
// innerObject.AddComponent(innerUiComponent);
|
|
var innerTextRenderer = new TextRenderer
|
|
{
|
|
Font = parFont, Text = parText, RenderLayer = parRenderLayer ?? RenderLayer.DEFAULT
|
|
};
|
|
innerObject.AddComponent(innerTextRenderer);
|
|
innerObject.AddComponent(new TextAlignComponent { Alignment = parAlign });
|
|
|
|
parScene.Add(outerObject);
|
|
parScene.AddChild(outerObject, innerObject);
|
|
|
|
return (outerObject, uiComponent, (innerObject, innerTextRenderer));
|
|
}
|
|
|
|
public static (GameObject, UiContainerComponent) CreateContainerUi(Engine.Scene.Scene parScene,
|
|
UiContainerComponent parUiContainerComponent)
|
|
{
|
|
var uiContainerObject = new GameObject();
|
|
uiContainerObject.AddComponent(parUiContainerComponent);
|
|
|
|
parScene.Add(uiContainerObject);
|
|
|
|
return (uiContainerObject, parUiContainerComponent);
|
|
}
|
|
|
|
public static (GameObject, UiContainerComponent) CreateBackgroundUi(Engine.Scene.Scene parScene,
|
|
UiContainerComponent parUiContainerComponent, Vector4? parColor = null,
|
|
RenderLayer? parRenderLayer = null)
|
|
{
|
|
var (uiContainerObject, uiContainer) = CreateContainerUi(parScene, parUiContainerComponent);
|
|
uiContainerObject.AddComponent(new Box2DRenderer
|
|
{
|
|
Color = parColor ?? new Vector4(0.1f, 0.1f, 0.1f, 1), RenderLayer = parRenderLayer ?? RenderLayer.DEFAULT
|
|
});
|
|
|
|
return (uiContainerObject, uiContainer);
|
|
}
|
|
|
|
public static (GameObject, UiComponent) CreateLogoUi(Engine.Engine parEngine, Engine.Scene.Scene parScene,
|
|
UiContainerComponent parContainer, RenderLayer? parRenderLayer = null)
|
|
{
|
|
UiComponent uiComponent;
|
|
var logoObject = GameObjectUtil.CreateGameObject(parScene,
|
|
new Transform
|
|
{
|
|
Translation = new Vector3(0, 0, -10), Scale = new Vector3(3), Size = new Vector3(1.6385869565f, 1f, 1f)
|
|
}, [
|
|
new Box2DRenderer
|
|
{
|
|
Texture = parEngine.AssetResourceManager.Load<Texture>("texture/doom_logo.png"),
|
|
RenderLayer = parRenderLayer ?? RenderLayer.DEFAULT
|
|
},
|
|
uiComponent = new UiComponent { Container = parContainer, Anchor = Anchor.Center }
|
|
]
|
|
);
|
|
|
|
return (logoObject, uiComponent);
|
|
}
|
|
|
|
public static (GameObject, (UiComponent, Box2DRenderer)) CreateSpriteUi(Engine.Scene.Scene parScene,
|
|
UiContainerComponent parContainer,
|
|
Texture? parTexture, RenderLayer? parRenderLayer = null)
|
|
{
|
|
var spriteObject = new GameObject();
|
|
var spriteComponent = new Box2DRenderer
|
|
{
|
|
Texture = parTexture, RenderLayer = parRenderLayer ?? RenderLayer.DEFAULT
|
|
};
|
|
spriteObject.AddComponent(spriteComponent);
|
|
var uiComponent = new UiContainerComponent { Container = parContainer };
|
|
spriteObject.AddComponent(uiComponent);
|
|
|
|
return (spriteObject, (uiComponent, spriteComponent));
|
|
}
|
|
|
|
public static (GameObject, StackComponent) CreateStackUi(Engine.Scene.Scene parScene,
|
|
StackComponent parStackComponent, RenderLayer? parRenderLayer = null)
|
|
{
|
|
foreach (var child in parStackComponent.Children)
|
|
child.Container = parStackComponent;
|
|
|
|
var stackObject = new GameObject { Transform = { Translation = new Vector3(0, 0, -1) } };
|
|
stackObject.AddComponent(parStackComponent);
|
|
// stackObject.AddComponent(new Box2DRenderer { Color = new Vector4(1, 0, 0, 1), RenderLayer = parRenderLayer ?? RenderLayer.DEFAULT });
|
|
|
|
parScene.Add(stackObject);
|
|
|
|
return (stackObject, parStackComponent);
|
|
}
|
|
|
|
public static (GameObject, SelectorComponent) CreateSelectorUi(Engine.Scene.Scene parScene,
|
|
SelectorComponent parSelectorComponent, RenderLayer? parRenderLayer = null)
|
|
{
|
|
var selectorObject = new GameObject { Transform = { Translation = new Vector3(0, 0, -1) } };
|
|
selectorObject.AddComponent(parSelectorComponent);
|
|
var innerSelectorObject = new GameObject
|
|
{
|
|
Transform = { Translation = new Vector3(-0.5f, 0, 0), Size = new Vector3(0.25f, 0.5f, 1f) }
|
|
};
|
|
innerSelectorObject.AddComponent(new Box2DRenderer
|
|
{
|
|
Color = new Vector4(1, 1, 1, 1), RenderLayer = parRenderLayer ?? RenderLayer.DEFAULT
|
|
});
|
|
|
|
parScene.Add(selectorObject);
|
|
parScene.AddChild(selectorObject, innerSelectorObject);
|
|
|
|
return (selectorObject, parSelectorComponent);
|
|
}
|
|
} |