#include "brush.h" #include "baseentity.h" #include "cglm/mat4.h" #include "physics.h" #include "rendering.h" #include "tier0/platform.h" #include "tier1/utlbuffer.h" #include "tier1/utlvector.h" void CBrushEntity::Precache() { } void CBrushEntity::Spawn() { /* physics don't support unindexed meshes, so generate indicies */ CUtlBuffer indicies(m_mesh.GetSize()*3); for (uint32_t i = 0;i> triangles(m_mesh.GetSize()*3); uint32_t i = 0; for (auto tri: m_mesh) { V_memcpy(&triangles[i],tri.location,36); i+=3; } /* use them */ px_collider_params params = {}; params.friction = 0.6; m_collider = px_trimesh((Point*)triangles.GetMemory(), triangles.GetSize(), (uint32_t(*)[3])indicies.GetMemory(), indicies.GetSize()/3 ,params); px_fixedbody(px, m_collider); }; void CBrushEntity::Destroy() { } void CBrushEntity::Think( float fDelta ) { }; void CBrushEntity::ReadParameter( const char *szName, const char *szValue ) { CBaseEntity::ReadParameter(szName, szValue); }; void C_BrushEntity::Precache() { CBrushEntity* pBrushEntity = dynamic_cast(pEntity); if (!pBrushEntity) Plat_FatalErrorFunc("pEntity is not a CBrushEntity"); } void C_BrushEntity::Spawn() { struct Vertex_t { float position[3]; float uv[2]; }; pAlbedo = ITextureManager::LoadTexture("gfx/bricks.png"); CBrushEntity* pBrushEntity = (CBrushEntity*)pEntity; uint32_t numVertices = 15*pBrushEntity->m_mesh.GetSize(); vertexBuffer = IRenderer::CreateVertexBuffer(numVertices*4); Vertex_t *pTriangles = (Vertex_t*)vertexBuffer->Map(); uint32_t i = 0; for (auto &triangle: pBrushEntity->m_mesh) { pTriangles[i].position[0] = triangle.location[0]; pTriangles[i].position[1] = triangle.location[1]; pTriangles[i].position[2] = triangle.location[2]; pTriangles[i].uv[0] = triangle.uv[0]; pTriangles[i].uv[1] = triangle.uv[1]; pTriangles[i+1].position[0] = triangle.location[3]; pTriangles[i+1].position[1] = triangle.location[4]; pTriangles[i+1].position[2] = triangle.location[5]; pTriangles[i+1].uv[0] = triangle.uv[2]; pTriangles[i+1].uv[1] = triangle.uv[3]; pTriangles[i+2].position[0] = triangle.location[6]; pTriangles[i+2].position[1] = triangle.location[7]; pTriangles[i+2].position[2] = triangle.location[8]; pTriangles[i+2].uv[0] = triangle.uv[4]; pTriangles[i+2].uv[1] = triangle.uv[5]; i+=3; } vertexBuffer->Unmap(); mesh = IMeshRenderer::CreateMesh(); mesh->SetVertexBuffer(vertexBuffer); }; void C_BrushEntity::Destroy() { } void C_BrushEntity::Think( float fDelta ) { material.m.albedo = ITextureManager::GetTexture(pAlbedo); IRenderer::SetMaterial(&material); mat4 matrix; glm_mat4_zero(matrix); for (int i = 0; i < 9; i++) { matrix[i/3][i%3] = pEntity->m_matrix[i/3][i%3]; } matrix[3][3] = 1; matrix[3][0] = pEntity->m_position[0]; matrix[3][1] = pEntity->m_position[1]; matrix[3][2] = pEntity->m_position[2]; mesh->SetMatrix(matrix); mesh->Draw(); };