#include "tier2/ifilesystem.h" #include "materialsystem/imaterialsystem.h" #include "enginebridge.h" #include "worldrender.h" #include "cglm/mat4.h" #include "cglm/cglm.h" IFileSystem *filesystem; IRenderContext *g_pRenderContext; IGameWindow *g_pMainWindow; class CFunnyGameBridge: public IEngineBridge { virtual void Init() override; virtual void Tick( float fDelta ) override; virtual void Frame( float fDelta ) override; virtual void Shutdown() override; virtual void ConnectInterface( const char *psz, void *pInterface ) override; }; IEngineBridge *EngineBridge() { static CFunnyGameBridge s_bridge; return &s_bridge; } EXPOSE_INTERFACE_FN(EngineBridge, IEngineBridge, ENGINE_BRIDGE_INTERFACE_VERSION) void CFunnyGameBridge::Init() { IVertexBuffer *pBuffer; IBuffer *pDataBuffer; IShader *pShader; IMaterial *pMaterial; g_pWorldRenderer->Init(); pShader = g_pRenderContext->CreateShader("game/core/shaders/mesh_raster.shader_c"); float cubeVertices[][3] = { {-1, -1, 1}, { 1, -1, 1}, { 1, 1, 1}, {-1, -1, 1}, { 1, 1, 1}, {-1, 1, 1}, {-1, -1, -1}, {-1, 1, -1}, { 1, 1, -1}, {-1, -1, -1}, { 1, 1, -1}, { 1, -1, -1}, {-1, -1, -1}, {-1, -1, 1}, {-1, 1, 1}, {-1, -1, -1}, {-1, 1, 1}, {-1, 1, -1}, { 1, -1, -1}, { 1, 1, -1}, { 1, 1, 1}, { 1, -1, -1}, { 1, 1, 1}, { 1, -1, 1}, {-1, 1, -1}, {-1, 1, 1}, { 1, 1, 1}, {-1, 1, -1}, { 1, 1, 1}, { 1, 1, -1}, {-1, -1, -1}, { 1, -1, -1}, { 1, -1, 1}, {-1, -1, -1}, { 1, -1, 1}, {-1, -1, 1} }; pBuffer = g_pRenderContext->CreateVertexBuffer(sizeof(cubeVertices)); pBuffer->Lock(); void *pMapped = pBuffer->Map(); V_memcpy(pMapped, cubeVertices, sizeof(cubeVertices)); pBuffer->Unmap(); pBuffer->Unlock(); IMesh *pMesh = g_pWorldRenderer->CreateMesh("Triangle"); g_pWorldRenderer->SetCameraPosition((Vector){0,0,-20}); g_pWorldRenderer->SetCameraRotation((Quat){1,0,0,0}); pMesh->ConfigureShader(pShader); pShader->Build(); pMaterial = g_pRenderContext->CreateMaterial(pShader); pMesh->SetVertices(pBuffer); pMesh->SetMaterial(pMaterial); IMeshInstance *pMeshInstance = g_pWorldRenderer->CreateInstance(pMesh); pMeshInstance->SetPosition({1,1,1}); } void CFunnyGameBridge::Tick( float fDelta ) { } void CFunnyGameBridge::Frame( float fDelta ) { g_pWorldRenderer->Frame(fDelta); } void CFunnyGameBridge::Shutdown() { } #define CONNECT_INTERFACE(szName, pGlobal) if (!V_strcmp(psz, szName)) { pGlobal = (typeof(pGlobal))pInterface; return; } void CFunnyGameBridge::ConnectInterface( const char *psz, void *pInterface ) { CONNECT_INTERFACE(RENDER_CONTEXT_INTERFACE_VERSION, g_pRenderContext); CONNECT_INTERFACE("MainWindow", g_pMainWindow); }