Try finding patched IpServer.u, IpDrv.dll, renderers over this site. Or even a discussion space about those.
Secondly, XC_Engine isn't the only thing that'll need a place...
This is going to be a huge and long project taking place during the following year.
This is basically what Feralidragon gave up on, I'll be wasting time of it anyways because it's a 2016 in-development API and very few understand this, this is going to be a perfect learning experience (and curriculum expander).
Project at 1% lol, so far it only loads the API library and creates a very simple rendering pipeline.
Code: Select all
/** Low level rendering system.
Most of the CPU heavy stuff will go to the XC_RenderDevice anyways, TODO:
- Implement redirections to XC_RenderDevice
- Rewrite mesh data decompression/presentation/storage
- Move occlusion checks to XC_RenderDevice (GPU based occlusion? Vulkan can do calculations too...)
- Turn the entire BSP geometry into static meshes?
*/
class XC_RENDER_API UXC_Render : public URenderBase
{
DECLARE_CLASS(UXC_Render,URenderBase,CLASS_Transient|CLASS_Config,XC_Render)
NO_DEFAULT_CONSTRUCTOR(UXC_Render);
// Variables.
Code: Select all
// A low-level 3D rendering device.
class XC_RENDER_API UXC_RenderDevice : public URenderDevice
{
DECLARE_ABSTRACT_CLASS(UXC_RenderDevice, URenderDevice, CLASS_Config, XC_Render)
NO_DEFAULT_CONSTRUCTOR(UXC_RenderDevice);
// Constructors.
void StaticConstructor();
// UXC_RenderDevice derivations from UXC_Render
virtual void PreRender(FSceneNode* Frame) = 0;
virtual void DrawWorld(FSceneNode* Frame) = 0;
virtual void PostRender(FSceneNode* Frame) = 0;
Code: Select all
//Vulkan renderer, statically linked
// NEED SHADERS EMBEDDED INTO THE DLL!!!
class UVulkanRenderDevice : public UXC_RenderDevice
{
DECLARE_CLASS(UVulkanRenderDevice, UXC_RenderDevice, CLASS_Config, XC_Render)
NO_DEFAULT_CONSTRUCTOR(UVulkanRenderDevice)
VkDrvCpp Vulkan; //Huge structure of Vulkan Data
UBOOL CanRender;
UBOOL UseVSync;
// UXC_RenderDevice derivations from UXC_Render
virtual void PreRender(FSceneNode* Frame);
virtual void DrawWorld(FSceneNode* Frame);
virtual void PostRender(FSceneNode* Frame);
virtual UBOOL Init(UViewport* InViewport, INT NewX, INT NewY, INT NewColorBytes, UBOOL Fullscreen);
virtual UBOOL SetRes(INT NewX, INT NewY, INT NewColorBytes, UBOOL Fullscreen);
virtual void Exit();
};
Code: Select all
#define XC_VK_CHECK(n,f,e) guard(n); if ( Res=f) appErrorf(NAME_Init,TEXT(e ##": %s"), appFromAnsi(Vulkan.TranslateVkError(Res)) ); unguard;
UBOOL UVulkanRenderDevice::Init(UViewport* InViewport, INT NewX, INT NewY, INT NewColorBytes, UBOOL Fullscreen)
{
guard(UVulkanRenderDevice::Init);
debugf( NAME_Init, TEXT("[VK] Init | %ix%i@%i f=%i"), NewX, NewY, NewColorBytes, Fullscreen);
VkResult Res = VK_SUCCESS;
Viewport = InViewport;
VK_UE_Log = _VK_UE_Log;
Vulkan.LoadAPI();
XC_VK_CHECK(CreateInstance, Vulkan.CreateInstance(true),"Failed to create instance")
Vulkan.LoadInstanceLevelEntryPoints();
XC_VK_CHECK(CreateDebugCallback, Vulkan.CreateDebugCallback(dbgFunc),"Failed to create debug callback")
XC_VK_CHECK(SelectGPU, Vulkan.SelectGPU(),"Failed to select GPU")
XC_VK_CHECK(CreateDevice, Vulkan.CreateDevice(), "Failed to create logical device")
Vulkan.LoadDeviceLevelEntryPoints();
XC_VK_CHECK(CreateSurface, Vulkan.CreateSurface((HWND)InViewport->GetWindow()),"Failed to create presentation surface")
XC_VK_CHECK(CreateSwapchain, Vulkan.CreateSwapChain( (uint32_t*)&NewX, (uint32_t*)&NewY, UseVSync!=0),"Failed to create swapchain")
Vulkan.SetupDevice();
Vulkan.SetupRenderer();
Vulkan.RecordCommandBuffers();
debugf( NAME_Init, TEXT("Vulkan library succesfully loaded") );
return 1;
unguard;
}