Add Origin Indicator drawable
This commit is contained in:
46
openVulkanoCpp/Scene/Prefabs/OriginIndicatorDrawable.hpp
Normal file
46
openVulkanoCpp/Scene/Prefabs/OriginIndicatorDrawable.hpp
Normal file
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Scene/Drawable.hpp"
|
||||
#include "Scene/Shader/Shader.hpp"
|
||||
#include "Scene/Node.hpp"
|
||||
|
||||
namespace OpenVulkano::Scene
|
||||
{
|
||||
class OriginIndicatorDrawable final : public Drawable
|
||||
{
|
||||
Shader m_shader;
|
||||
|
||||
public:
|
||||
OriginIndicatorDrawable()
|
||||
: Drawable(DrawEncoder::GetDrawEncoder<OriginIndicatorDrawable>(), DrawPhase::MAIN)
|
||||
{
|
||||
m_shader.cullMode = CullMode::NONE;
|
||||
m_shader.topology = Topology::LINE_LIST;
|
||||
m_shader.AddShaderProgram(ShaderProgramType::VERTEX, "Shader/originIndicator");
|
||||
m_shader.AddShaderProgram(ShaderProgramType::FRAGMENT, "Shader/basic");
|
||||
SetShader(&m_shader);
|
||||
}
|
||||
};
|
||||
|
||||
class OriginIndicatorNode final : public Node
|
||||
{
|
||||
OriginIndicatorDrawable drawable;
|
||||
|
||||
public:
|
||||
OriginIndicatorNode(float size = 0.25f) : Node(Math::Utils::scale(Math::Vector3f(size, size, size)))
|
||||
{
|
||||
AddChild(&drawable);
|
||||
}
|
||||
|
||||
void SetSize(float size = 0.25f)
|
||||
{
|
||||
SetMatrix(Math::Utils::scale(Math::Vector3f(size, size, size)));
|
||||
}
|
||||
};
|
||||
}
|
||||
23
openVulkanoCpp/Shader/originIndicator.vert
Normal file
23
openVulkanoCpp/Shader/originIndicator.vert
Normal file
@@ -0,0 +1,23 @@
|
||||
#version 450
|
||||
#extension GL_ARB_separate_shader_objects : enable
|
||||
|
||||
layout(set = 0, binding = 0) uniform NodeData
|
||||
{
|
||||
mat4 world;
|
||||
} node;
|
||||
|
||||
layout(set = 1, binding = 0) uniform CameraData
|
||||
{
|
||||
mat4 viewProjection;
|
||||
} cam;
|
||||
|
||||
layout(location = 0) out vec4 color;
|
||||
|
||||
void main()
|
||||
{
|
||||
int i = gl_VertexIndex & -2;
|
||||
color = vec4(i == 0, i == 2, i == 4, 1);
|
||||
vec4 position = color * (gl_VertexIndex & 1);
|
||||
position.w = 1;
|
||||
gl_Position = cam.viewProjection * node.world * position;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#include "Scene/Prefabs/OriginIndicatorDrawable.hpp"
|
||||
#include "VulkanGeometry.hpp"
|
||||
#include "Vulkan/VulkanDrawContext.hpp"
|
||||
|
||||
using namespace OpenVulkano::Scene;
|
||||
|
||||
namespace OpenVulkano::Vulkan
|
||||
{
|
||||
void EncodeOriginIndicatorDrawable(Drawable* instance, Vulkan::VulkanDrawContext* drawContext)
|
||||
{
|
||||
for(Node* node : instance->GetNodes())
|
||||
{
|
||||
if (!node->IsEnabled()) [[unlikely]] continue;
|
||||
drawContext->EncodeNode(node);
|
||||
drawContext->commandBuffer.draw(6, 1, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
void* gridDrawableVulkanEncoderReg = DrawEncoder::RegisterVulkanEncodeFunction<OriginIndicatorDrawable>(&OpenVulkano::Vulkan::EncodeOriginIndicatorDrawable);
|
||||
}
|
||||
Reference in New Issue
Block a user