Skip to content
Snippets Groups Projects
Commit f277a749 authored by Sreekanth Arikatla's avatar Sreekanth Arikatla
Browse files

Merge branch 'rendering_fixes' into 'master'

Rendering fixes and benchmark

See merge request iMSTK/iMSTK!261
parents 2d810a35 ce2cbf76
No related branches found
No related tags found
No related merge requests found
Showing
with 294 additions and 47 deletions
...@@ -94,9 +94,9 @@ int main() ...@@ -94,9 +94,9 @@ int main()
#ifdef iMSTK_USE_Vulkan #ifdef iMSTK_USE_Vulkan
auto viewer = std::dynamic_pointer_cast<VulkanViewer>(sdk->getViewer()); auto viewer = std::dynamic_pointer_cast<VulkanViewer>(sdk->getViewer());
viewer->setResolution(1920, 1080); viewer->setResolution(800, 600);
viewer->disableVSync(); viewer->disableVSync();
viewer->enableFullscreen(); //viewer->enableFullscreen();
#endif #endif
sdk->startSimulation(SimulationStatus::PAUSED); sdk->startSimulation(SimulationStatus::PAUSED);
......
###########################################################################
#
# Copyright (c) Kitware, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0.txt
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
###########################################################################
project(Example-RenderingBenchmark)
#-----------------------------------------------------------------------------
# Create executable
#-----------------------------------------------------------------------------
add_executable(${PROJECT_NAME} RenderingBenchmark.cpp)
#-----------------------------------------------------------------------------
# Add shaders
#-----------------------------------------------------------------------------
include(imstkCopyAndCompileShaders)
CopyAndCompileShaders()
#-----------------------------------------------------------------------------
# Link libraries to executable
#-----------------------------------------------------------------------------
target_link_libraries(${PROJECT_NAME} SimulationManager)
\ No newline at end of file
/*=========================================================================
Library: iMSTK
Copyright (c) Kitware, Inc. & Center for Modeling, Simulation,
& Imaging in Medicine, Rensselaer Polytechnic Institute.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0.txt
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
=========================================================================*/
#include "imstkSimulationManager.h"
#include "imstkMeshIO.h"
#include "imstkPbdObject.h"
#include "imstkPbdSolver.h"
#include "imstkOneToOneMap.h"
#include "imstkAPIUtilities.h"
#include "imstkLineMesh.h"
using namespace imstk;
///
/// \brief This benchmark is to test the speed of various rendering operations
///
int main()
{
// SDK and Scene
auto sdk = std::make_shared<SimulationManager>();
auto scene = sdk->createNewScene("RenderingBenchmarkTest");
auto camera = scene->getCamera();
camera->setPosition(0, 0, 1);
camera->setFocalPoint(0, 0, -1);
int numMeshes = 2000;
std::cout << "Enter number of meshes: ";
std::cin >> numMeshes;
size_t numLines = 100;
std::cout << "Enter number of triangles: ";
std::cin >> numLines;
bool dynamicMesh = true;
std::cout << "Enter dynamic mesh: ";
std::cin >> dynamicMesh;
std::vector<LineMesh::LineArray> lines;
StdVectorOfVec3d vertices;
vertices.resize(numLines * 2);
lines.resize(numLines);
for (int i = 0; i < numLines; i++)
{
vertices[i * 2] = Vec3d(0, 0, 0);
vertices[i * 2 + 1] = Vec3d(0, 0, 0.1);
lines[i][0] = i * 2;
lines[i][1] = i * 2 + 1;
}
for (int j = 0; j < numMeshes; j++)
{
// Construct surface mesh
auto mesh = std::make_shared<LineMesh>();
mesh->initialize(vertices, lines);
if (dynamicMesh)
{
auto object = std::make_shared<PbdObject>(std::string("mesh") + std::to_string(j));
object->setVisualGeometry(mesh);
auto model = std::make_shared<PbdModel>();
model->setModelGeometry(mesh);
object->setDynamicalModel(model);
scene->addSceneObject(object);
}
else
{
auto object = std::make_shared<VisualObject>(std::string("mesh") + std::to_string(j));
object->setVisualGeometry(mesh);
scene->addSceneObject(object);
}
}
int frame = 0;
auto watch = std::make_shared<StopWatch>();
auto startWatch = std::make_shared<StopWatch>();
double endTime = 0;
int startFrame = -1;
int startupFrame = -1;
sdk->getViewer()->setOnTimerFunction([&](InteractorStyle* c) -> bool
{
if (dynamicMesh)
{
for (int j = 0; j < numMeshes; j++)
{
auto object = scene->getSceneObject(std::string("mesh") + std::to_string(j));
auto mesh = std::dynamic_pointer_cast<LineMesh>(object->getVisualGeometry());
mesh->setVertexPositions(vertices);
mesh->setLinesVertices(lines);
}
}
if (scene->getSceneObject("mesh" + std::to_string(numMeshes - 1)) && startupFrame == -1)
{
startupFrame = frame;
LOG(INFO) << "Start time: " << startWatch->getTimeElapsed();
}
if (frame == startupFrame + 100)
{
startFrame = frame;
watch->start();
watch->reset();
LOG(INFO) << "Starting time";
}
else if (frame == startFrame + 100 && startFrame != -1)
{
endTime = watch->getTimeElapsed();
LOG(INFO) << "Total time: " << endTime;
LOG(INFO) << "Frame time: " << endTime / (frame - startFrame);
}
frame++;
return true;
}
);
// Start simulation
startWatch->start();
startWatch->reset();
sdk->setActiveScene(scene);
sdk->startSimulation();
}
...@@ -23,7 +23,9 @@ ...@@ -23,7 +23,9 @@
namespace imstk namespace imstk
{ {
VulkanCapsuleRenderDelegate::VulkanCapsuleRenderDelegate(std::shared_ptr<Capsule> capsule, VulkanMemoryManager& memoryManager) VulkanCapsuleRenderDelegate::VulkanCapsuleRenderDelegate(std::shared_ptr<Capsule> capsule,
SceneObject::Type type,
VulkanMemoryManager& memoryManager)
: m_geometry(capsule) : m_geometry(capsule)
{ {
auto source = vtkSmartPointer<vtkCapsuleSource>::New(); auto source = vtkSmartPointer<vtkCapsuleSource>::New();
......
...@@ -44,7 +44,9 @@ public: ...@@ -44,7 +44,9 @@ public:
/// ///
/// \brief Default constructor /// \brief Default constructor
/// ///
VulkanCapsuleRenderDelegate(std::shared_ptr<Capsule> capsule, VulkanMemoryManager& memoryManager); VulkanCapsuleRenderDelegate(std::shared_ptr<Capsule> capsule,
SceneObject::Type type,
VulkanMemoryManager& memoryManager);
/// ///
/// \brief Update render geometry /// \brief Update render geometry
......
...@@ -23,7 +23,9 @@ ...@@ -23,7 +23,9 @@
namespace imstk namespace imstk
{ {
VulkanCubeRenderDelegate::VulkanCubeRenderDelegate(std::shared_ptr<Cube> cube, VulkanMemoryManager& memoryManager) VulkanCubeRenderDelegate::VulkanCubeRenderDelegate(std::shared_ptr<Cube> cube,
SceneObject::Type type,
VulkanMemoryManager& memoryManager)
: m_geometry(cube) : m_geometry(cube)
{ {
auto width = m_geometry->getWidth(); auto width = m_geometry->getWidth();
......
...@@ -44,7 +44,9 @@ public: ...@@ -44,7 +44,9 @@ public:
/// ///
/// \brief Default constructor /// \brief Default constructor
/// ///
VulkanCubeRenderDelegate(std::shared_ptr<Cube> cube, VulkanMemoryManager& memoryManager); VulkanCubeRenderDelegate(std::shared_ptr<Cube> cube,
SceneObject::Type type,
VulkanMemoryManager& memoryManager);
/// ///
/// \brief Update render geometry /// \brief Update render geometry
......
...@@ -23,7 +23,9 @@ ...@@ -23,7 +23,9 @@
namespace imstk namespace imstk
{ {
VulkanDecalRenderDelegate::VulkanDecalRenderDelegate(std::shared_ptr<DecalPool> decalPool, VulkanMemoryManager& memoryManager) VulkanDecalRenderDelegate::VulkanDecalRenderDelegate(std::shared_ptr<DecalPool> decalPool,
SceneObject::Type type,
VulkanMemoryManager& memoryManager)
: m_geometry(decalPool) : m_geometry(decalPool)
{ {
m_numVertices = 8; m_numVertices = 8;
......
...@@ -39,7 +39,9 @@ public: ...@@ -39,7 +39,9 @@ public:
/// ///
/// \brief Default constructor /// \brief Default constructor
/// ///
VulkanDecalRenderDelegate(std::shared_ptr<DecalPool> decalPool, VulkanMemoryManager& memoryManager); VulkanDecalRenderDelegate(std::shared_ptr<DecalPool> decalPool,
SceneObject::Type type,
VulkanMemoryManager& memoryManager);
/// ///
/// \brief Update render geometry /// \brief Update render geometry
......
...@@ -23,7 +23,9 @@ ...@@ -23,7 +23,9 @@
namespace imstk namespace imstk
{ {
VulkanLineMeshRenderDelegate::VulkanLineMeshRenderDelegate(std::shared_ptr<LineMesh> lineMesh, VulkanMemoryManager& memoryManager) VulkanLineMeshRenderDelegate::VulkanLineMeshRenderDelegate(std::shared_ptr<LineMesh> lineMesh,
SceneObject::Type type,
VulkanMemoryManager& memoryManager)
: m_geometry(lineMesh) : m_geometry(lineMesh)
{ {
m_numVertices = (uint32_t)m_geometry->getNumVertices(); m_numVertices = (uint32_t)m_geometry->getNumVertices();
...@@ -38,17 +40,35 @@ VulkanLineMeshRenderDelegate::VulkanLineMeshRenderDelegate(std::shared_ptr<LineM ...@@ -38,17 +40,35 @@ VulkanLineMeshRenderDelegate::VulkanLineMeshRenderDelegate(std::shared_ptr<LineM
m_geometry->getRenderMaterial()->m_isLineMesh = true; m_geometry->getRenderMaterial()->m_isLineMesh = true;
this->initializeData(memoryManager, m_geometry->getRenderMaterial()); if (type == SceneObject::Type::FEMDeformable || type == SceneObject::Type::Pbd)
{
this->initializeData(memoryManager, m_geometry->getRenderMaterial(), VulkanVertexBufferMode::VERTEX_BUFFER_DYNAMIC);
this->updateVertexBuffer(); for (uint32_t i = 0; i < memoryManager.m_buffering; i++)
{
this->updateVertexBuffer(i);
this->update(i);
}
}
else
{
this->initializeData(memoryManager, m_geometry->getRenderMaterial(), VulkanVertexBufferMode::VERTEX_BUFFER_STATIC);
this->update(0); this->updateVertexBuffer(0);
this->update(0);
}
} }
void void
VulkanLineMeshRenderDelegate::updateVertexBuffer() VulkanLineMeshRenderDelegate::updateVertexBuffer(const uint32_t frameIndex)
{ {
auto vertices = (VulkanBasicVertex *)m_vertexBuffer->getVertexMemory(); int frame = 0;
if (m_vertexBuffer->getMode() != VERTEX_BUFFER_STATIC)
{
frame = frameIndex;
}
auto vertices = (VulkanBasicVertex *)m_vertexBuffer->getVertexMemory(frame);
auto colors = m_geometry->getVertexColors(); auto colors = m_geometry->getVertexColors();
...@@ -73,7 +93,7 @@ VulkanLineMeshRenderDelegate::updateVertexBuffer() ...@@ -73,7 +93,7 @@ VulkanLineMeshRenderDelegate::updateVertexBuffer()
} }
} }
auto lines = (std::array<uint32_t, 2> *)m_vertexBuffer->getIndexMemory(); auto lines = (std::array<uint32_t, 2> *)m_vertexBuffer->getIndexMemory(frame);
m_vertexBuffer->setNumIndices((uint32_t)m_geometry->getNumLines() * 2); m_vertexBuffer->setNumIndices((uint32_t)m_geometry->getNumLines() * 2);
...@@ -92,7 +112,7 @@ VulkanLineMeshRenderDelegate::update(const uint32_t frameIndex) ...@@ -92,7 +112,7 @@ VulkanLineMeshRenderDelegate::update(const uint32_t frameIndex)
if (m_geometry->m_dataModified) if (m_geometry->m_dataModified)
{ {
this->updateVertexBuffer(); this->updateVertexBuffer(frameIndex);
} }
} }
......
...@@ -42,7 +42,9 @@ public: ...@@ -42,7 +42,9 @@ public:
/// ///
/// \brief Default constructor /// \brief Default constructor
/// ///
VulkanLineMeshRenderDelegate(std::shared_ptr<LineMesh> LineMesh, VulkanMemoryManager& memoryManager); VulkanLineMeshRenderDelegate(std::shared_ptr<LineMesh> LineMesh,
SceneObject::Type type,
VulkanMemoryManager& memoryManager);
/// ///
/// \brief Update render geometry /// \brief Update render geometry
...@@ -58,7 +60,7 @@ public: ...@@ -58,7 +60,7 @@ public:
/// ///
/// \brief Fill vertex buffer /// \brief Fill vertex buffer
/// ///
void updateVertexBuffer(); void updateVertexBuffer(const uint32_t frameIndex);
protected: protected:
std::shared_ptr<LineMesh> m_geometry; std::shared_ptr<LineMesh> m_geometry;
......
...@@ -23,7 +23,9 @@ ...@@ -23,7 +23,9 @@
namespace imstk namespace imstk
{ {
VulkanPlaneRenderDelegate::VulkanPlaneRenderDelegate(std::shared_ptr<Plane> plane, VulkanMemoryManager& memoryManager) VulkanPlaneRenderDelegate::VulkanPlaneRenderDelegate(std::shared_ptr<Plane> plane,
SceneObject::Type type,
VulkanMemoryManager& memoryManager)
: m_geometry(plane) : m_geometry(plane)
{ {
auto width = m_geometry->getWidth(); auto width = m_geometry->getWidth();
......
...@@ -45,7 +45,9 @@ public: ...@@ -45,7 +45,9 @@ public:
/// ///
/// \brief Default constructor /// \brief Default constructor
/// ///
VulkanPlaneRenderDelegate(std::shared_ptr<Plane> plane, VulkanMemoryManager& memoryManager); VulkanPlaneRenderDelegate(std::shared_ptr<Plane> plane,
SceneObject::Type type,
VulkanMemoryManager& memoryManager);
/// ///
/// \brief Update render geometry /// \brief Update render geometry
......
...@@ -43,7 +43,9 @@ ...@@ -43,7 +43,9 @@
namespace imstk namespace imstk
{ {
std::shared_ptr<VulkanRenderDelegate> std::shared_ptr<VulkanRenderDelegate>
VulkanRenderDelegate::make_delegate(std::shared_ptr<Geometry> geom, VulkanMemoryManager& memoryManager) VulkanRenderDelegate::make_delegate(std::shared_ptr<Geometry> geom,
SceneObject::Type type,
VulkanMemoryManager& memoryManager)
{ {
geom->m_renderDelegateCreated = true; geom->m_renderDelegateCreated = true;
switch (geom->getType()) switch (geom->getType())
...@@ -51,27 +53,27 @@ VulkanRenderDelegate::make_delegate(std::shared_ptr<Geometry> geom, VulkanMemory ...@@ -51,27 +53,27 @@ VulkanRenderDelegate::make_delegate(std::shared_ptr<Geometry> geom, VulkanMemory
case Geometry::Type::Plane: case Geometry::Type::Plane:
{ {
auto plane = std::dynamic_pointer_cast<Plane>(geom); auto plane = std::dynamic_pointer_cast<Plane>(geom);
return std::make_shared<VulkanPlaneRenderDelegate>(plane, memoryManager); return std::make_shared<VulkanPlaneRenderDelegate>(plane, type, memoryManager);
} }
case Geometry::Type::Sphere: case Geometry::Type::Sphere:
{ {
auto sphere = std::dynamic_pointer_cast<Sphere>(geom); auto sphere = std::dynamic_pointer_cast<Sphere>(geom);
return std::make_shared<VulkanSphereRenderDelegate>(sphere, memoryManager); return std::make_shared<VulkanSphereRenderDelegate>(sphere, type, memoryManager);
} }
case Geometry::Type::Cube: case Geometry::Type::Cube:
{ {
auto cube = std::dynamic_pointer_cast<Cube>(geom); auto cube = std::dynamic_pointer_cast<Cube>(geom);
return std::make_shared<VulkanCubeRenderDelegate>(cube, memoryManager); return std::make_shared<VulkanCubeRenderDelegate>(cube, type, memoryManager);
} }
case Geometry::Type::Capsule: case Geometry::Type::Capsule:
{ {
auto capsule = std::dynamic_pointer_cast<Capsule>(geom); auto capsule = std::dynamic_pointer_cast<Capsule>(geom);
return std::make_shared<VulkanCapsuleRenderDelegate>(capsule, memoryManager); return std::make_shared<VulkanCapsuleRenderDelegate>(capsule, type, memoryManager);
} }
case Geometry::Type::SurfaceMesh: case Geometry::Type::SurfaceMesh:
{ {
auto surfaceMesh = std::dynamic_pointer_cast<SurfaceMesh>(geom); auto surfaceMesh = std::dynamic_pointer_cast<SurfaceMesh>(geom);
return std::make_shared<VulkanSurfaceMeshRenderDelegate>(surfaceMesh, memoryManager); return std::make_shared<VulkanSurfaceMeshRenderDelegate>(surfaceMesh, type, memoryManager);
} }
/*case Geometry::Type::TetrahedralMesh: /*case Geometry::Type::TetrahedralMesh:
{ {
...@@ -81,7 +83,7 @@ VulkanRenderDelegate::make_delegate(std::shared_ptr<Geometry> geom, VulkanMemory ...@@ -81,7 +83,7 @@ VulkanRenderDelegate::make_delegate(std::shared_ptr<Geometry> geom, VulkanMemory
case Geometry::Type::LineMesh: case Geometry::Type::LineMesh:
{ {
auto lineMesh = std::dynamic_pointer_cast<LineMesh>(geom); auto lineMesh = std::dynamic_pointer_cast<LineMesh>(geom);
return std::make_shared<VulkanLineMeshRenderDelegate>(lineMesh, memoryManager); return std::make_shared<VulkanLineMeshRenderDelegate>(lineMesh, type, memoryManager);
} }
/*case Geometry::Type::HexahedralMesh: /*case Geometry::Type::HexahedralMesh:
{ {
...@@ -91,7 +93,7 @@ VulkanRenderDelegate::make_delegate(std::shared_ptr<Geometry> geom, VulkanMemory ...@@ -91,7 +93,7 @@ VulkanRenderDelegate::make_delegate(std::shared_ptr<Geometry> geom, VulkanMemory
case Geometry::Type::DecalPool: case Geometry::Type::DecalPool:
{ {
auto decalPool = std::dynamic_pointer_cast<DecalPool>(geom); auto decalPool = std::dynamic_pointer_cast<DecalPool>(geom);
return std::make_shared<VulkanDecalRenderDelegate>(decalPool, memoryManager); return std::make_shared<VulkanDecalRenderDelegate>(decalPool, type, memoryManager);
} }
default: default:
{ {
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <array> #include <array>
#include "imstkGeometry.h" #include "imstkGeometry.h"
#include "imstkSceneObject.h"
#include "imstkVulkanVertexBuffer.h" #include "imstkVulkanVertexBuffer.h"
#include "imstkVulkanUniformBuffer.h" #include "imstkVulkanUniformBuffer.h"
#include "imstkVulkanMaterialDelegate.h" #include "imstkVulkanMaterialDelegate.h"
...@@ -52,6 +53,7 @@ public: ...@@ -52,6 +53,7 @@ public:
/// ///
static std::shared_ptr<VulkanRenderDelegate> make_delegate( static std::shared_ptr<VulkanRenderDelegate> make_delegate(
std::shared_ptr<Geometry> geom, std::shared_ptr<Geometry> geom,
SceneObject::Type type,
VulkanMemoryManager& details); VulkanMemoryManager& details);
/// ///
......
...@@ -23,7 +23,9 @@ ...@@ -23,7 +23,9 @@
namespace imstk namespace imstk
{ {
VulkanSphereRenderDelegate::VulkanSphereRenderDelegate(std::shared_ptr<Sphere> sphere, VulkanMemoryManager& memoryManager) VulkanSphereRenderDelegate::VulkanSphereRenderDelegate(std::shared_ptr<Sphere> sphere,
SceneObject::Type type,
VulkanMemoryManager& memoryManager)
: m_geometry(sphere) : m_geometry(sphere)
{ {
auto radius = m_geometry->getRadius(); auto radius = m_geometry->getRadius();
......
...@@ -44,7 +44,9 @@ public: ...@@ -44,7 +44,9 @@ public:
/// ///
/// \brief Default constructor /// \brief Default constructor
/// ///
VulkanSphereRenderDelegate(std::shared_ptr<Sphere> sphere, VulkanMemoryManager& memoryManager); VulkanSphereRenderDelegate(std::shared_ptr<Sphere> sphere,
SceneObject::Type type,
VulkanMemoryManager& memoryManager);
/// ///
/// \brief Update render geometry /// \brief Update render geometry
......
...@@ -23,7 +23,9 @@ ...@@ -23,7 +23,9 @@
namespace imstk namespace imstk
{ {
VulkanSurfaceMeshRenderDelegate::VulkanSurfaceMeshRenderDelegate(std::shared_ptr<SurfaceMesh> surfaceMesh, VulkanMemoryManager& memoryManager) VulkanSurfaceMeshRenderDelegate::VulkanSurfaceMeshRenderDelegate(std::shared_ptr<SurfaceMesh> surfaceMesh,
SceneObject::Type type,
VulkanMemoryManager& memoryManager)
: m_geometry(surfaceMesh) : m_geometry(surfaceMesh)
{ {
m_numVertices = (uint32_t)m_geometry->getNumVertices(); m_numVertices = (uint32_t)m_geometry->getNumVertices();
...@@ -37,19 +39,35 @@ VulkanSurfaceMeshRenderDelegate::VulkanSurfaceMeshRenderDelegate(std::shared_ptr ...@@ -37,19 +39,35 @@ VulkanSurfaceMeshRenderDelegate::VulkanSurfaceMeshRenderDelegate(std::shared_ptr
m_geometry->setRenderMaterial(std::make_shared<RenderMaterial>()); m_geometry->setRenderMaterial(std::make_shared<RenderMaterial>());
} }
this->initializeData(memoryManager, m_geometry->getRenderMaterial(), VulkanVertexBufferMode::VERTEX_BUFFER_DYNAMIC); if (type == SceneObject::Type::FEMDeformable || type == SceneObject::Type::Pbd)
{
this->initializeData(memoryManager, m_geometry->getRenderMaterial(), VulkanVertexBufferMode::VERTEX_BUFFER_DYNAMIC);
for (uint32_t i = 0; i < memoryManager.m_buffering; i++) for (uint32_t i = 0; i < memoryManager.m_buffering; i++)
{
this->updateVertexBuffer(i);
this->update(i);
}
}
else
{ {
this->updateVertexBuffer(i); this->initializeData(memoryManager, m_geometry->getRenderMaterial(), VulkanVertexBufferMode::VERTEX_BUFFER_STATIC);
this->update(i);
this->updateVertexBuffer(0);
this->update(0);
} }
} }
void void
VulkanSurfaceMeshRenderDelegate::updateVertexBuffer(uint32_t frameIndex) VulkanSurfaceMeshRenderDelegate::updateVertexBuffer(uint32_t frameIndex)
{ {
auto vertices = (VulkanBasicVertex *)m_vertexBuffer->getVertexMemory(frameIndex); int frame = 0;
if (m_vertexBuffer->getMode() != VERTEX_BUFFER_STATIC)
{
frame = frameIndex;
}
auto vertices = (VulkanBasicVertex *)m_vertexBuffer->getVertexMemory(frame);
auto normals = m_geometry->getVertexNormals(); auto normals = m_geometry->getVertexNormals();
auto tangents = m_geometry->getVertexTangents(); auto tangents = m_geometry->getVertexTangents();
...@@ -80,23 +98,23 @@ VulkanSurfaceMeshRenderDelegate::updateVertexBuffer(uint32_t frameIndex) ...@@ -80,23 +98,23 @@ VulkanSurfaceMeshRenderDelegate::updateVertexBuffer(uint32_t frameIndex)
normals[i][2]); normals[i][2]);
} }
if (tangents.size() == m_geometry->getNumVertices())
{
vertices[i].tangent = glm::vec3(
tangents[i][0],
tangents[i][1],
tangents[i][2]);
}
if (UVs && UVs->size() == m_geometry->getNumVertices()) if (UVs && UVs->size() == m_geometry->getNumVertices())
{ {
if (tangents.size() == m_geometry->getNumVertices())
{
vertices[i].tangent = glm::vec3(
tangents[i][0],
tangents[i][1],
tangents[i][2]);
}
vertices[i].uv = glm::vec2( vertices[i].uv = glm::vec2(
(*UVs)[i][0], (*UVs)[i][0],
(*UVs)[i][1]); (*UVs)[i][1]);
} }
} }
auto triangles = (std::array<uint32_t, 3> *)m_vertexBuffer->getIndexMemory(frameIndex); auto triangles = (std::array<uint32_t, 3> *)m_vertexBuffer->getIndexMemory(frame);
m_vertexBuffer->setNumIndices((uint32_t)m_geometry->getNumTriangles() * 3); m_vertexBuffer->setNumIndices((uint32_t)m_geometry->getNumTriangles() * 3);
for (unsigned i = 0; i < m_geometry->getNumTriangles(); i++) for (unsigned i = 0; i < m_geometry->getNumTriangles(); i++)
......
...@@ -39,7 +39,9 @@ public: ...@@ -39,7 +39,9 @@ public:
/// ///
/// \brief Default constructor /// \brief Default constructor
/// ///
VulkanSurfaceMeshRenderDelegate(std::shared_ptr<SurfaceMesh> surfaceMesh, VulkanMemoryManager& memoryManager); VulkanSurfaceMeshRenderDelegate(std::shared_ptr<SurfaceMesh> surfaceMesh,
SceneObject::Type type,
VulkanMemoryManager& memoryManager);
/// ///
/// \brief Update render geometry /// \brief Update render geometry
......
...@@ -115,7 +115,7 @@ VulkanMemoryManager::requestMemoryAllocation( ...@@ -115,7 +115,7 @@ VulkanMemoryManager::requestMemoryAllocation(
if (vkAllocateMemory(m_device, &memoryInfo, nullptr, internalMemory->m_memory) != VK_SUCCESS) if (vkAllocateMemory(m_device, &memoryInfo, nullptr, internalMemory->m_memory) != VK_SUCCESS)
{ {
LOG(INFO) << "test"; LOG(INFO) << "Cannot allocate memory";
} }
m_memoryAllocations[type].push_back(internalMemory); m_memoryAllocations[type].push_back(internalMemory);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment