From 16e12b30fdbc4b7127ba6889993b6381a8658aa7 Mon Sep 17 00:00:00 2001 From: Attila Kocsis Date: Fri, 8 Nov 2019 11:14:06 +0100 Subject: [PATCH] geometryv: added attrib/radius info and show 3d axes option max camera distance depends on loaded mesh size --- tools/geometryv/geometryv.cpp | 101 +++++++++++++++++++++++++++------- 1 file changed, 81 insertions(+), 20 deletions(-) diff --git a/tools/geometryv/geometryv.cpp b/tools/geometryv/geometryv.cpp index bde6f8d00..5edc7c9d5 100644 --- a/tools/geometryv/geometryv.cpp +++ b/tools/geometryv/geometryv.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -45,6 +46,30 @@ static const bgfx::EmbeddedShader s_embeddedShaders[] = BGFX_EMBEDDED_SHADER_END() }; +static const char* s_attribShortNames[] = +{ + "P", // Position + "N", // Normal + "T", // Tangent + "B", // Bitangent + "C0", // Color0 + "C1", // Color1 + "C2", // Color2 + "C3", // Color3 + "I", // Indices + "W", // Weight + "TC0", // TexCoord0 + "TC1", // TexCoord1 + "TC2", // TexCoord2 + "TC3", // TexCoord3 + "TC4", // TexCoord4 + "TC5", // TexCoord5 + "TC6", // TexCoord6 + "TC7", // TexCoord7 +}; +BX_STATIC_ASSERT(BX_COUNTOF(s_attribShortNames) == bgfx::Attrib::Count); + + static const char* s_supportedExt[] = { "bin", @@ -144,21 +169,24 @@ struct Camera { Camera() { - init(bx::Vec3(0.0f,0.0f,0.0f), 2.0f); + init(bx::Vec3(0.0f,0.0f,0.0f), 2.0f, 0.01f, 100.0f); } - void init(const bx::Vec3& _center, float _distance) + void init(const bx::Vec3& _center, float _distance, float _near, float _far) { m_target.curr = _center; m_target.dest = _center; m_pos.curr = _center; - m_pos.curr.z -= _distance; + m_pos.curr.z += _distance; m_pos.dest = _center; - m_pos.dest.z -= _distance; + m_pos.dest.z += _distance; m_orbit[0] = 0.0f; m_orbit[1] = 0.0f; + + m_near = _near; + m_far = _far; } void mtxLookAt(float* _outViewMtx) @@ -174,10 +202,7 @@ struct Camera void distance(float _z) { - const float cnear = 1.0f; - const float cfar = 100.0f; - - _z = bx::clamp(_z, cnear, cfar); + _z = bx::clamp(_z, m_near, m_far); bx::Vec3 toTarget = bx::sub(m_target.dest, m_pos.dest); bx::Vec3 toTargetNorm = bx::normalize(toTarget); @@ -187,18 +212,16 @@ struct Camera void dolly(float _dz) { - const float cnear = 1.0f; - const float cfar = 100.0f; - const bx::Vec3 toTarget = bx::sub(m_target.dest, m_pos.dest); const float toTargetLen = bx::length(toTarget); const float invToTargetLen = 1.0f / (toTargetLen + bx::kFloatMin); const bx::Vec3 toTargetNorm = bx::mul(toTarget, invToTargetLen); float delta = toTargetLen * _dz; - float newLen = toTargetLen + delta; - if ( (cnear < newLen || _dz < 0.0f) - && (newLen < cfar || _dz > 0.0f) ) + float newLen = toTargetLen - delta; + + if ( (m_near < newLen || _dz < 0.0f) + && (newLen < m_far || _dz > 0.0f) ) { m_pos.dest = bx::mad(toTargetNorm, delta, m_pos.dest); } @@ -249,6 +272,7 @@ struct Camera Interp3f m_target; Interp3f m_pos; float m_orbit[2]; + float m_near, m_far; }; struct Mouse @@ -298,6 +322,7 @@ struct View , m_about(false) , m_info(false) , m_files(false) + , m_axes(false) , m_meshCenter(0.0f,0.0f,0.0f) , m_meshRadius(1.0f) , m_idleTimer(0.0f) @@ -383,6 +408,10 @@ struct View m_camera.m_orbit[1] = 0.0f; } } + else if (0 == bx::strCmp(_argv[1], "axes") ) + { + m_axes ^= true; + } } return 0; @@ -539,6 +568,7 @@ struct View bool m_about; bool m_info; bool m_files; + bool m_axes; Camera m_camera; Mouse m_mouse; @@ -707,6 +737,8 @@ int _main_(int _argc, char** _argv) ); imguiCreate(); + + ddInit(); const bgfx::Caps* caps = bgfx::getCaps(); bgfx::RendererType::Enum type = caps->rendererType; @@ -836,6 +868,14 @@ int _main_(int _argc, char** _argv) { cmdExec(s_resetCmd); } + + ImGui::Separator(); + + bool axes = view.m_axes; + if (ImGui::MenuItem("XYZ Axes", NULL, &axes) ) + { + cmdExec("view axes"); + } ImGui::Separator(); @@ -937,7 +977,7 @@ int _main_(int _argc, char** _argv) if (view.m_info) { ImGui::SetNextWindowSize( - ImVec2(300.0f, 320.0f) + ImVec2(450.0f, 320.0f) , ImGuiCond_FirstUseEver ); @@ -951,16 +991,27 @@ int _main_(int _argc, char** _argv) } else { - ImGui::Text("Name: %s", view.m_fileList[view.m_fileIndex].c_str() ); + char layout[128] = {0}; + for(int32_t attrib = bgfx::Attrib::Position; attrib < bgfx::Attrib::Count; attrib++) + { + if ( mesh->m_layout.has(bgfx::Attrib::Enum(attrib)) ) + bx::strCat(layout, sizeof(layout), s_attribShortNames[attrib]); + } + + ImGui::Text("Name: %s %s", view.m_fileList[view.m_fileIndex].c_str(), layout); ImGui::Indent(); for (GroupArray::const_iterator itGroup = mesh->m_groups.begin(), itGroupEnd = mesh->m_groups.end(); itGroup != itGroupEnd; ++itGroup) { - ImGui::Text("Group v %d i %d", itGroup->m_numVertices, itGroup->m_numIndices); + ImGui::Text("Group v %d i %d c %.2f %.2f %.2f r %.2f", itGroup->m_numVertices, itGroup->m_numIndices, + itGroup->m_sphere.center.x, itGroup->m_sphere.center.y, itGroup->m_sphere.center.z, + itGroup->m_sphere.radius); ImGui::Indent(); for (PrimitiveArray::const_iterator itPrim = itGroup->m_prims.begin(), itPrimEnd = itGroup->m_prims.end(); itPrim != itPrimEnd; ++itPrim) { - ImGui::Text("Primitive v %d i %d", itPrim->m_numVertices, itPrim->m_numIndices); + ImGui::Text("Primitive v %d i %d c %.2f %.2f %.2f r %.2f", itPrim->m_numVertices, itPrim->m_numIndices, + itPrim->m_sphere.center.x, itPrim->m_sphere.center.y, itPrim->m_sphere.center.z, + itPrim->m_sphere.radius); } ImGui::Unindent(); } @@ -1163,7 +1214,7 @@ int _main_(int _argc, char** _argv) view.m_meshCenter = getCenter(boundingBox); view.m_meshRadius = bx::length(getExtents(boundingBox)); - view.m_camera.init( view.m_meshCenter, view.m_meshRadius * 2.0f); + view.m_camera.init( view.m_meshCenter, view.m_meshRadius * 2.0f, 0.01f, view.m_meshRadius * 10.0f); } else { @@ -1190,13 +1241,21 @@ int _main_(int _argc, char** _argv) float projMatrix[16]; const float aspect = float(view.m_width)/float(view.m_height); - bx::mtxProj(projMatrix, 60.0f, aspect, 0.1f, 1000.0f, caps->homogeneousDepth); + bx::mtxProj(projMatrix, 60.0f, aspect, 0.01f, 1000.0f, caps->homogeneousDepth); bgfx::setViewTransform(SCENE_VIEW_ID, viewMatrix, projMatrix); bgfx::setViewRect(SCENE_VIEW_ID, 0, 0, uint16_t(view.m_width), uint16_t(view.m_height) ); bgfx::touch(SCENE_VIEW_ID); + if ( view.m_axes ) + { + DebugDrawEncoder dde; + dde.begin(SCENE_VIEW_ID); + dde.drawAxis(0.0f, 0.0f, 0.0f); + dde.end(); + } + bgfx::dbgTextClear(); float orientation[16]; @@ -1234,6 +1293,8 @@ int _main_(int _argc, char** _argv) bgfx::destroy(meshProgram); + ddShutdown(); + imguiDestroy(); bgfx::shutdown();