(continued...)
KRMesh::renderSubmesh is now private. Added KRMesh::renderNoMaterials. Replaced renderSubmesh loops outside KRMesh with calls to KRMesh::renderNoMaterials. Added KRMesh::getVertexAttributes. Call sites are now using KRMesh::getVertexAttributes and KRMesh::getModelFormat to configure the pipeline.
This commit is contained in:
@@ -127,27 +127,28 @@ void KRAmbientZone::render(RenderInfo& ri)
|
|||||||
bool bVisualize = ri.camera->settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_SIREN_AMBIENT_ZONES;
|
bool bVisualize = ri.camera->settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_SIREN_AMBIENT_ZONES;
|
||||||
|
|
||||||
if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) {
|
if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) {
|
||||||
Matrix4 sphereModelMatrix = getModelMatrix();
|
std::vector<KRMesh*> sphereModels = getContext().getMeshManager()->getModel("__sphere");
|
||||||
|
if (sphereModels.size()) {
|
||||||
|
|
||||||
PipelineInfo info{};
|
Matrix4 sphereModelMatrix = getModelMatrix();
|
||||||
std::string shader_name("visualize_overlay");
|
|
||||||
info.shader_name = &shader_name;
|
PipelineInfo info{};
|
||||||
info.pCamera = ri.camera;
|
std::string shader_name("visualize_overlay");
|
||||||
info.point_lights = &ri.point_lights;
|
info.shader_name = &shader_name;
|
||||||
info.directional_lights = &ri.directional_lights;
|
info.pCamera = ri.camera;
|
||||||
info.spot_lights = &ri.spot_lights;
|
info.point_lights = &ri.point_lights;
|
||||||
info.renderPass = ri.renderPass;
|
info.directional_lights = &ri.directional_lights;
|
||||||
info.rasterMode = PipelineInfo::RasterMode::kAdditive;
|
info.spot_lights = &ri.spot_lights;
|
||||||
|
info.renderPass = ri.renderPass;
|
||||||
|
info.rasterMode = PipelineInfo::RasterMode::kAdditive;
|
||||||
|
info.modelFormat = sphereModels[0]->getModelFormat();
|
||||||
|
info.vertexAttributes = sphereModels[0]->getVertexAttributes();
|
||||||
|
|
||||||
KRPipeline *pPipeline = getContext().getPipelineManager()->getPipeline(*ri.surface, info);
|
KRPipeline *pPipeline = getContext().getPipelineManager()->getPipeline(*ri.surface, info);
|
||||||
pPipeline->bind(*ri.camera, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero());
|
pPipeline->bind(*ri.camera, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero());
|
||||||
|
|
||||||
std::vector<KRMesh *> sphereModels = getContext().getMeshManager()->getModel("__sphere");
|
sphereModels[0]->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "visualize_overlay", 1.0f);
|
||||||
if(sphereModels.size()) {
|
} // sphereModels.size()
|
||||||
for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) {
|
|
||||||
sphereModels[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -194,6 +194,8 @@ void KRAudioSource::render(RenderInfo& ri)
|
|||||||
bool bVisualize = false;
|
bool bVisualize = false;
|
||||||
|
|
||||||
if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) {
|
if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) {
|
||||||
|
std::vector<KRMesh*> sphereModels = getContext().getMeshManager()->getModel("__sphere");
|
||||||
|
if (sphereModels.size()) {
|
||||||
Matrix4 sphereModelMatrix = getModelMatrix();
|
Matrix4 sphereModelMatrix = getModelMatrix();
|
||||||
|
|
||||||
PipelineInfo info{};
|
PipelineInfo info{};
|
||||||
@@ -205,16 +207,14 @@ void KRAudioSource::render(RenderInfo& ri)
|
|||||||
info.spot_lights = &ri.spot_lights;
|
info.spot_lights = &ri.spot_lights;
|
||||||
info.renderPass = ri.renderPass;
|
info.renderPass = ri.renderPass;
|
||||||
info.rasterMode = PipelineInfo::RasterMode::kAdditive;
|
info.rasterMode = PipelineInfo::RasterMode::kAdditive;
|
||||||
|
info.modelFormat = sphereModels[0]->getModelFormat();
|
||||||
KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info);
|
info.vertexAttributes = sphereModels[0]->getVertexAttributes();
|
||||||
|
|
||||||
|
KRPipeline* pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info);
|
||||||
pShader->bind(*ri.camera, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero());
|
pShader->bind(*ri.camera, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero());
|
||||||
|
|
||||||
std::vector<KRMesh *> sphereModels = getContext().getMeshManager()->getModel("__sphere");
|
sphereModels[0]->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "visualize_overlay", 1.0f);
|
||||||
if(sphereModels.size()) {
|
} // sphereModels.size()
|
||||||
for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) {
|
|
||||||
sphereModels[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -78,27 +78,27 @@ void KRBone::render(RenderInfo& ri)
|
|||||||
bool bVisualize = ri.camera->settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_BONES;
|
bool bVisualize = ri.camera->settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_BONES;
|
||||||
|
|
||||||
if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) {
|
if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) {
|
||||||
Matrix4 sphereModelMatrix = getModelMatrix();
|
std::vector<KRMesh*> sphereModels = getContext().getMeshManager()->getModel("__sphere");
|
||||||
|
if (sphereModels.size()) {
|
||||||
|
Matrix4 sphereModelMatrix = getModelMatrix();
|
||||||
|
|
||||||
PipelineInfo info{};
|
PipelineInfo info{};
|
||||||
std::string shader_name("visualize_overlay");
|
std::string shader_name("visualize_overlay");
|
||||||
info.shader_name = &shader_name;
|
info.shader_name = &shader_name;
|
||||||
info.pCamera = ri.camera;
|
info.pCamera = ri.camera;
|
||||||
info.point_lights = &ri.point_lights;
|
info.point_lights = &ri.point_lights;
|
||||||
info.directional_lights = &ri.directional_lights;
|
info.directional_lights = &ri.directional_lights;
|
||||||
info.spot_lights = &ri.spot_lights;
|
info.spot_lights = &ri.spot_lights;
|
||||||
info.renderPass = ri.renderPass;
|
info.renderPass = ri.renderPass;
|
||||||
info.rasterMode = PipelineInfo::RasterMode::kAdditiveNoTest;
|
info.rasterMode = PipelineInfo::RasterMode::kAdditiveNoTest;
|
||||||
|
info.modelFormat = sphereModels[0]->getModelFormat();
|
||||||
|
info.vertexAttributes = sphereModels[0]->getVertexAttributes();
|
||||||
|
|
||||||
KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info);
|
KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info);
|
||||||
pShader->bind(*ri.camera, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero());
|
pShader->bind(*ri.camera, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero());
|
||||||
|
|
||||||
std::vector<KRMesh *> sphereModels = getContext().getMeshManager()->getModel("__sphere");
|
sphereModels[0]->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "visualize_overlay", 1.0f);
|
||||||
if(sphereModels.size()) {
|
} // sphereModels.size()
|
||||||
for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) {
|
|
||||||
sphereModels[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -338,22 +338,26 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS
|
|||||||
|
|
||||||
GL_PUSH_GROUP_MARKER("Debug Overlays");
|
GL_PUSH_GROUP_MARKER("Debug Overlays");
|
||||||
|
|
||||||
if(settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_OCTREE) {
|
if(settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_OCTREE) {
|
||||||
|
KRMeshManager::KRVBOData& vertices = getContext().getMeshManager()->KRENGINE_VBO_DATA_3D_CUBE_VERTICES;
|
||||||
|
|
||||||
PipelineInfo info{};
|
PipelineInfo info{};
|
||||||
std::string shader_name("visualize_overlay");
|
std::string shader_name("visualize_overlay");
|
||||||
info.shader_name = &shader_name;
|
info.shader_name = &shader_name;
|
||||||
info.pCamera = this;
|
info.pCamera = this;
|
||||||
info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT;
|
info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT;
|
||||||
info.rasterMode = PipelineInfo::RasterMode::kAdditive;
|
info.rasterMode = PipelineInfo::RasterMode::kAdditive;
|
||||||
KRPipeline *pVisShader = getContext().getPipelineManager()->getPipeline(compositeSurface, info);
|
info.vertexAttributes = vertices.getVertexAttributes();
|
||||||
|
info.modelFormat = KRMesh::model_format_t::KRENGINE_MODEL_FORMAT_STRIP;
|
||||||
|
KRPipeline *pVisShader = getContext().getPipelineManager()->getPipeline(compositeSurface, info);
|
||||||
|
|
||||||
m_pContext->getMeshManager()->bindVBO(commandBuffer, &getContext().getMeshManager()->KRENGINE_VBO_DATA_3D_CUBE_VERTICES, 1.0f);
|
m_pContext->getMeshManager()->bindVBO(commandBuffer, &vertices, 1.0f);
|
||||||
for(unordered_map<AABB, int>::iterator itr=m_viewport.getVisibleBounds().begin(); itr != m_viewport.getVisibleBounds().end(); itr++) {
|
for(unordered_map<AABB, int>::iterator itr=m_viewport.getVisibleBounds().begin(); itr != m_viewport.getVisibleBounds().end(); itr++) {
|
||||||
Matrix4 matModel = Matrix4();
|
Matrix4 matModel = Matrix4();
|
||||||
matModel.scale((*itr).first.size() * 0.5f);
|
matModel.scale((*itr).first.size() * 0.5f);
|
||||||
matModel.translate((*itr).first.center());
|
matModel.translate((*itr).first.center());
|
||||||
pVisShader->bind(*this, m_viewport, matModel, nullptr, nullptr, nullptr, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, Vector3::Zero(), 0.0f, Vector4::Zero());
|
pVisShader->bind(*this, m_viewport, matModel, nullptr, nullptr, nullptr, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, Vector3::Zero(), 0.0f, Vector4::Zero());
|
||||||
GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 14));
|
vkCmdDraw(commandBuffer, 14, 1, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GL_POP_GROUP_MARKER;
|
GL_POP_GROUP_MARKER;
|
||||||
@@ -557,19 +561,20 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface)
|
|||||||
GLDEBUG(glViewport(0, 0, (GLsizei)m_viewport.getSize().x, (GLsizei)m_viewport.getSize().y));
|
GLDEBUG(glViewport(0, 0, (GLsizei)m_viewport.getSize().x, (GLsizei)m_viewport.getSize().y));
|
||||||
|
|
||||||
|
|
||||||
|
KRMeshManager::KRVBOData& vertices = getContext().getMeshManager()->KRENGINE_VBO_DATA_2D_SQUARE_VERTICES;
|
||||||
|
|
||||||
PipelineInfo info{};
|
PipelineInfo info{};
|
||||||
std::string shader_name("PostShader");
|
std::string shader_name("PostShader");
|
||||||
info.shader_name = &shader_name;
|
info.shader_name = &shader_name;
|
||||||
info.pCamera = this;
|
info.pCamera = this;
|
||||||
info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT;
|
info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT;
|
||||||
info.rasterMode = PipelineInfo::RasterMode::kOpaqueNoTest;
|
info.rasterMode = PipelineInfo::RasterMode::kOpaqueNoTest;
|
||||||
|
info.modelFormat = KRMesh::model_format_t::KRENGINE_MODEL_FORMAT_STRIP;
|
||||||
|
info.vertexAttributes = vertices.getVertexAttributes();
|
||||||
|
|
||||||
KRPipeline *postShader = m_pContext->getPipelineManager()->getPipeline(surface, info);
|
KRPipeline *postShader = m_pContext->getPipelineManager()->getPipeline(surface, info);
|
||||||
|
|
||||||
Vector3 rim_color;
|
postShader->bind(*this, m_viewport, Matrix4(), nullptr, nullptr, nullptr, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, Vector3::Zero(), 0.0f, m_fade_color);
|
||||||
|
|
||||||
|
|
||||||
postShader->bind(*this, m_viewport, Matrix4(), nullptr, nullptr, nullptr, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, rim_color, 0.0f, m_fade_color);
|
|
||||||
|
|
||||||
m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 0, compositeDepthTexture);
|
m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 0, compositeDepthTexture);
|
||||||
m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 1, compositeColorTexture);
|
m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 1, compositeColorTexture);
|
||||||
@@ -579,13 +584,10 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update attribute values.
|
// Update attribute values.
|
||||||
m_pContext->getMeshManager()->bindVBO(commandBuffer, &getContext().getMeshManager()->KRENGINE_VBO_DATA_2D_SQUARE_VERTICES, 1.0f);
|
m_pContext->getMeshManager()->bindVBO(commandBuffer, &vertices, 1.0f);
|
||||||
|
|
||||||
GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4));
|
vkCmdDraw(commandBuffer, 4, 1, 0, 0);
|
||||||
|
|
||||||
m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 0, 0);
|
|
||||||
m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 1, 0);
|
|
||||||
|
|
||||||
|
|
||||||
// if(bShowShadowBuffer) {
|
// if(bShowShadowBuffer) {
|
||||||
// KRPipeline *blitShader = m_pContext->getPipelineManager()->getShader("simple_blit", this, false, false, false, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, KRNode::RENDER_PASS_FORWARD_TRANSPARENT);
|
// KRPipeline *blitShader = m_pContext->getPipelineManager()->getShader("simple_blit", this, false, false, false, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, KRNode::RENDER_PASS_FORWARD_TRANSPARENT);
|
||||||
@@ -744,6 +746,8 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface)
|
|||||||
info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT;
|
info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT;
|
||||||
info.rasterMode = PipelineInfo::RasterMode::kAlphaBlendNoTest;
|
info.rasterMode = PipelineInfo::RasterMode::kAlphaBlendNoTest;
|
||||||
info.cullMode = PipelineInfo::CullMode::kCullNone;
|
info.cullMode = PipelineInfo::CullMode::kCullNone;
|
||||||
|
info.vertexAttributes = (1 << KRMesh::KRENGINE_ATTRIB_VERTEX) | (1 << KRMesh::KRENGINE_ATTRIB_TEXUVA);
|
||||||
|
info.modelFormat = KRMesh::model_format_t::KRENGINE_MODEL_FORMAT_TRIANGLES;
|
||||||
KRPipeline *fontShader = m_pContext->getPipelineManager()->getPipeline(surface, info);
|
KRPipeline *fontShader = m_pContext->getPipelineManager()->getPipeline(surface, info);
|
||||||
fontShader->bind(*this, m_viewport, Matrix4(), nullptr, nullptr, nullptr, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, Vector3::Zero(), 0.0f, Vector4::Zero());
|
fontShader->bind(*this, m_viewport, Matrix4(), nullptr, nullptr, nullptr, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, Vector3::Zero(), 0.0f, Vector4::Zero());
|
||||||
|
|
||||||
@@ -757,7 +761,7 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface)
|
|||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
|
||||||
GLDEBUG(glDrawArrays(GL_TRIANGLES, 0, vertex_count));
|
vkCmdDraw(commandBuffer, vertex_count, 1, 0, 0);
|
||||||
|
|
||||||
m_debug_text_vertices.unlock();
|
m_debug_text_vertices.unlock();
|
||||||
|
|
||||||
|
|||||||
@@ -213,14 +213,14 @@ void KRCollider::render(RenderInfo& ri)
|
|||||||
info.spot_lights = &ri.spot_lights;
|
info.spot_lights = &ri.spot_lights;
|
||||||
info.renderPass = ri.renderPass;
|
info.renderPass = ri.renderPass;
|
||||||
info.rasterMode = PipelineInfo::RasterMode::kAdditive;
|
info.rasterMode = PipelineInfo::RasterMode::kAdditive;
|
||||||
|
info.modelFormat = m_models[0]->getModelFormat();
|
||||||
|
info.vertexAttributes = m_models[0]->getVertexAttributes();
|
||||||
|
|
||||||
KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info);
|
KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info);
|
||||||
|
|
||||||
pShader->bind(*ri.camera, ri.viewport, getModelMatrix(), &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero());
|
pShader->bind(*ri.camera, ri.viewport, getModelMatrix(), &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero());
|
||||||
|
|
||||||
for(int i=0; i < m_models[0]->getSubmeshCount(); i++) {
|
m_models[0]->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "visualize_overlay", 1.0f);
|
||||||
m_models[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
GL_POP_GROUP_MARKER;
|
GL_POP_GROUP_MARKER;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -427,6 +427,14 @@ void KRMesh::createDataBlocks(KRMeshManager::KRVBOData::vbo_type t)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KRMesh::renderNoMaterials(VkCommandBuffer& commandBuffer, KRNode::RenderPass renderPass, const std::string& object_name, const std::string& material_name, float lodCoverage)
|
||||||
|
{
|
||||||
|
int submesh_count = getSubmeshCount();
|
||||||
|
for (int i = 0; i < submesh_count; i++) {
|
||||||
|
renderSubmesh(commandBuffer, i, renderPass, object_name, material_name, lodCoverage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void KRMesh::renderSubmesh(VkCommandBuffer& commandBuffer, int iSubmesh, KRNode::RenderPass renderPass, const std::string &object_name, const std::string &material_name, float lodCoverage) {
|
void KRMesh::renderSubmesh(VkCommandBuffer& commandBuffer, int iSubmesh, KRNode::RenderPass renderPass, const std::string &object_name, const std::string &material_name, float lodCoverage) {
|
||||||
getSubmeshes();
|
getSubmeshes();
|
||||||
|
|
||||||
@@ -859,6 +867,13 @@ int KRMesh::getVertexCount(int submesh) const
|
|||||||
return getSubmesh(submesh)->vertex_count;
|
return getSubmesh(submesh)->vertex_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__uint32_t KRMesh::getVertexAttributes() const
|
||||||
|
{
|
||||||
|
pack_header* header = getHeader();
|
||||||
|
__uint32_t attributes = header->vertex_attrib_flags;
|
||||||
|
return attributes;
|
||||||
|
}
|
||||||
|
|
||||||
Vector3 KRMesh::getVertexPosition(int index) const
|
Vector3 KRMesh::getVertexPosition(int index) const
|
||||||
{
|
{
|
||||||
if(has_vertex_attribute(KRENGINE_ATTRIB_VERTEX_SHORT)) {
|
if(has_vertex_attribute(KRENGINE_ATTRIB_VERTEX_SHORT)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user