diff options
Diffstat (limited to '3rdparty/bgfx/examples/02-metaballs/metaballs.cpp')
-rw-r--r-- | 3rdparty/bgfx/examples/02-metaballs/metaballs.cpp | 176 |
1 files changed, 112 insertions, 64 deletions
diff --git a/3rdparty/bgfx/examples/02-metaballs/metaballs.cpp b/3rdparty/bgfx/examples/02-metaballs/metaballs.cpp index f5256d8286d..293ed276ecc 100644 --- a/3rdparty/bgfx/examples/02-metaballs/metaballs.cpp +++ b/3rdparty/bgfx/examples/02-metaballs/metaballs.cpp @@ -1,6 +1,6 @@ /* - * Copyright 2011-2018 Branimir Karadzic. All rights reserved. - * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause + * Copyright 2011-2022 Branimir Karadzic. All rights reserved. + * License: https://github.com/bkaradzic/bgfx/blob/master/LICENSE */ #include "common.h" @@ -32,7 +32,7 @@ struct PosNormalColorVertex static void init() { - ms_decl + ms_layout .begin() .add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) .add(bgfx::Attrib::Normal, 3, bgfx::AttribType::Float) @@ -40,10 +40,10 @@ struct PosNormalColorVertex .end(); }; - static bgfx::VertexDecl ms_decl; + static bgfx::VertexLayout ms_layout; }; -bgfx::VertexDecl PosNormalColorVertex::ms_decl; +bgfx::VertexLayout PosNormalColorVertex::ms_layout; struct Grid { @@ -59,8 +59,9 @@ struct Grid float m_normal[3]; }; -// Triangulation tables taken from: -// http://paulbourke.net/geometry/polygonise/ +// Reference(s): +// - Polygonising a scalar field +// https://web.archive.org/web/20181127124338/http://paulbourke.net/geometry/polygonise/ static const uint16_t s_edges[256] = { @@ -370,10 +371,10 @@ static const float s_cube[8][3] = { 0.0f, 0.0f, 0.0f }, // 7 }; -float vertLerp(float* __restrict _result, float _iso, uint32_t _idx0, float _v0, uint32_t _idx1, float _v1) +float vertLerp(float* _result, float _iso, uint32_t _idx0, float _v0, uint32_t _idx1, float _v1) { - const float* __restrict edge0 = s_cube[_idx0]; - const float* __restrict edge1 = s_cube[_idx1]; + const float* edge0 = s_cube[_idx0]; + const float* edge1 = s_cube[_idx1]; if (bx::abs(_iso-_v1) < 0.00001f) { @@ -400,7 +401,15 @@ float vertLerp(float* __restrict _result, float _iso, uint32_t _idx0, float _v0, return lerp; } -uint32_t triangulate(uint8_t* _result, uint32_t _stride, const float* __restrict _rgb, const float* __restrict _xyz, const Grid* _val[8], float _iso) +uint32_t triangulate( + uint8_t* _result + , uint32_t _stride + , const float* _rgb + , const float* _xyz + , const Grid* _val[8] + , float _iso + , float _scale + ) { uint8_t cubeindex = 0; cubeindex |= (_val[0]->m_val < _iso) ? 0x01 : 0; @@ -437,9 +446,9 @@ uint32_t triangulate(uint8_t* _result, uint32_t _stride, const float* __restrict } } - float dr = _rgb[3] - _rgb[0]; - float dg = _rgb[4] - _rgb[1]; - float db = _rgb[5] - _rgb[2]; + const float dr = _rgb[3] - _rgb[0]; + const float dg = _rgb[4] - _rgb[1]; + const float db = _rgb[5] - _rgb[2]; uint32_t num = 0; const int8_t* indices = s_indices[cubeindex]; @@ -448,13 +457,13 @@ uint32_t triangulate(uint8_t* _result, uint32_t _stride, const float* __restrict const float* vertex = verts[uint8_t(indices[ii])]; float* xyz = (float*)_result; - xyz[0] = _xyz[0] + vertex[0]; - xyz[1] = _xyz[1] + vertex[1]; - xyz[2] = _xyz[2] + vertex[2]; + xyz[0] = _xyz[0] + vertex[0]*_scale; + xyz[1] = _xyz[1] + vertex[1]*_scale; + xyz[2] = _xyz[2] + vertex[2]*_scale; - xyz[3] = vertex[3]; - xyz[4] = vertex[4]; - xyz[5] = vertex[5]; + xyz[3] = vertex[3]*_scale; + xyz[4] = vertex[4]*_scale; + xyz[5] = vertex[5]*_scale; uint32_t rr = uint8_t( (_rgb[0] + vertex[0]*dr)*255.0f); uint32_t gg = uint8_t( (_rgb[1] + vertex[1]*dg)*255.0f); @@ -474,13 +483,14 @@ uint32_t triangulate(uint8_t* _result, uint32_t _stride, const float* __restrict return num; } -#define DIMS 32 +constexpr uint32_t kMaxDims = 32; +constexpr float kMaxDimsF = float(kMaxDims); class ExampleMetaballs : public entry::AppI { public: - ExampleMetaballs(const char* _name, const char* _description) - : entry::AppI(_name, _description) + ExampleMetaballs(const char* _name, const char* _description, const char* _url) + : entry::AppI(_name, _description, _url) { } @@ -496,6 +506,9 @@ public: bgfx::Init init; init.type = args.m_type; init.vendorId = args.m_pciId; + init.platformData.nwh = entry::getNativeWindowHandle(entry::kDefaultWindowHandle); + init.platformData.ndt = entry::getNativeDisplayHandle(); + init.platformData.type = entry::getNativeWindowHandleType(entry::kDefaultWindowHandle); init.resolution.width = m_width; init.resolution.height = m_height; init.resolution.reset = m_reset; @@ -523,7 +536,7 @@ public: // Create program from shaders. m_program = bgfx::createProgram(vsh, fsh, true /* destroy shaders when program is destroyed */); - m_grid = new Grid[DIMS*DIMS*DIMS]; + m_grid = new Grid[kMaxDims*kMaxDims*kMaxDims]; m_timeOffset = bx::getHPCounter(); imguiCreate(); @@ -546,9 +559,8 @@ public: bool update() override { - const uint32_t ypitch = DIMS; - const uint32_t zpitch = DIMS*DIMS; - const float invdim = 1.0f/float(DIMS-1); + const uint32_t ypitch = kMaxDims; + const uint32_t zpitch = kMaxDims*kMaxDims; if (!entry::processEvents(m_width, m_height, m_debug, m_reset, &m_mouseState) ) { @@ -564,6 +576,29 @@ public: showExampleDialog(this); + ImGui::SetNextWindowPos( + ImVec2(m_width - m_width / 5.0f - 10.0f, 10.0f) + , ImGuiCond_FirstUseEver + ); + ImGui::SetNextWindowSize( + ImVec2(m_width / 5.0f, m_height / 7.0f) + , ImGuiCond_FirstUseEver + ); + ImGui::Begin("Settings" + , NULL + , 0 + ); + static float iso = 0.75f; + ImGui::SliderFloat("ISO", &iso, 0.1f, 4.0f); + + static uint32_t numDims = kMaxDims; + ImGui::SliderInt("Size", (int*)&numDims, 8, kMaxDims); + ImGui::End(); + + const float numDimsF = float(numDims); + const float scale = kMaxDimsF/numDimsF; + const float invDim = 1.0f/(numDimsF-1.0f); + // Set view 0 default viewport. bgfx::setViewRect(0, 0, 0, uint16_t(m_width), uint16_t(m_height) ); @@ -604,27 +639,27 @@ public: // Allocate 32K vertices in transient vertex buffer. uint32_t maxVertices = (32<<10); bgfx::TransientVertexBuffer tvb; - bgfx::allocTransientVertexBuffer(&tvb, maxVertices, PosNormalColorVertex::ms_decl); + bgfx::allocTransientVertexBuffer(&tvb, maxVertices, PosNormalColorVertex::ms_layout); const uint32_t numSpheres = 16; float sphere[numSpheres][4]; for (uint32_t ii = 0; ii < numSpheres; ++ii) { - sphere[ii][0] = bx::sin(time*(ii*0.21f)+ii*0.37f) * (DIMS * 0.5f - 8.0f); - sphere[ii][1] = bx::sin(time*(ii*0.37f)+ii*0.67f) * (DIMS * 0.5f - 8.0f); - sphere[ii][2] = bx::cos(time*(ii*0.11f)+ii*0.13f) * (DIMS * 0.5f - 8.0f); - sphere[ii][3] = 1.0f/(2.0f + (bx::sin(time*(ii*0.13f) )*0.5f+0.5f)*2.0f); + sphere[ii][0] = bx::sin(time*(ii*0.21f)+ii*0.37f) * (kMaxDimsF * 0.5f - 8.0f); + sphere[ii][1] = bx::sin(time*(ii*0.37f)+ii*0.67f) * (kMaxDimsF * 0.5f - 8.0f); + sphere[ii][2] = bx::cos(time*(ii*0.11f)+ii*0.13f) * (kMaxDimsF * 0.5f - 8.0f); + sphere[ii][3] = 1.0f/(3.0f + (bx::sin(time*(ii*0.13f) )*0.5f+0.5f)*0.9f ); } profUpdate = bx::getHPCounter(); - for (uint32_t zz = 0; zz < DIMS; ++zz) + for (uint32_t zz = 0; zz < numDims; ++zz) { - for (uint32_t yy = 0; yy < DIMS; ++yy) + for (uint32_t yy = 0; yy < numDims; ++yy) { - uint32_t offset = (zz*DIMS+yy)*DIMS; + uint32_t offset = (zz*kMaxDims+yy)*kMaxDims; - for (uint32_t xx = 0; xx < DIMS; ++xx) + for (uint32_t xx = 0; xx < numDims; ++xx) { uint32_t xoffset = offset + xx; @@ -633,12 +668,12 @@ public: for (uint32_t ii = 0; ii < numSpheres; ++ii) { const float* pos = sphere[ii]; - float dx = pos[0] - (-DIMS*0.5f + float(xx) ); - float dy = pos[1] - (-DIMS*0.5f + float(yy) ); - float dz = pos[2] - (-DIMS*0.5f + float(zz) ); - float invr = pos[3]; - float dot = dx*dx + dy*dy + dz*dz; - dot *= invr*invr; + float dx = pos[0] - (-kMaxDimsF*0.5f + float(xx)*scale); + float dy = pos[1] - (-kMaxDimsF*0.5f + float(yy)*scale); + float dz = pos[2] - (-kMaxDimsF*0.5f + float(zz)*scale); + float invR = pos[3]; + float dot = dx*dx + dy*dy + dz*dz; + dot *= bx::square(invR); dist *= dot; dist += prod; @@ -654,25 +689,25 @@ public: profNormal = bx::getHPCounter(); - for (uint32_t zz = 1; zz < DIMS-1; ++zz) + for (uint32_t zz = 1; zz < numDims-1; ++zz) { - for (uint32_t yy = 1; yy < DIMS-1; ++yy) + for (uint32_t yy = 1; yy < numDims-1; ++yy) { - uint32_t offset = (zz*DIMS+yy)*DIMS; + uint32_t offset = (zz*kMaxDims+yy)*kMaxDims; - for (uint32_t xx = 1; xx < DIMS-1; ++xx) + for (uint32_t xx = 1; xx < numDims-1; ++xx) { uint32_t xoffset = offset + xx; Grid* grid = m_grid; - float normal[3] = + const bx::Vec3 normal = { grid[xoffset-1 ].m_val - grid[xoffset+1 ].m_val, grid[xoffset-ypitch].m_val - grid[xoffset+ypitch].m_val, grid[xoffset-zpitch].m_val - grid[xoffset+zpitch].m_val, }; - bx::vec3Norm(grid[xoffset].m_normal, normal); + bx::store(grid[xoffset].m_normal, bx::normalize(normal) ); } } } @@ -683,31 +718,31 @@ public: PosNormalColorVertex* vertex = (PosNormalColorVertex*)tvb.data; - for (uint32_t zz = 0; zz < DIMS-1 && numVertices+12 < maxVertices; ++zz) + for (uint32_t zz = 0; zz < numDims-1 && numVertices+12 < maxVertices; ++zz) { float rgb[6]; - rgb[2] = zz*invdim; - rgb[5] = (zz+1)*invdim; + rgb[2] = zz*invDim; + rgb[5] = (zz+1)*invDim; - for (uint32_t yy = 0; yy < DIMS-1 && numVertices+12 < maxVertices; ++yy) + for (uint32_t yy = 0; yy < numDims-1 && numVertices+12 < maxVertices; ++yy) { - uint32_t offset = (zz*DIMS+yy)*DIMS; + uint32_t offset = (zz*kMaxDims+yy)*kMaxDims; - rgb[1] = yy*invdim; - rgb[4] = (yy+1)*invdim; + rgb[1] = yy*invDim; + rgb[4] = (yy+1)*invDim; - for (uint32_t xx = 0; xx < DIMS-1 && numVertices+12 < maxVertices; ++xx) + for (uint32_t xx = 0; xx < numDims-1 && numVertices+12 < maxVertices; ++xx) { uint32_t xoffset = offset + xx; - rgb[0] = xx*invdim; - rgb[3] = (xx+1)*invdim; + rgb[0] = xx*invDim; + rgb[3] = (xx+1)*invDim; float pos[3] = { - -DIMS*0.5f + float(xx), - -DIMS*0.5f + float(yy), - -DIMS*0.5f + float(zz) + -kMaxDimsF*0.5f + float(xx)*scale, + -kMaxDimsF*0.5f + float(yy)*scale, + -kMaxDimsF*0.5f + float(zz)*scale, }; const Grid* grid = m_grid; @@ -722,7 +757,15 @@ public: &grid[xoffset ], }; - uint32_t num = triangulate( (uint8_t*)vertex, PosNormalColorVertex::ms_decl.getStride(), rgb, pos, val, 0.5f); + uint32_t num = triangulate( + (uint8_t*)vertex + , PosNormalColorVertex::ms_layout.getStride() + , rgb + , pos + , val + , iso + , scale + ); vertex += num; numVertices += num; } @@ -748,7 +791,7 @@ public: // Display stats. ImGui::SetNextWindowPos( - ImVec2(m_width - m_width / 5.0f - 10.0f, 10.0f) + ImVec2(m_width - m_width / 5.0f - 10.0f, m_height / 7.0f + 30.0f) , ImGuiCond_FirstUseEver ); ImGui::SetNextWindowSize( @@ -794,4 +837,9 @@ public: } // namespace -ENTRY_IMPLEMENT_MAIN(ExampleMetaballs, "02-metaball", "Rendering with transient buffers and embedding shaders."); +ENTRY_IMPLEMENT_MAIN( + ExampleMetaballs + , "02-metaball" + , "Rendering with transient buffers and embedding shaders." + , "https://bkaradzic.github.io/bgfx/examples.html#metaballs" + ); |