Skip to content

Commit

Permalink
Traktor: Create proper materials for spline entity while in editor.
Browse files Browse the repository at this point in the history
  • Loading branch information
apistol78 committed May 3, 2024
1 parent 8d13ad8 commit e5c7a11
Show file tree
Hide file tree
Showing 4 changed files with 221 additions and 28 deletions.
27 changes: 18 additions & 9 deletions code/Shape/Editor/Spline/SplineComponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*/
#include <limits>
#include "Core/Misc/SafeDestroy.h"
#include "Core/Serialization/DeepHash.h"
#include "Model/Model.h"
#include "Model/Operations/MergeModel.h"
#include "Physics/Body.h"
Expand All @@ -20,6 +21,7 @@
#include "Render/Shader.h"
#include "Render/VertexElement.h"
#include "Render/Context/RenderContext.h"
#include "Resource/IResourceManager.h"
#include "Shape/Editor/Spline/ControlPointComponent.h"
#include "Shape/Editor/Spline/ControlPointComponentData.h"
#include "Shape/Editor/Spline/SplineComponent.h"
Expand All @@ -39,7 +41,7 @@ namespace traktor::shape
struct Vertex
{
float position[3];
float normal[3];
float normal[4];
float texCoord[2];
};
#pragma pack()
Expand All @@ -52,13 +54,13 @@ SplineComponent::SplineComponent(
resource::IResourceManager* resourceManager,
render::IRenderSystem* renderSystem,
physics::PhysicsManager* physicsManager,
const resource::Proxy< render::Shader >& shader,
const resource::Proxy< render::Shader >& defaultShader,
const SplineComponentData* data
)
: m_resourceManager(resourceManager)
, m_renderSystem(renderSystem)
, m_physicsManager(physicsManager)
, m_shader(shader)
, m_defaultShader(defaultShader)
, m_data(data)
, m_dirty(true)
{
Expand Down Expand Up @@ -222,7 +224,7 @@ void SplineComponent::update(const world::UpdateParams& update)

AlignedVector< render::VertexElement > vertexElements;
vertexElements.push_back(render::VertexElement(render::DataUsage::Position, render::DtFloat3, offsetof(Vertex, position)));
vertexElements.push_back(render::VertexElement(render::DataUsage::Normal, render::DtFloat3, offsetof(Vertex, normal)));
vertexElements.push_back(render::VertexElement(render::DataUsage::Normal, render::DtFloat4, offsetof(Vertex, normal)));
vertexElements.push_back(render::VertexElement(render::DataUsage::Custom, render::DtFloat2, offsetof(Vertex, texCoord)));
m_vertexLayout = m_renderSystem->createVertexLayout(vertexElements);

Expand All @@ -237,7 +239,7 @@ void SplineComponent::update(const world::UpdateParams& update)
for (const auto& v : outputModel->getVertices())
{
const Vector4 p = outputModel->getPosition(v.getPosition());
const Vector4 n = (v.getNormal() != model::c_InvalidIndex) ? outputModel->getNormal(v.getNormal()) : Vector4::zero();
const Vector4 n = (v.getNormal() != model::c_InvalidIndex) ? outputModel->getNormal(v.getNormal()).xyz0() : Vector4::zero();
const Vector2 uv = (v.getTexCoord(0) != model::c_InvalidIndex) ? outputModel->getTexCoord(v.getTexCoord(0)) : Vector2::zero();

p.storeUnaligned(vertex->position);
Expand Down Expand Up @@ -277,6 +279,13 @@ void SplineComponent::update(const world::UpdateParams& update)
continue;

auto& batch = m_batches.push_back();

const uint32_t materialHash = DeepHash(&outputModel->getMaterial(i)).get();
const Guid materialId = Guid(L"{8BB018D2-7AAC-4F9D-A5A4-DE396604862C}").permutation(materialHash);

if (!m_resourceManager->bind(resource::Id< render::Shader >(materialId), batch.shader))
batch.shader = m_defaultShader;

batch.primitives.setIndexed(
render::PrimitiveType::Triangles,
offset,
Expand Down Expand Up @@ -309,13 +318,13 @@ void SplineComponent::build(
if (!m_indexBuffer || !m_vertexBuffer)
return;

auto sp = worldRenderPass.getProgram(m_shader);
if (!sp)
return;

auto renderContext = context.getRenderContext();
for (const auto& batch : m_batches)
{
auto sp = worldRenderPass.getProgram(batch.shader);
if (!sp)
continue;

auto renderBlock = renderContext->allocNamed< render::SimpleRenderBlock >(L"Solid");
renderBlock->distance = std::numeric_limits< float >::max();
renderBlock->program = sp.program;
Expand Down
5 changes: 3 additions & 2 deletions code/Shape/Editor/Spline/SplineComponent.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ class T_DLLCLASS SplineComponent : public world::IEntityComponent
resource::IResourceManager* resourceManager,
render::IRenderSystem* renderSystem,
physics::PhysicsManager* physicsManager,
const resource::Proxy< render::Shader >& shader,
const resource::Proxy< render::Shader >& defaultShader,
const SplineComponentData* data
);

Expand All @@ -98,14 +98,15 @@ class T_DLLCLASS SplineComponent : public world::IEntityComponent
private:
struct MaterialBatch
{
resource::Proxy< render::Shader > shader;
render::Primitives primitives;
};

Ref< resource::IResourceManager > m_resourceManager;
Ref< render::IRenderSystem > m_renderSystem;
Ref< physics::PhysicsManager > m_physicsManager;

resource::Proxy< render::Shader > m_shader;
resource::Proxy< render::Shader > m_defaultShader;

Ref< const SplineComponentData > m_data;
world::Entity* m_owner = nullptr;
Expand Down
Loading

0 comments on commit e5c7a11

Please sign in to comment.