Skinned transparent model Picking fixed
This commit is contained in:
@@ -31,14 +31,14 @@
|
|||||||
<c:Animation>
|
<c:Animation>
|
||||||
<AnimationName1>Run</AnimationName1>
|
<AnimationName1>Run</AnimationName1>
|
||||||
<Weight1>0.5</Weight1>
|
<Weight1>0.5</Weight1>
|
||||||
<Time1>0.44037772975435119</Time1>
|
<Time1>0.23980116887997371</Time1>
|
||||||
<Speed1>1</Speed1>
|
<Speed1>1</Speed1>
|
||||||
<Speed2>1</Speed2>
|
<Speed2>1</Speed2>
|
||||||
<AnimationName2>StrafeRight</AnimationName2>
|
<AnimationName2>StrafeRight</AnimationName2>
|
||||||
<Weight2>0.5</Weight2>
|
<Weight2>0.5</Weight2>
|
||||||
<Time2>0.62650761653875175</Time2>
|
<Time2>0.42593105566437428</Time2>
|
||||||
<AnimationName3>ReloadSwitch</AnimationName3>
|
<AnimationName3>ReloadSwitch</AnimationName3>
|
||||||
<Time3>0.88913372073808805</Time3>
|
<Time3>0.68855715986371058</Time3>
|
||||||
<Speed3>1</Speed3>
|
<Speed3>1</Speed3>
|
||||||
</c:Animation>
|
</c:Animation>
|
||||||
<c:AnimationOffset>
|
<c:AnimationOffset>
|
||||||
@@ -47,7 +47,6 @@
|
|||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>Models/Characters/Assault/AssaultAnimations.mesh</Resource>
|
<Resource>Models/Characters/Assault/AssaultAnimations.mesh</Resource>
|
||||||
<Color A="1" B="0.984313726" G="1" R="1"/>
|
<Color A="1" B="0.984313726" G="1" R="1"/>
|
||||||
<Transparent>true</Transparent>
|
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="-0.690088332" Y="0" Z="0"/>
|
<Position X="-0.690088332" Y="0" Z="0"/>
|
||||||
|
|||||||
@@ -156,45 +156,80 @@ void PickingPass::Draw(RenderScene& scene)
|
|||||||
auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
|
auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
|
||||||
|
|
||||||
if (modelJob) {
|
if (modelJob) {
|
||||||
int pickColor[2] = { m_ColorCounter[0], m_ColorCounter[1] };
|
|
||||||
|
|
||||||
PickingInfo pickInfo;
|
if (modelJob->Model->isSkined()) {
|
||||||
pickInfo.Entity = modelJob->Entity;
|
m_PickingSkinnedProgram->Bind();
|
||||||
pickInfo.World = modelJob->World;
|
int pickColor[2] = { m_ColorCounter[0], m_ColorCounter[1] };
|
||||||
pickInfo.Camera = scene.Camera;
|
|
||||||
|
|
||||||
auto color = m_EntityColors.find(std::make_tuple(pickInfo.Entity, pickInfo.World, pickInfo.Camera));
|
PickingInfo pickInfo;
|
||||||
if (color != m_EntityColors.end()) {
|
pickInfo.Entity = modelJob->Entity;
|
||||||
pickColor[0] = color->second[0];
|
pickInfo.World = modelJob->World;
|
||||||
pickColor[1] = color->second[1];
|
pickInfo.Camera = scene.Camera;
|
||||||
|
|
||||||
|
auto color = m_EntityColors.find(std::make_tuple(pickInfo.Entity, pickInfo.World, pickInfo.Camera));
|
||||||
|
if (color != m_EntityColors.end()) {
|
||||||
|
pickColor[0] = color->second[0];
|
||||||
|
pickColor[1] = color->second[1];
|
||||||
|
} else {
|
||||||
|
m_EntityColors[std::make_tuple(pickInfo.Entity, pickInfo.World, pickInfo.Camera)] = glm::ivec2(pickColor[0], pickColor[1]);
|
||||||
|
if (m_ColorCounter[0] > 255) {
|
||||||
|
m_ColorCounter[0] = 0;
|
||||||
|
m_ColorCounter[1] += 1;
|
||||||
|
} else {
|
||||||
|
m_ColorCounter[0] += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_PickingColorsToEntity[glm::ivec2(pickColor[0], pickColor[1])] = pickInfo;
|
||||||
|
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix()));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix()));
|
||||||
|
glUniform2fv(glGetUniformLocation(shaderSkinnedHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1])));
|
||||||
|
|
||||||
|
if (modelJob->Model->m_RawModel->m_Skeleton != nullptr) {
|
||||||
|
|
||||||
|
std::vector<glm::mat4> frameBones;
|
||||||
|
if (modelJob->AnimationOffset.animation != nullptr) {
|
||||||
|
frameBones = modelJob->Skeleton->GetFrameBones(modelJob->Animations, modelJob->AnimationOffset);
|
||||||
|
} else {
|
||||||
|
frameBones = modelJob->Skeleton->GetFrameBones(modelJob->Animations);
|
||||||
|
}
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
||||||
|
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
m_EntityColors[std::make_tuple(pickInfo.Entity, pickInfo.World, pickInfo.Camera)] = glm::ivec2(pickColor[0], pickColor[1]);
|
int pickColor[2] = { m_ColorCounter[0], m_ColorCounter[1] };
|
||||||
if (m_ColorCounter[0] > 255) {
|
|
||||||
m_ColorCounter[0] = 0;
|
PickingInfo pickInfo;
|
||||||
m_ColorCounter[1] += 1;
|
pickInfo.Entity = modelJob->Entity;
|
||||||
|
pickInfo.World = modelJob->World;
|
||||||
|
pickInfo.Camera = scene.Camera;
|
||||||
|
|
||||||
|
auto color = m_EntityColors.find(std::make_tuple(pickInfo.Entity, pickInfo.World, pickInfo.Camera));
|
||||||
|
if (color != m_EntityColors.end()) {
|
||||||
|
pickColor[0] = color->second[0];
|
||||||
|
pickColor[1] = color->second[1];
|
||||||
} else {
|
} else {
|
||||||
m_ColorCounter[0] += 1;
|
m_EntityColors[std::make_tuple(pickInfo.Entity, pickInfo.World, pickInfo.Camera)] = glm::ivec2(pickColor[0], pickColor[1]);
|
||||||
|
if (m_ColorCounter[0] > 255) {
|
||||||
|
m_ColorCounter[0] = 0;
|
||||||
|
m_ColorCounter[1] += 1;
|
||||||
|
} else {
|
||||||
|
m_ColorCounter[0] += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_PickingColorsToEntity[glm::ivec2(pickColor[0], pickColor[1])] = pickInfo;
|
||||||
|
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix()));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix()));
|
||||||
|
glUniform2fv(glGetUniformLocation(shaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1])));
|
||||||
}
|
}
|
||||||
|
|
||||||
m_PickingColorsToEntity[glm::ivec2(pickColor[0], pickColor[1])] = pickInfo;
|
|
||||||
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix()));
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix()));
|
|
||||||
glUniform2fv(glGetUniformLocation(shaderHandle, "PickingColor"), 1, glm::value_ptr(glm::vec2(pickColor[0], pickColor[1])));
|
|
||||||
|
|
||||||
if (modelJob->Model->m_RawModel->m_Skeleton != nullptr) {
|
|
||||||
|
|
||||||
std::vector<glm::mat4> frameBones;
|
|
||||||
if (modelJob->AnimationOffset.animation != nullptr) {
|
|
||||||
frameBones = modelJob->Skeleton->GetFrameBones(modelJob->Animations, modelJob->AnimationOffset);
|
|
||||||
} else {
|
|
||||||
frameBones = modelJob->Skeleton->GetFrameBones(modelJob->Animations);
|
|
||||||
}
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
glBindVertexArray(modelJob->Model->VAO);
|
glBindVertexArray(modelJob->Model->VAO);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
||||||
@@ -214,8 +249,8 @@ void PickingPass::ClearPicking()
|
|||||||
{
|
{
|
||||||
m_PickingColorsToEntity.clear();
|
m_PickingColorsToEntity.clear();
|
||||||
m_EntityColors.clear();
|
m_EntityColors.clear();
|
||||||
m_ColorCounter[0] = 1;
|
m_ColorCounter[0] = 0;
|
||||||
m_ColorCounter[1] = 0;
|
m_ColorCounter[1] = 1;
|
||||||
|
|
||||||
m_PickingBuffer.Bind();
|
m_PickingBuffer.Bind();
|
||||||
glClearColor(0.f, 0.f, 0.f, 0.f);
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
|
|||||||
Reference in New Issue
Block a user