#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; IMeshInstance *m_pMeshInstance; float m_fTime = 0; }; 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"); IFileHandle *pHandle = filesystem->Open("game/core/meshes/cube.fmesh_c", FILEMODE_READ); float *pData = (float*)V_malloc(filesystem->Size(pHandle)); filesystem->Read(pHandle, pData, filesystem->Size(pHandle)); pBuffer = g_pRenderContext->CreateVertexBuffer(filesystem->Size(pHandle)); pBuffer->Lock(); void *pMapped = pBuffer->Map(); V_memcpy(pMapped, pData, filesystem->Size(pHandle)); pBuffer->Unmap(); pBuffer->Unlock(); V_free(pData); filesystem->Close(pHandle); 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); m_pMeshInstance = g_pWorldRenderer->CreateInstance(pMesh); m_pMeshInstance->SetScale({5, 5, 5}); } void CFunnyGameBridge::Tick( float fDelta ) { } void CFunnyGameBridge::Frame( float fDelta ) { versor q; m_fTime += fDelta; glm_euler_zyx_quat((vec3){0,m_fTime, 0}, q); m_pMeshInstance->SetPosition({sin(m_fTime/3)*10,0,0}); m_pMeshInstance->SetRotation({q[0], q[1], q[2], q[3]}); 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(FILESYSTEM_INTERFACE_VERSION, filesystem); CONNECT_INTERFACE("MainWindow", g_pMainWindow); }