131 lines
4.7 KiB
C++
131 lines
4.7 KiB
C++
#include "Gizmos.h"
|
|
#include "GameObject.h"
|
|
#include "LEngine.h"
|
|
#include "d3d11_helper.h"
|
|
#include "LEngine.h"
|
|
|
|
Gizmos::Gizmos()
|
|
:_color(0.0f, 1.0f, 0.0f, 1.0f)
|
|
{
|
|
_matrix = float4x4::identity();
|
|
}
|
|
void Gizmos::SetMatrix(const float4x4& matrix) {
|
|
_matrix = matrix;
|
|
}
|
|
float4x4 Gizmos::GetMatrix() {
|
|
return _matrix;
|
|
}
|
|
void Gizmos::DrawBounds(const Bounds& bounds) {
|
|
auto b = bounds;
|
|
b.Scale(1.01f);
|
|
auto bMin = b.Minimum();
|
|
auto bMax = b.Maximum();
|
|
|
|
DrawLine(float3(bMin.x(), bMax.y(), bMax.z()), float3(bMax.x(), bMax.y(), bMax.z()));
|
|
DrawLine(float3(bMin.x(), bMax.y(), bMin.z()), float3(bMax.x(), bMax.y(), bMin.z()));
|
|
DrawLine(float3(bMin.x(), bMax.y(), bMax.z()), float3(bMin.x(), bMax.y(), bMin.z()));
|
|
DrawLine(float3(bMax.x(), bMax.y(), bMax.z()), float3(bMax.x(), bMax.y(), bMin.z()));
|
|
|
|
DrawLine(float3(bMin.x(), bMin.y(), bMax.z()), float3(bMax.x(), bMin.y(), bMax.z()));
|
|
DrawLine(float3(bMin.x(), bMin.y(), bMin.z()), float3(bMax.x(), bMin.y(), bMin.z()));
|
|
DrawLine(float3(bMin.x(), bMin.y(), bMax.z()), float3(bMin.x(), bMin.y(), bMin.z()));
|
|
DrawLine(float3(bMax.x(), bMin.y(), bMax.z()), float3(bMax.x(), bMin.y(), bMin.z()));
|
|
|
|
DrawLine(float3(bMin.x(), bMin.y(), bMin.z()), float3(bMin.x(), bMax.y(), bMin.z()));
|
|
DrawLine(float3(bMax.x(), bMin.y(), bMin.z()), float3(bMax.x(), bMax.y(), bMin.z()));
|
|
|
|
DrawLine(float3(bMin.x(), bMin.y(), bMax.z()), float3(bMin.x(), bMax.y(), bMax.z()));
|
|
DrawLine(float3(bMax.x(), bMin.y(), bMax.z()), float3(bMax.x(), bMax.y(), bMax.z()));
|
|
|
|
}
|
|
void Gizmos::Init() {
|
|
/*_backMaterial = Material::Create(Shader::Create(L"shaders/gizmos.fx"), "gizmo_back");
|
|
|
|
_frontMaterial = Material::Create(_backMaterial->GetShader(), "gizmo_front");
|
|
|
|
_backMaterial->GetParametersBlock().SetValue("alphaMul", 0.2f);
|
|
_frontMaterial->GetParametersBlock().SetValue("alphaMul", 1.0f);
|
|
|
|
D3D11_INPUT_ELEMENT_DESC ied[] = {
|
|
{ "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
|
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0 },
|
|
};
|
|
|
|
auto vs = _backMaterial->GetShader()->GetShader(ShaderType::Vs);
|
|
auto device = LEngine::Instance()->GetRenderer()->GetDevice();
|
|
auto hr = device->CreateInputLayout(ied, 2, vs->blob->GetBufferPointer(), vs->blob->GetBufferSize(), &_inputLayout);
|
|
|
|
D3D11_DEPTH_STENCIL_DESC desc;
|
|
d3d11_helper::DefaultDepthStencilDesc(desc);
|
|
hr = device->CreateDepthStencilState(&desc, &_frontLineDepthState);
|
|
desc.DepthFunc = D3D11_COMPARISON_GREATER;
|
|
hr = device->CreateDepthStencilState(&desc, &_backLineDepthState);*/
|
|
}
|
|
void Gizmos::DrawLine(const float3& from, const float3& to) {
|
|
/*_vertices.push_back(GizmoVertex(lm::mul(_matrix, from), _color));
|
|
_vertices.push_back(GizmoVertex(lm::mul(_matrix, to), _color));*/
|
|
}
|
|
void Gizmos::DrawAll(CameraPtr camera) {
|
|
/*auto renderer = LEngine::Instance()->GetRenderer();
|
|
|
|
renderer->GetImmediateContext()->OMSetDepthStencilState(_frontLineDepthState, 0);
|
|
DrawImpl(camera, _frontMaterial);
|
|
renderer->GetImmediateContext()->OMSetDepthStencilState(_backLineDepthState, 0);
|
|
DrawImpl(camera, _backMaterial);
|
|
renderer->GetImmediateContext()->OMSetDepthStencilState(_frontLineDepthState, 0);*/
|
|
}
|
|
void Gizmos::DrawImpl(CameraPtr camera, MaterialPtr material) {
|
|
/*if (_vertices.size() < 2) {
|
|
return;
|
|
}
|
|
//set system variables
|
|
auto& params = material->GetParametersBlock();
|
|
float4x4 matrix = float4x4::identity();
|
|
params.SetValue("mWorld", matrix);
|
|
params.SetValue("mView", camera->worldToCameraMatrix());
|
|
params.SetValue("mProjection", camera->projectionMatrix());
|
|
|
|
auto renderer = LEngine::Instance()->GetRenderer();
|
|
|
|
material->Apply(renderer->GetImmediateContext());
|
|
|
|
ID3D11Buffer* vb[1] = { _vertexBuffer };
|
|
UINT stride = sizeof(GizmoVertex);
|
|
UINT offset = 0;
|
|
|
|
renderer->GetImmediateContext()->IASetInputLayout(_inputLayout);
|
|
renderer->GetImmediateContext()->IASetVertexBuffers(0, 1, vb, &stride, &offset);
|
|
renderer->GetImmediateContext()->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
|
|
renderer->GetImmediateContext()->Draw(_vertices.size(), 0);*/
|
|
}
|
|
void Gizmos::Clear() {
|
|
/*_vertices.clear();
|
|
_matrix = float4x4::identity();*/
|
|
}
|
|
void Gizmos::PrepareRender() {
|
|
/*_vertexBuffer = nullptr;
|
|
|
|
if (_vertices.size() < 2) {
|
|
return;
|
|
}
|
|
//vertex buffer
|
|
D3D11_BUFFER_DESC desc = { 0 };
|
|
desc.Usage = D3D11_USAGE_DEFAULT;
|
|
desc.ByteWidth = sizeof(_vertices[0])* _vertices.size();
|
|
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
|
|
desc.CPUAccessFlags = 0;
|
|
desc.MiscFlags = 0;
|
|
|
|
D3D11_SUBRESOURCE_DATA data;
|
|
data.pSysMem = &_vertices[0];
|
|
data.SysMemPitch = 0;
|
|
|
|
_vertexBuffer = nullptr;
|
|
LEngine::Instance()->GetRenderer()->GetDevice()->CreateBuffer(&desc, &data, &_vertexBuffer);*/
|
|
}
|
|
float4 Gizmos::GetColor() {
|
|
return _color;
|
|
}
|
|
void Gizmos::SetColor(float4 color) {
|
|
_color = color;
|
|
} |