Browse Source

texturev: Added panning.

Branimir Karadžić 8 years ago
parent
commit
d5eb3fb08d
1 changed files with 102 additions and 38 deletions
  1. 102 38
      tools/texturev/texturev.cpp

+ 102 - 38
tools/texturev/texturev.cpp

@@ -87,33 +87,33 @@ static const InputBinding s_bindingApp[] =
 
 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\nview pan" },
+	{ 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" },
+	{ 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"        },
 
-	{ entry::Key::Left,      entry::Modifier::None,       1, NULL, "view layer prev"  },
-	{ entry::Key::Right,     entry::Modifier::None,       1, NULL, "view layer next"  },
+	{ entry::Key::Left,      entry::Modifier::None,       1, NULL, "view layer prev"         },
+	{ entry::Key::Right,     entry::Modifier::None,       1, NULL, "view layer next"         },
 
-	{ entry::Key::KeyR,      entry::Modifier::None,       1, NULL, "view rgb r"       },
-	{ entry::Key::KeyG,      entry::Modifier::None,       1, NULL, "view rgb g"       },
-	{ entry::Key::KeyB,      entry::Modifier::None,       1, NULL, "view rgb b"       },
-	{ entry::Key::KeyA,      entry::Modifier::None,       1, NULL, "view rgb a"       },
+	{ entry::Key::KeyR,      entry::Modifier::None,       1, NULL, "view rgb r"              },
+	{ entry::Key::KeyG,      entry::Modifier::None,       1, NULL, "view rgb g"              },
+	{ entry::Key::KeyB,      entry::Modifier::None,       1, NULL, "view rgb b"              },
+	{ entry::Key::KeyA,      entry::Modifier::None,       1, NULL, "view rgb a"              },
 
-	{ entry::Key::KeyH,      entry::Modifier::None,       1, NULL, "view help"        },
+	{ entry::Key::KeyH,      entry::Modifier::None,       1, NULL, "view help"               },
 
-	{ entry::Key::KeyS,      entry::Modifier::None,       1, NULL, "view sdf"         },
+	{ entry::Key::KeyS,      entry::Modifier::None,       1, NULL, "view sdf"                },
 
 	INPUT_BINDING_END
 };
@@ -140,6 +140,8 @@ struct View
 		, m_mip(0)
 		, m_layer(0)
 		, m_abgr(UINT32_MAX)
+		, m_posx(0.0f)
+		, m_posy(0.0f)
 		, m_zoom(1.0f)
 		, m_filter(true)
 		, m_alpha(false)
@@ -155,20 +157,20 @@ struct View
 	{
 		if (_argc >= 2)
 		{
-			if (0 == strcmp(_argv[1], "mip") )
+			if (0 == bx::strCmp(_argv[1], "mip") )
 			{
 				if (_argc >= 3)
 				{
 					uint32_t mip = m_mip;
-					if (0 == strcmp(_argv[2], "next") )
+					if (0 == bx::strCmp(_argv[2], "next") )
 					{
 						++mip;
 					}
-					else if (0 == strcmp(_argv[2], "prev") )
+					else if (0 == bx::strCmp(_argv[2], "prev") )
 					{
 						--mip;
 					}
-					else if (0 == strcmp(_argv[2], "last") )
+					else if (0 == bx::strCmp(_argv[2], "last") )
 					{
 						mip = INT32_MAX;
 					}
@@ -184,20 +186,20 @@ struct View
 					m_mip = 0;
 				}
 			}
-			if (0 == strcmp(_argv[1], "layer") )
+			if (0 == bx::strCmp(_argv[1], "layer") )
 			{
 				if (_argc >= 3)
 				{
 					uint32_t layer = m_layer;
-					if (0 == strcmp(_argv[2], "next") )
+					if (0 == bx::strCmp(_argv[2], "next") )
 					{
 						++layer;
 					}
-					else if (0 == strcmp(_argv[2], "prev") )
+					else if (0 == bx::strCmp(_argv[2], "prev") )
 					{
 						--layer;
 					}
-					else if (0 == strcmp(_argv[2], "last") )
+					else if (0 == bx::strCmp(_argv[2], "last") )
 					{
 						layer = INT32_MAX;
 					}
@@ -213,7 +215,42 @@ struct View
 					m_layer = 0;
 				}
 			}
-			else if (0 == strcmp(_argv[1], "zoom") )
+			else if (0 == bx::strCmp(_argv[1], "pan") )
+			{
+				if (_argc >= 3)
+				{
+					if (_argc >= 4)
+					{
+						float yy = (float)atof(_argv[3]);
+						if (_argv[3][0] == '+'
+						||  _argv[3][0] == '-')
+						{
+							m_posy += yy;
+						}
+						else
+						{
+							m_posy = yy;
+						}
+					}
+
+					float xx = (float)atof(_argv[2]);
+					if (_argv[2][0] == '+'
+					||  _argv[2][0] == '-')
+					{
+						m_posx += xx;
+					}
+					else
+					{
+						m_posx = xx;
+					}
+				}
+				else
+				{
+					m_posx = 0.0f;
+					m_posy = 0.0f;
+				}
+			}
+			else if (0 == bx::strCmp(_argv[1], "zoom") )
 			{
 				if (_argc >= 3)
 				{
@@ -236,7 +273,7 @@ struct View
 					m_zoom = 1.0f;
 				}
 			}
-			else if (0 == strcmp(_argv[1], "filter") )
+			else if (0 == bx::strCmp(_argv[1], "filter") )
 			{
 				if (_argc >= 3)
 				{
@@ -247,17 +284,17 @@ struct View
 					m_filter ^= true;
 				}
 			}
-			else if (0 == strcmp(_argv[1], "file-up") )
+			else if (0 == bx::strCmp(_argv[1], "file-up") )
 			{
 				m_fileIndex = bx::uint32_satsub(m_fileIndex, 1);
 			}
-			else if (0 == strcmp(_argv[1], "file-down") )
+			else if (0 == bx::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);
 			}
-			else if (0 == strcmp(_argv[1], "rgb") )
+			else if (0 == bx::strCmp(_argv[1], "rgb") )
 			{
 				if (_argc >= 3)
 				{
@@ -284,11 +321,11 @@ struct View
 					m_alpha = false;
 				}
 			}
-			else if (0 == strcmp(_argv[1], "sdf") )
+			else if (0 == bx::strCmp(_argv[1], "sdf") )
 			{
 				m_sdf ^= true;
 			}
-			else if (0 == strcmp(_argv[1], "help") )
+			else if (0 == bx::strCmp(_argv[1], "help") )
 			{
 				m_help ^= true;
 			}
@@ -331,7 +368,7 @@ struct View
 
 						if (supported)
 						{
-							if (0 == strcmp(_fileName, item->d_name) )
+							if (0 == bx::strCmp(_fileName, item->d_name) )
 							{
 								m_fileIndex = uint32_t(m_fileList.size() );
 							}
@@ -359,6 +396,8 @@ struct View
 	uint32_t m_mip;
 	uint32_t m_layer;
 	uint32_t m_abgr;
+	float    m_posx;
+	float    m_posy;
 	float    m_zoom;
 	bool     m_filter;
 	bool     m_alpha;
@@ -730,6 +769,8 @@ int _main_(int _argc, char** _argv)
 	Interpolator layer(0.0f);
 	Interpolator zoom(1.0f);
 	Interpolator scale(1.0f);
+	Interpolator posx(0.0f);
+	Interpolator posy(0.0f);
 
 	const char* filePath = _argc < 2 ? "" : _argv[1];
 	bool directory = false;
@@ -768,6 +809,7 @@ int _main_(int _argc, char** _argv)
 	else
 	{
 		uint32_t fileIndex = 0;
+		bool dragging = false;
 
 		entry::MouseState mouseStatePrev;
 		entry::MouseState mouseState;
@@ -800,6 +842,21 @@ int _main_(int _argc, char** _argv)
 				cmdExec(exec);
 			}
 
+			if (mouseState.m_buttons[entry::MouseButton::Left] != mouseStatePrev.m_buttons[entry::MouseButton::Left])
+			{
+				dragging = !!mouseState.m_buttons[entry::MouseButton::Left];
+			}
+
+			if (dragging)
+			{
+				float xDelta = float(mouseStatePrev.m_mx - mouseState.m_mx);
+				float yDelta = float(mouseStatePrev.m_my - mouseState.m_my);
+
+				char exec[64];
+				bx::snprintf(exec, BX_COUNTOF(exec), "view pan %+f %+f", xDelta, yDelta);
+				cmdExec(exec);
+			}
+
 			mouseStatePrev = mouseState;
 
 			if (help == false
@@ -924,8 +981,15 @@ int _main_(int _argc, char** _argv)
 
 			time += (float)(frameTime*speed/freq);
 
+			float transitionTime = dragging ? 0.0f : 0.25f;
+
+			posx.set(view.m_posx, transitionTime);
+			posy.set(view.m_posy, transitionTime);
+
 			float ortho[16];
-			bx::mtxOrtho(ortho, 0.0f, (float)width, (float)height, 0.0f, 0.0f, 1000.0f);
+			float px = posx.getValue();
+			float py = posy.getValue();
+			bx::mtxOrtho(ortho, px, px+width, py+height, py, 0.0f, 1000.0f);
 			bgfx::setViewTransform(0, NULL, ortho);
 			bgfx::setViewRect(0, 0, 0, uint16_t(width), uint16_t(height) );
 			bgfx::touch(0);
@@ -938,7 +1002,7 @@ int _main_(int _argc, char** _argv)
 				)
 				, 0.1f
 				);
-			zoom.set(view.m_zoom, 0.25);
+			zoom.set(view.m_zoom, transitionTime);
 
 			float ss = scale.getValue() * zoom.getValue();