work on android port
This commit is contained in:
@@ -6,6 +6,108 @@
|
||||
#include "cglm/mat4.h"
|
||||
#include "game.h"
|
||||
|
||||
class CFunnyViewport: public IViewport
|
||||
{
|
||||
public:
|
||||
virtual void UpdateResolution( uint32_t uX, uint32_t uY ) override;
|
||||
|
||||
virtual IImage *GetRenderImage() override;
|
||||
virtual IImage *GetDepthImage() override;
|
||||
virtual IImage *GetNormalImage() override;
|
||||
|
||||
virtual void SetFOV( float f ) override;
|
||||
virtual void SetPosition( Vector v ) override;
|
||||
virtual void SetRotation( Quat q ) override;
|
||||
|
||||
virtual uint32_t GetWidth() override;
|
||||
virtual uint32_t GetHeight() override;
|
||||
|
||||
|
||||
IImage *m_pColor = 0;
|
||||
IImage *m_pNormal = 0;
|
||||
IImage *m_pWorldCoords = 0;
|
||||
IImage *m_pDepth = 0;
|
||||
IImage *m_pColorResolved = 0;
|
||||
IImage *m_pRenderImage = 0;
|
||||
|
||||
uint32_t m_uX;
|
||||
uint32_t m_uY;
|
||||
float m_fFov;
|
||||
vec3 m_vPos;
|
||||
versor m_qRot;
|
||||
};
|
||||
|
||||
void CFunnyViewport::UpdateResolution( uint32_t uX, uint32_t uY )
|
||||
{
|
||||
if (m_pColor)
|
||||
{
|
||||
g_pRenderContext->DestroyImage(m_pColor);
|
||||
g_pRenderContext->DestroyImage(m_pNormal);
|
||||
g_pRenderContext->DestroyImage(m_pWorldCoords);
|
||||
g_pRenderContext->DestroyImage(m_pDepth);
|
||||
g_pRenderContext->DestroyImage(m_pColorResolved);
|
||||
g_pRenderContext->DestroyImage(m_pRenderImage);
|
||||
}
|
||||
m_pColor = g_pRenderContext->CreateRenderTarget(uX, uY, IMAGE_FORMAT_RGBA8_UNORM, MULTISAMPLE_TYPE_4_SAMPLES);
|
||||
m_pNormal = g_pRenderContext->CreateRenderTarget(uX, uY, IMAGE_FORMAT_RGBA16_SNORM, MULTISAMPLE_TYPE_4_SAMPLES);
|
||||
m_pWorldCoords = g_pRenderContext->CreateRenderTarget(uX, uY, IMAGE_FORMAT_RGBA32_SFLOAT, MULTISAMPLE_TYPE_4_SAMPLES);
|
||||
m_pDepth = g_pRenderContext->CreateRenderTarget(uX, uY, IMAGE_FORMAT_D32_SFLOAT, MULTISAMPLE_TYPE_4_SAMPLES);
|
||||
m_pColorResolved = g_pRenderContext->CreateRenderTarget(uX, uY, IMAGE_FORMAT_RGBA8_UNORM, MULTISAMPLE_TYPE_1_SAMPLES);
|
||||
m_pRenderImage = g_pRenderContext->CreateStorageImage(uX, uY, IMAGE_FORMAT_RGBA16_SFLOAT, MULTISAMPLE_TYPE_1_SAMPLES);
|
||||
m_uX = uX;
|
||||
m_uY = uY;
|
||||
}
|
||||
|
||||
IImage *CFunnyViewport::GetRenderImage()
|
||||
{
|
||||
return m_pRenderImage;
|
||||
}
|
||||
|
||||
IImage *CFunnyViewport::GetDepthImage()
|
||||
{
|
||||
return m_pDepth;
|
||||
}
|
||||
|
||||
IImage *CFunnyViewport::GetNormalImage()
|
||||
{
|
||||
return m_pNormal;
|
||||
}
|
||||
|
||||
void CFunnyViewport::SetFOV( float f )
|
||||
{
|
||||
m_fFov = f;
|
||||
|
||||
}
|
||||
|
||||
void CFunnyViewport::SetPosition( Vector v )
|
||||
{
|
||||
m_vPos[0] = v.x;
|
||||
m_vPos[1] = v.y;
|
||||
m_vPos[2] = v.z;
|
||||
|
||||
}
|
||||
|
||||
void CFunnyViewport::SetRotation( Quat q )
|
||||
{
|
||||
m_qRot[0] = q.x;
|
||||
m_qRot[1] = q.y;
|
||||
m_qRot[2] = q.z;
|
||||
m_qRot[3] = q.w;
|
||||
|
||||
}
|
||||
|
||||
uint32_t CFunnyViewport::GetWidth()
|
||||
{
|
||||
return m_uX;
|
||||
}
|
||||
|
||||
uint32_t CFunnyViewport::GetHeight()
|
||||
{
|
||||
return m_uY;
|
||||
}
|
||||
|
||||
|
||||
|
||||
struct ViewBuffer_t
|
||||
{
|
||||
mat4 m_matCameraProjection;
|
||||
@@ -122,9 +224,6 @@ public:
|
||||
virtual void Frame( float fDelta ) override;
|
||||
virtual void Shutdown() override;
|
||||
|
||||
virtual void SetCameraRotation( Quat vRotation ) override;
|
||||
virtual void SetCameraPosition( Vector vPosition ) override;
|
||||
|
||||
virtual IMesh *CreateMesh( const char *szName ) override;
|
||||
virtual IMeshInstance *CreateInstance( IMesh *pMesh ) override;
|
||||
virtual void DestroyMeshInstance( IMesh *pMesh, IMeshInstance *pInstance ) override;
|
||||
@@ -132,15 +231,12 @@ public:
|
||||
|
||||
virtual void ConfigureShader( IShader *pShader ) override;
|
||||
|
||||
virtual IViewport *CreateViewport( uint32_t uX, uint32_t uY ) override;
|
||||
virtual void DestroyViewport( IViewport *pViewport ) override;
|
||||
|
||||
virtual ITextureArray *GetTextures() override;
|
||||
private:
|
||||
CUtlVector<CFunnyMesh*> m_pMeshes;
|
||||
IImage *m_pOutputImage = NULL;
|
||||
IImage *m_pResolvedOutputImage = NULL;
|
||||
IImage *m_pDepthImage = NULL;
|
||||
IImage *m_pNormalImage = NULL;
|
||||
IImage *m_pWorldSpaceImage = NULL;
|
||||
IImage *m_pStorageOutputImage = NULL;
|
||||
IRenderCommandList *m_pRasterCommandList = NULL;
|
||||
IBuffer *m_pViewBuffer;
|
||||
ViewBuffer_t *m_pViewBufferData;
|
||||
@@ -152,8 +248,7 @@ private:
|
||||
IComputeShader *m_pPostProcessing;
|
||||
IMaterial *m_pPostProcessingMaterial;
|
||||
|
||||
vec3 m_vPos;
|
||||
versor m_vRot;
|
||||
CUtlVector<CFunnyViewport*> m_viewports;
|
||||
};
|
||||
|
||||
void CFunnyWorldRenderer::ConfigureShader( IShader *pShader )
|
||||
@@ -164,7 +259,7 @@ void CFunnyWorldRenderer::ConfigureShader( IShader *pShader )
|
||||
pShader->AddAttribute(0, 2, VERTEX_FORMAT_XYZ32_SFLOAT, 20);
|
||||
// albedo
|
||||
pShader->AddOutputImage(0, IMAGE_FORMAT_RGBA8_UNORM);
|
||||
pShader->AddOutputImage(1, IMAGE_FORMAT_RGBA16_SFLOAT);
|
||||
pShader->AddOutputImage(1, IMAGE_FORMAT_RGBA16_SNORM);
|
||||
pShader->AddOutputImage(2, IMAGE_FORMAT_RGBA32_SFLOAT);
|
||||
|
||||
pShader->SetMultisampling(MULTISAMPLE_TYPE_4_SAMPLES);
|
||||
@@ -178,43 +273,6 @@ IWorldRenderer *g_pWorldRenderer = &s_renderer;
|
||||
|
||||
void CFunnyWorldRenderer::Init()
|
||||
{
|
||||
m_pOutputImage = g_pRenderContext->CreateRenderTarget(
|
||||
100,
|
||||
100,
|
||||
IMAGE_FORMAT_RGBA8_UNORM,
|
||||
MULTISAMPLE_TYPE_4_SAMPLES
|
||||
);
|
||||
m_pResolvedOutputImage = g_pRenderContext->CreateRenderTarget(
|
||||
100,
|
||||
100,
|
||||
IMAGE_FORMAT_RGBA8_UNORM,
|
||||
MULTISAMPLE_TYPE_1_SAMPLES
|
||||
);
|
||||
m_pNormalImage = g_pRenderContext->CreateRenderTarget(
|
||||
100,
|
||||
100,
|
||||
IMAGE_FORMAT_RGBA16_SFLOAT,
|
||||
MULTISAMPLE_TYPE_4_SAMPLES
|
||||
);
|
||||
m_pWorldSpaceImage = g_pRenderContext->CreateRenderTarget(
|
||||
100,
|
||||
100,
|
||||
IMAGE_FORMAT_RGBA32_SFLOAT,
|
||||
MULTISAMPLE_TYPE_4_SAMPLES
|
||||
);
|
||||
|
||||
m_pDepthImage = g_pRenderContext->CreateRenderTarget(
|
||||
100,
|
||||
100,
|
||||
IMAGE_FORMAT_D32_SFLOAT,
|
||||
MULTISAMPLE_TYPE_4_SAMPLES
|
||||
);
|
||||
m_pStorageOutputImage = g_pRenderContext->CreateStorageImage(
|
||||
100,
|
||||
100,
|
||||
IMAGE_FORMAT_RGBA16_SFLOAT,
|
||||
MULTISAMPLE_TYPE_1_SAMPLES
|
||||
);
|
||||
m_pRasterShader = g_pRenderContext->CreateShader("game/core/shaders/mesh_raster.shader_c");
|
||||
ConfigureShader(m_pRasterShader);
|
||||
m_pRasterShader->Build();
|
||||
@@ -232,8 +290,6 @@ void CFunnyWorldRenderer::Init()
|
||||
m_pPostProcessing->Build();
|
||||
|
||||
m_pPostProcessingMaterial = g_pRenderContext->CreateMaterial(m_pPostProcessing);
|
||||
|
||||
g_pMainWindow->SetOutputImage(m_pResolvedOutputImage);
|
||||
}
|
||||
|
||||
void CFunnyWorldRenderer::Tick( float fDelta )
|
||||
@@ -242,136 +298,94 @@ void CFunnyWorldRenderer::Tick( float fDelta )
|
||||
|
||||
void CFunnyWorldRenderer::Frame( float fDelta )
|
||||
{
|
||||
uint32_t uWidth = g_pMainWindow->GetRenderWidth();
|
||||
uint32_t uHeight = g_pMainWindow->GetRenderHeight();
|
||||
mat4 matCamera;
|
||||
mat4 matCamera2;
|
||||
glm_mat4_identity(matCamera);
|
||||
glm_mat4_identity(matCamera2);
|
||||
glm_translate(matCamera2, m_vPos);
|
||||
glm_quat_rotate(matCamera2, m_vRot, matCamera2);
|
||||
glm_mat4_inv(matCamera2, matCamera2);
|
||||
glm_perspective(glm_rad(75), uWidth/(float)uHeight, 0.01, 10000, matCamera);
|
||||
glm_mul(matCamera, matCamera2, matCamera);
|
||||
m_pViewBufferData = (ViewBuffer_t*)m_pViewBuffer->Map();
|
||||
m_pViewBuffer->Lock();
|
||||
V_memcpy(&m_pViewBufferData->m_matCameraProjection, matCamera, sizeof(matCamera));
|
||||
V_memcpy(&m_pViewBufferData->m_vCameraPosition, m_vPos, sizeof(vec3));
|
||||
m_pViewBuffer->Unlock();
|
||||
m_pViewBuffer->Unmap();
|
||||
|
||||
if (g_pMainWindow->BRenderSizeUpdated())
|
||||
for (auto &v: m_viewports)
|
||||
{
|
||||
g_pRenderContext->DestroyImage(m_pOutputImage);
|
||||
g_pRenderContext->DestroyImage(m_pResolvedOutputImage);
|
||||
g_pRenderContext->DestroyImage(m_pNormalImage);
|
||||
g_pRenderContext->DestroyImage(m_pWorldSpaceImage);
|
||||
g_pRenderContext->DestroyImage(m_pDepthImage);
|
||||
g_pRenderContext->DestroyImage(m_pStorageOutputImage);
|
||||
uint32_t uWidth = v->m_uX;
|
||||
uint32_t uHeight = v->m_uY;
|
||||
mat4 matCamera;
|
||||
mat4 matCamera2;
|
||||
glm_mat4_identity(matCamera);
|
||||
glm_mat4_identity(matCamera2);
|
||||
glm_translate(matCamera2, v->m_vPos);
|
||||
glm_quat_rotate(matCamera2, v->m_qRot, matCamera2);
|
||||
glm_mat4_inv(matCamera2, matCamera2);
|
||||
glm_perspective(glm_rad(v->m_fFov), uWidth/(float)uHeight, 0.01, 10000, matCamera);
|
||||
glm_mul(matCamera, matCamera2, matCamera);
|
||||
m_pViewBufferData = (ViewBuffer_t*)m_pViewBuffer->Map();
|
||||
m_pViewBuffer->Lock();
|
||||
V_memcpy(&m_pViewBufferData->m_matCameraProjection, matCamera, sizeof(matCamera));
|
||||
V_memcpy(&m_pViewBufferData->m_vCameraPosition, v->m_vPos, sizeof(vec3));
|
||||
m_pViewBuffer->Unlock();
|
||||
m_pViewBuffer->Unmap();
|
||||
|
||||
m_pOutputImage = g_pRenderContext->CreateRenderTarget(
|
||||
g_pMainWindow->GetRenderWidth(),
|
||||
g_pMainWindow->GetRenderHeight(),
|
||||
IMAGE_FORMAT_RGBA8_UNORM,
|
||||
MULTISAMPLE_TYPE_4_SAMPLES);
|
||||
m_pResolvedOutputImage = g_pRenderContext->CreateRenderTarget(
|
||||
g_pMainWindow->GetRenderWidth(),
|
||||
g_pMainWindow->GetRenderHeight(),
|
||||
IMAGE_FORMAT_RGBA8_UNORM,
|
||||
MULTISAMPLE_TYPE_1_SAMPLES);
|
||||
|
||||
m_pNormalImage = g_pRenderContext->CreateRenderTarget(
|
||||
g_pMainWindow->GetRenderWidth(),
|
||||
g_pMainWindow->GetRenderHeight(),
|
||||
IMAGE_FORMAT_RGBA16_SFLOAT,
|
||||
MULTISAMPLE_TYPE_4_SAMPLES
|
||||
);
|
||||
m_pWorldSpaceImage = g_pRenderContext->CreateRenderTarget(
|
||||
g_pMainWindow->GetRenderWidth(),
|
||||
g_pMainWindow->GetRenderHeight(),
|
||||
IMAGE_FORMAT_RGBA32_SFLOAT,
|
||||
MULTISAMPLE_TYPE_4_SAMPLES
|
||||
);
|
||||
m_pDepthImage = g_pRenderContext->CreateRenderTarget(
|
||||
g_pMainWindow->GetRenderWidth(),
|
||||
g_pMainWindow->GetRenderHeight(),
|
||||
IMAGE_FORMAT_D32_SFLOAT,
|
||||
MULTISAMPLE_TYPE_4_SAMPLES);
|
||||
m_pStorageOutputImage = g_pRenderContext->CreateStorageImage(
|
||||
g_pMainWindow->GetRenderWidth(),
|
||||
g_pMainWindow->GetRenderHeight(),
|
||||
IMAGE_FORMAT_RGBA16_SFLOAT,
|
||||
MULTISAMPLE_TYPE_1_SAMPLES
|
||||
);
|
||||
g_pMainWindow->SetOutputImage(m_pStorageOutputImage);
|
||||
}
|
||||
m_pRasterCommandList->StartRecording();
|
||||
m_pRasterCommandList->SetRenderResolution(uWidth, uHeight);
|
||||
m_pRasterCommandList->SetRenderTarget(0, m_pOutputImage);
|
||||
m_pRasterCommandList->SetRenderTarget(1, m_pNormalImage);
|
||||
m_pRasterCommandList->SetRenderTarget(2, m_pWorldSpaceImage);
|
||||
m_pRasterCommandList->SetDepthTarget(m_pDepthImage);
|
||||
m_pRasterCommandList->SetViewport(0, 0, uWidth, uHeight, 0, 1);
|
||||
m_pRasterCommandList->SetScissors(0, 0, uWidth, uHeight);
|
||||
m_pRasterCommandList->SetClearColor(0, 0, 0, 0, 0);
|
||||
m_pRasterCommandList->SetClearColor(1, 0, 0, 0, 0);
|
||||
m_pRasterCommandList->SetClearColor(2, 0, 0, 0, 0);
|
||||
m_pRasterCommandList->SetClearDepth(1);
|
||||
m_pRasterCommandList->SetLoadStoreModes(0, LOAD_MODE_CLEAR, STORE_MODE_STORE);
|
||||
m_pRasterCommandList->SetLoadStoreModes(1, LOAD_MODE_CLEAR, STORE_MODE_STORE);
|
||||
m_pRasterCommandList->SetLoadStoreModes(2, LOAD_MODE_CLEAR, STORE_MODE_STORE);
|
||||
uint32_t uTotalMeshes = 0;
|
||||
uint32_t u = 0;
|
||||
for ( auto mesh: m_pMeshes)
|
||||
{
|
||||
uTotalMeshes+=mesh->m_instances.GetSize();
|
||||
}
|
||||
if (!uTotalMeshes)
|
||||
return;
|
||||
IBuffer *pDataBuffer = g_pRenderContext->CreateStorageBuffer(uTotalMeshes*sizeof(PerMeshData_t));
|
||||
pDataBuffer->Lock();
|
||||
void *pData = pDataBuffer->Map();
|
||||
for ( auto mesh: m_pMeshes)
|
||||
{
|
||||
if (mesh->m_instances.GetSize()==0)
|
||||
continue;
|
||||
for ( uint32_t i = 0; i < mesh->m_instances.GetSize(); i++ )
|
||||
m_pRasterCommandList->StartRecording();
|
||||
m_pRasterCommandList->SetRenderResolution(uWidth, uHeight);
|
||||
m_pRasterCommandList->SetRenderTarget(0, v->m_pColor);
|
||||
m_pRasterCommandList->SetRenderTarget(1, v->m_pNormal);
|
||||
m_pRasterCommandList->SetRenderTarget(2, v->m_pWorldCoords);
|
||||
m_pRasterCommandList->SetDepthTarget(v->m_pDepth);
|
||||
m_pRasterCommandList->SetViewport(0, 0, uWidth, uHeight, 0, 1);
|
||||
m_pRasterCommandList->SetScissors(0, 0, uWidth, uHeight);
|
||||
m_pRasterCommandList->SetClearColor(0, 0, 0, 0, 0);
|
||||
m_pRasterCommandList->SetClearColor(1, 0, 0, 0, 0);
|
||||
m_pRasterCommandList->SetClearColor(2, 0, 0, 0, 0);
|
||||
m_pRasterCommandList->SetClearDepth(1);
|
||||
m_pRasterCommandList->SetLoadStoreModes(0, LOAD_MODE_CLEAR, STORE_MODE_STORE);
|
||||
m_pRasterCommandList->SetLoadStoreModes(1, LOAD_MODE_CLEAR, STORE_MODE_STORE);
|
||||
m_pRasterCommandList->SetLoadStoreModes(2, LOAD_MODE_CLEAR, STORE_MODE_STORE);
|
||||
uint32_t uTotalMeshes = 0;
|
||||
uint32_t u = 0;
|
||||
for ( auto mesh: m_pMeshes)
|
||||
{
|
||||
mesh->m_instances[i]->Frame();
|
||||
V_memcpy(&((PerMeshData_t*)pData)[i+u], &mesh->m_instances[i]->m_data, sizeof(PerMeshData_t));
|
||||
uTotalMeshes+=mesh->m_instances.GetSize();
|
||||
}
|
||||
u+=mesh->m_instances.GetSize();
|
||||
if (!uTotalMeshes)
|
||||
return;
|
||||
IBuffer *pDataBuffer = g_pRenderContext->CreateStorageBuffer(uTotalMeshes*sizeof(PerMeshData_t));
|
||||
pDataBuffer->Lock();
|
||||
void *pData = pDataBuffer->Map();
|
||||
for ( auto mesh: m_pMeshes)
|
||||
{
|
||||
if (mesh->m_instances.GetSize()==0)
|
||||
continue;
|
||||
for ( uint32_t i = 0; i < mesh->m_instances.GetSize(); i++ )
|
||||
{
|
||||
mesh->m_instances[i]->Frame();
|
||||
V_memcpy(&((PerMeshData_t*)pData)[i+u], &mesh->m_instances[i]->m_data, sizeof(PerMeshData_t));
|
||||
}
|
||||
u+=mesh->m_instances.GetSize();
|
||||
}
|
||||
pDataBuffer->Unmap();
|
||||
pDataBuffer->Unlock();
|
||||
g_pRenderContext->DestroyBuffer(pDataBuffer);
|
||||
|
||||
m_pRasterMaterial->VSSetConstantsBuffer(0, m_pViewBuffer);
|
||||
m_pRasterMaterial->VSSetConstantsBuffer(1, pDataBuffer);
|
||||
m_pRasterMaterial->PSSetTextureArray(1, m_pTextures);
|
||||
|
||||
m_pRasterCommandList->SetMaterial(m_pRasterMaterial);
|
||||
u = 0;
|
||||
for ( auto mesh: m_pMeshes)
|
||||
{
|
||||
if (mesh->m_instances.GetSize()==0)
|
||||
continue;
|
||||
m_pRasterCommandList->SetVertexBuffer(0, mesh->m_pVertexBuffer);
|
||||
m_pRasterCommandList->DrawPrimitives(mesh->m_pVertexBuffer->GetSize()/32, 0, mesh->m_instances.GetSize(), u);
|
||||
u += mesh->m_instances.GetSize();
|
||||
}
|
||||
|
||||
m_pRasterCommandList->ResolveImage(v->m_pColor, v->m_pColorResolved);
|
||||
|
||||
m_pPostProcessingMaterial->CSSetTexture(0, 0, v->m_pColorResolved);
|
||||
m_pPostProcessingMaterial->CSSetTexture(1, 0, v->m_pRenderImage);
|
||||
m_pRasterCommandList->SetMaterial(m_pPostProcessingMaterial);
|
||||
m_pRasterCommandList->Barrier(v->m_pColorResolved, true, false);
|
||||
m_pRasterCommandList->Barrier(v->m_pRenderImage, false, true);
|
||||
m_pRasterCommandList->DispatchCompute(uWidth, uHeight, 1);
|
||||
m_pRasterCommandList->EndRecording();
|
||||
|
||||
g_pRenderContext->SubmitCommandList(m_pRasterCommandList);
|
||||
}
|
||||
pDataBuffer->Unmap();
|
||||
pDataBuffer->Unlock();
|
||||
g_pRenderContext->DestroyBuffer(pDataBuffer);
|
||||
|
||||
m_pRasterMaterial->VSSetConstantsBuffer(0, m_pViewBuffer);
|
||||
m_pRasterMaterial->VSSetConstantsBuffer(1, pDataBuffer);
|
||||
m_pRasterMaterial->PSSetTextureArray(1, m_pTextures);
|
||||
|
||||
m_pRasterCommandList->SetMaterial(m_pRasterMaterial);
|
||||
u = 0;
|
||||
for ( auto mesh: m_pMeshes)
|
||||
{
|
||||
if (mesh->m_instances.GetSize()==0)
|
||||
continue;
|
||||
m_pRasterCommandList->SetVertexBuffer(0, mesh->m_pVertexBuffer);
|
||||
m_pRasterCommandList->DrawPrimitives(mesh->m_pVertexBuffer->GetSize()/32, 0, mesh->m_instances.GetSize(), u);
|
||||
u += mesh->m_instances.GetSize();
|
||||
}
|
||||
|
||||
m_pRasterCommandList->ResolveImage(m_pOutputImage, m_pResolvedOutputImage);
|
||||
|
||||
m_pPostProcessingMaterial->CSSetTexture(0, 0, m_pResolvedOutputImage);
|
||||
m_pPostProcessingMaterial->CSSetTexture(1, 0, m_pStorageOutputImage);
|
||||
m_pRasterCommandList->SetMaterial(m_pPostProcessingMaterial);
|
||||
m_pRasterCommandList->Barrier(m_pResolvedOutputImage, true, false);
|
||||
m_pRasterCommandList->Barrier(m_pStorageOutputImage, false, true);
|
||||
m_pRasterCommandList->DispatchCompute(uWidth, uHeight, 1);
|
||||
m_pRasterCommandList->EndRecording();
|
||||
|
||||
g_pRenderContext->SubmitCommandList(m_pRasterCommandList);
|
||||
}
|
||||
|
||||
void CFunnyWorldRenderer::Shutdown()
|
||||
@@ -379,23 +393,6 @@ void CFunnyWorldRenderer::Shutdown()
|
||||
|
||||
}
|
||||
|
||||
|
||||
void CFunnyWorldRenderer::SetCameraRotation( Quat vRotation )
|
||||
{
|
||||
m_vRot[0] = vRotation.x;
|
||||
m_vRot[1] = vRotation.y;
|
||||
m_vRot[2] = vRotation.z;
|
||||
m_vRot[3] = vRotation.w;
|
||||
}
|
||||
|
||||
void CFunnyWorldRenderer::SetCameraPosition( Vector vPosition )
|
||||
{
|
||||
m_vPos[0] = vPosition.x;
|
||||
m_vPos[1] = vPosition.y;
|
||||
m_vPos[2] = vPosition.z;
|
||||
}
|
||||
|
||||
|
||||
IMesh *CFunnyWorldRenderer::CreateMesh( const char *szName )
|
||||
{
|
||||
CFunnyMesh *pMesh = new CFunnyMesh;
|
||||
@@ -440,3 +437,26 @@ ITextureArray *CFunnyWorldRenderer::GetTextures()
|
||||
return m_pTextures;
|
||||
|
||||
}
|
||||
|
||||
IViewport *CFunnyWorldRenderer::CreateViewport( uint32_t uX, uint32_t uY )
|
||||
{
|
||||
CFunnyViewport *pViewport = new CFunnyViewport;
|
||||
pViewport->UpdateResolution(uX, uY);
|
||||
m_viewports.AppendTail(pViewport);
|
||||
return pViewport;
|
||||
}
|
||||
|
||||
void CFunnyWorldRenderer::DestroyViewport( IViewport *pViewport )
|
||||
{
|
||||
for ( uint32_t i = 0; i < m_viewports.GetSize(); i++ )
|
||||
{
|
||||
if (m_viewports[i] == pViewport)
|
||||
{
|
||||
m_viewports.RemoveAt(i);
|
||||
delete (CFunnyViewport*)pViewport;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user