mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-17 20:52:36 +01:00
texturev: Added directory scan.
This commit is contained in:
@@ -8,12 +8,13 @@
|
||||
#include <bx/os.h>
|
||||
#include <bx/string.h>
|
||||
#include <bx/uint32_t.h>
|
||||
#include <dirent.h>
|
||||
#include <entry/entry.h>
|
||||
#include <entry/input.h>
|
||||
#include <entry/cmd.h>
|
||||
#include <bgfx_utils.h>
|
||||
|
||||
#include <dirent.h>
|
||||
|
||||
#include "vs_texture.bin.h"
|
||||
#include "fs_texture.bin.h"
|
||||
#include "vs_texture_cube.bin.h"
|
||||
@@ -21,12 +22,16 @@
|
||||
|
||||
#include <bx/crtimpl.h>
|
||||
|
||||
#include <tinystl/allocator.h>
|
||||
#include <tinystl/vector.h>
|
||||
#include <string>
|
||||
namespace stl = tinystl;
|
||||
|
||||
struct Binding
|
||||
{
|
||||
enum Enum
|
||||
{
|
||||
App,
|
||||
Dir,
|
||||
View,
|
||||
|
||||
Count
|
||||
@@ -40,32 +45,23 @@ static const InputBinding s_bindingApp[] =
|
||||
INPUT_BINDING_END
|
||||
};
|
||||
|
||||
static const InputBinding s_bindingDir[] =
|
||||
{
|
||||
{ entry::Key::Up, entry::Modifier::None, 1, NULL, "dir up" },
|
||||
{ entry::Key::Down, entry::Modifier::None, 1, NULL, "dir down" },
|
||||
{ entry::Key::PageUp, entry::Modifier::None, 1, NULL, "dir up" },
|
||||
{ entry::Key::PageDown, entry::Modifier::None, 1, NULL, "dir down" },
|
||||
{ entry::Key::Left, entry::Modifier::None, 1, NULL, "dir back" },
|
||||
{ entry::Key::Backspace, entry::Modifier::None, 1, NULL, "dir back" },
|
||||
{ entry::Key::Right, entry::Modifier::None, 1, NULL, "dir enter" },
|
||||
{ entry::Key::Return, entry::Modifier::None, 1, NULL, "dir enter" },
|
||||
|
||||
INPUT_BINDING_END
|
||||
};
|
||||
|
||||
static const InputBinding s_bindingView[] =
|
||||
{
|
||||
{ entry::Key::Comma, entry::Modifier::None, 1, NULL, "view mip prev" },
|
||||
{ entry::Key::Period, entry::Modifier::None, 1, NULL, "view mip next" },
|
||||
{ entry::Key::Comma, entry::Modifier::LeftShift, 1, NULL, "view mip" },
|
||||
{ entry::Key::Comma, entry::Modifier::RightShift, 1, NULL, "view mip" },
|
||||
{ entry::Key::Comma, entry::Modifier::None, 1, NULL, "view mip prev" },
|
||||
{ entry::Key::Period, entry::Modifier::None, 1, NULL, "view mip next" },
|
||||
{ entry::Key::Comma, entry::Modifier::LeftShift, 1, NULL, "view mip" },
|
||||
{ entry::Key::Comma, entry::Modifier::RightShift, 1, NULL, "view mip" },
|
||||
|
||||
{ entry::Key::Slash, entry::Modifier::None, 1, NULL, "view filter" },
|
||||
{ entry::Key::Slash, entry::Modifier::None, 1, NULL, "view filter" },
|
||||
|
||||
{ entry::Key::Key0, entry::Modifier::None, 1, NULL, "view zoom 1.0" },
|
||||
{ entry::Key::Plus, entry::Modifier::None, 1, NULL, "view zoom +0.1" },
|
||||
{ entry::Key::Minus, entry::Modifier::None, 1, NULL, "view zoom -0.1" },
|
||||
{ entry::Key::Key0, entry::Modifier::None, 1, NULL, "view zoom 1.0" },
|
||||
{ entry::Key::Plus, entry::Modifier::None, 1, NULL, "view zoom +0.1" },
|
||||
{ entry::Key::Minus, entry::Modifier::None, 1, NULL, "view zoom -0.1" },
|
||||
|
||||
{ entry::Key::Up, entry::Modifier::None, 1, NULL, "view file-up" },
|
||||
{ entry::Key::Down, entry::Modifier::None, 1, NULL, "view file-down" },
|
||||
{ entry::Key::PageUp, entry::Modifier::None, 1, NULL, "view file-pgup" },
|
||||
{ entry::Key::PageDown, entry::Modifier::None, 1, NULL, "view file-pgdown" },
|
||||
|
||||
INPUT_BINDING_END
|
||||
};
|
||||
@@ -73,7 +69,6 @@ static const InputBinding s_bindingView[] =
|
||||
static const char* s_bindingName[] =
|
||||
{
|
||||
"App",
|
||||
"Dir",
|
||||
"View",
|
||||
};
|
||||
BX_STATIC_ASSERT(Binding::Count == BX_COUNTOF(s_bindingName) );
|
||||
@@ -81,7 +76,6 @@ BX_STATIC_ASSERT(Binding::Count == BX_COUNTOF(s_bindingName) );
|
||||
static const InputBinding* s_binding[] =
|
||||
{
|
||||
s_bindingApp,
|
||||
s_bindingDir,
|
||||
s_bindingView,
|
||||
};
|
||||
BX_STATIC_ASSERT(Binding::Count == BX_COUNTOF(s_binding) );
|
||||
@@ -89,7 +83,8 @@ BX_STATIC_ASSERT(Binding::Count == BX_COUNTOF(s_binding) );
|
||||
struct View
|
||||
{
|
||||
View()
|
||||
: m_scaleFn(0)
|
||||
: m_fileIndex(0)
|
||||
, m_scaleFn(0)
|
||||
, m_mip(0)
|
||||
, m_zoom(1.0f)
|
||||
, m_filter(true)
|
||||
@@ -166,12 +161,76 @@ struct View
|
||||
m_filter ^= true;
|
||||
}
|
||||
}
|
||||
else if (0 == strcmp(_argv[1], "file-up") )
|
||||
{
|
||||
m_fileIndex = bx::uint32_satsub(m_fileIndex, 1);
|
||||
}
|
||||
else if (0 == strcmp(_argv[1], "file-down") )
|
||||
{
|
||||
uint32_t numFiles = bx::uint32_satsub(uint32_t(m_fileList.size() ), 1);
|
||||
++m_fileIndex;
|
||||
m_fileIndex = bx::uint32_min(m_fileIndex, numFiles);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void updateFileList(const char* _path, const char* _fileName = "")
|
||||
{
|
||||
std::string path = _path;
|
||||
|
||||
DIR* dir = opendir(_path);
|
||||
|
||||
if (NULL == dir)
|
||||
{
|
||||
path = ".";
|
||||
}
|
||||
|
||||
dir = opendir(path.c_str() );
|
||||
if (NULL != dir)
|
||||
{
|
||||
for (dirent* item = readdir(dir); NULL != item; item = readdir(dir) )
|
||||
{
|
||||
if (0 == (item->d_type & DT_DIR) )
|
||||
{
|
||||
const char* ext = strrchr(item->d_name, '.');
|
||||
if (NULL != ext)
|
||||
{
|
||||
if (0 == bx::stricmp(ext, ".dds")
|
||||
|| 0 == bx::stricmp(ext, ".jpg")
|
||||
|| 0 == bx::stricmp(ext, ".jpeg")
|
||||
|| 0 == bx::stricmp(ext, ".hdr")
|
||||
|| 0 == bx::stricmp(ext, ".ktx")
|
||||
|| 0 == bx::stricmp(ext, ".png")
|
||||
|| 0 == bx::stricmp(ext, ".pvr")
|
||||
|| 0 == bx::stricmp(ext, ".tga")
|
||||
)
|
||||
{
|
||||
if (0 == strcmp(_fileName, item->d_name) )
|
||||
{
|
||||
m_fileIndex = uint32_t(m_fileList.size() );
|
||||
}
|
||||
|
||||
std::string name = path;
|
||||
char ch = name.back();
|
||||
name += '/' == ch || '\\' == ch ? "" : "/";
|
||||
name += item->d_name;
|
||||
m_fileList.push_back(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
}
|
||||
}
|
||||
|
||||
typedef stl::vector<std::string> FileList;
|
||||
FileList m_fileList;
|
||||
|
||||
bgfx::TextureInfo m_info;
|
||||
uint32_t m_fileIndex;
|
||||
uint32_t m_scaleFn;
|
||||
uint32_t m_mip;
|
||||
float m_zoom;
|
||||
@@ -358,7 +417,6 @@ int _main_(int _argc, char** _argv)
|
||||
uint32_t reset = BGFX_RESET_VSYNC;
|
||||
|
||||
inputAddBindings(s_bindingName[Binding::App], s_binding[Binding::App]);
|
||||
inputAddBindings(s_bindingName[Binding::Dir], s_binding[Binding::Dir]);
|
||||
inputAddBindings(s_bindingName[Binding::View], s_binding[Binding::View]);
|
||||
|
||||
View view;
|
||||
@@ -423,7 +481,6 @@ int _main_(int _argc, char** _argv)
|
||||
bgfx::UniformHandle u_mtx = bgfx::createUniform("u_mtx", bgfx::UniformType::Mat4);
|
||||
bgfx::UniformHandle u_params = bgfx::createUniform("u_params", bgfx::UniformType::Vec4);
|
||||
|
||||
bgfx::TextureHandle texture = BGFX_INVALID_HANDLE;
|
||||
float speed = 0.37f;
|
||||
float time = 0.0f;
|
||||
|
||||
@@ -431,27 +488,65 @@ int _main_(int _argc, char** _argv)
|
||||
Interpolator zoom(1.0);
|
||||
Interpolator scale(1.0);
|
||||
|
||||
texture = loadTexture(_argv[1]
|
||||
, 0
|
||||
| BGFX_TEXTURE_U_CLAMP
|
||||
| BGFX_TEXTURE_V_CLAMP
|
||||
| BGFX_TEXTURE_W_CLAMP
|
||||
, 0
|
||||
, &view.m_info
|
||||
);
|
||||
const char* filePath = _argv[1];
|
||||
bool directory = false;
|
||||
|
||||
bx::FileInfo fi;
|
||||
bx::stat(filePath, fi);
|
||||
directory = bx::FileInfo::Directory == fi.m_type;
|
||||
|
||||
std::string path = filePath;
|
||||
if (!directory)
|
||||
{
|
||||
const char* fileName = directory ? filePath : bx::baseName(filePath);
|
||||
path.assign(filePath, fileName);
|
||||
view.updateFileList(path.c_str(), fileName);
|
||||
}
|
||||
else
|
||||
{
|
||||
view.updateFileList(path.c_str() );
|
||||
}
|
||||
|
||||
int exitcode = EXIT_SUCCESS;
|
||||
bgfx::TextureHandle texture = BGFX_INVALID_HANDLE;
|
||||
|
||||
if (!bgfx::isValid(texture) )
|
||||
if (view.m_fileList.empty() )
|
||||
{
|
||||
fprintf(stderr, "Unable to load '%s' texture.\n", _argv[1]);
|
||||
exitcode = EXIT_FAILURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
uint32_t fileIndex = 0;
|
||||
|
||||
entry::MouseState mouseState;
|
||||
while (!entry::processEvents(width, height, debug, reset, &mouseState) )
|
||||
{
|
||||
|
||||
if (!bgfx::isValid(texture)
|
||||
|| view.m_fileIndex != fileIndex)
|
||||
{
|
||||
if (bgfx::isValid(texture) )
|
||||
{
|
||||
bgfx::destroyTexture(texture);
|
||||
}
|
||||
|
||||
fileIndex = view.m_fileIndex;
|
||||
|
||||
filePath = view.m_fileList[view.m_fileIndex].c_str();
|
||||
entry::WindowHandle handle = { 0 };
|
||||
entry::setWindowTitle(handle, filePath);
|
||||
|
||||
texture = loadTexture(filePath
|
||||
, 0
|
||||
| BGFX_TEXTURE_U_CLAMP
|
||||
| BGFX_TEXTURE_V_CLAMP
|
||||
| BGFX_TEXTURE_W_CLAMP
|
||||
, 0
|
||||
, &view.m_info
|
||||
);
|
||||
}
|
||||
|
||||
int64_t now = bx::getHPCounter();
|
||||
static int64_t last = now;
|
||||
const int64_t frameTime = now - last;
|
||||
@@ -468,20 +563,21 @@ int _main_(int _argc, char** _argv)
|
||||
|
||||
bgfx::dbgTextClear();
|
||||
|
||||
scale.set(bx::fmin( float(width) / float(view.m_info.width)
|
||||
, float(height) / float(view.m_info.height)
|
||||
)
|
||||
, 0.1f
|
||||
);
|
||||
scale.set(
|
||||
bx::fmin( float(width) / float(view.m_info.width)
|
||||
, float(height) / float(view.m_info.height)
|
||||
)
|
||||
, 0.1f
|
||||
);
|
||||
zoom.set(view.m_zoom, 0.25);
|
||||
|
||||
float ss = scale.getValue() * zoom.getValue();
|
||||
|
||||
screenQuad( int(width - view.m_info.width * ss)/2
|
||||
, int(height - view.m_info.height * ss)/2
|
||||
, int(view.m_info.width * ss)
|
||||
, int(view.m_info.height * ss)
|
||||
);
|
||||
, int(height - view.m_info.height * ss)/2
|
||||
, int(view.m_info.width * ss)
|
||||
, int(view.m_info.height * ss)
|
||||
);
|
||||
|
||||
float mtx[16];
|
||||
bx::mtxRotateXY(mtx, 0.0f, time);
|
||||
@@ -493,19 +589,19 @@ int _main_(int _argc, char** _argv)
|
||||
bgfx::setUniform(u_params, params);
|
||||
|
||||
bgfx::setTexture(0
|
||||
, s_texColor
|
||||
, texture
|
||||
, view.m_filter
|
||||
? BGFX_TEXTURE_NONE
|
||||
: 0
|
||||
| BGFX_TEXTURE_MIN_POINT
|
||||
| BGFX_TEXTURE_MIP_POINT
|
||||
| BGFX_TEXTURE_MAG_POINT
|
||||
);
|
||||
, s_texColor
|
||||
, texture
|
||||
, view.m_filter
|
||||
? BGFX_TEXTURE_NONE
|
||||
: 0
|
||||
| BGFX_TEXTURE_MIN_POINT
|
||||
| BGFX_TEXTURE_MIP_POINT
|
||||
| BGFX_TEXTURE_MAG_POINT
|
||||
);
|
||||
bgfx::setState(0
|
||||
| BGFX_STATE_RGB_WRITE
|
||||
| BGFX_STATE_ALPHA_WRITE
|
||||
);
|
||||
| BGFX_STATE_RGB_WRITE
|
||||
| BGFX_STATE_ALPHA_WRITE
|
||||
);
|
||||
bgfx::submit(0, view.m_info.cubeMap ? textureCubeProgram : textureProgram);
|
||||
|
||||
bgfx::frame();
|
||||
|
||||
Reference in New Issue
Block a user