Browse Source

texturev: Added image rotation.

Branimir Karadžić 8 years ago
parent
commit
f8739bc8e2
2 changed files with 53 additions and 10 deletions
  1. 52 9
      tools/texturev/texturev.cpp
  2. 1 1
      tools/texturev/vs_texture.sc

+ 52 - 9
tools/texturev/texturev.cpp

@@ -9,6 +9,8 @@
 #include <bx/os.h>
 #include <bx/string.h>
 #include <bx/uint32_t.h>
+#include <bx/fpumath.h>
+#include <bx/easing.h>
 #include <entry/entry.h>
 #include <entry/input.h>
 #include <entry/cmd.h>
@@ -98,10 +100,16 @@ static const InputBinding s_bindingView[] =
 
 	{ entry::Key::Slash,     entry::Modifier::None,       1, NULL, "view filter"             },
 
-	{ entry::Key::Key0,      entry::Modifier::None,       1, NULL, "view zoom 1.0\nview pan" },
+	{ entry::Key::Key0,      entry::Modifier::None,       1, NULL, "view zoom 1.0\n"
+	                                                               "view rotate 0\n"
+	                                                               "view pan\n"
+	                                                                                         },
 	{ 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::KeyZ,      entry::Modifier::None,       1, NULL, "view rotate -90"         },
+	{ entry::Key::KeyZ,      entry::Modifier::LeftShift,  1, NULL, "view rotate +90"         },
+
 	{ 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"          },
@@ -147,6 +155,7 @@ struct View
 		, m_posx(0.0f)
 		, m_posy(0.0f)
 		, m_zoom(1.0f)
+		, m_angle(0.0f)
 		, m_filter(true)
 		, m_alpha(false)
 		, m_help(false)
@@ -277,6 +286,29 @@ struct View
 					m_zoom = 1.0f;
 				}
 			}
+			else if (0 == bx::strCmp(_argv[1], "rotate") )
+			{
+				if (_argc >= 3)
+				{
+					float angle = (float)atof(_argv[2]);
+
+					if (_argv[2][0] == '+'
+					||  _argv[2][0] == '-')
+					{
+						m_angle += bx::toRad(angle);
+					}
+					else
+					{
+						m_angle = bx::toRad(angle);
+					}
+
+					m_angle = bx::fwrap(m_angle, bx::pi*2.0f);
+				}
+				else
+				{
+					m_angle = 0.0f;
+				}
+			}
 			else if (0 == bx::strCmp(_argv[1], "filter") )
 			{
 				if (_argc >= 3)
@@ -403,6 +435,7 @@ struct View
 	float    m_posx;
 	float    m_posy;
 	float    m_zoom;
+	float    m_angle;
 	bool     m_filter;
 	bool     m_alpha;
 	bool     m_help;
@@ -504,14 +537,15 @@ bool screenQuad(int32_t _x, int32_t _y, int32_t _width, uint32_t _height, uint32
 	return false;
 }
 
-struct Interpolator
+template<bx::LerpFn lerpT, bx::EaseFn easeT>
+struct InterpolatorT
 {
 	float from;
 	float to;
 	float duration;
 	int64_t offset;
 
-	Interpolator(float _value)
+	InterpolatorT(float _value)
 	{
 		reset(_value);
 	}
@@ -544,13 +578,16 @@ struct Interpolator
 			int64_t now = bx::getHPCounter();
 			float time = (float)(double(now - offset) / freq);
 			float lerp = bx::fclamp(time, 0.0, duration) / duration;
-			return bx::flerp(from, to, lerp);
+			return lerpT(from, to, easeT(lerp) );
 		}
 
 		return to;
 	}
 };
 
+typedef InterpolatorT<bx::flerp,     bx::easeInOutQuad>  Interpolator;
+typedef InterpolatorT<bx::angleLerp, bx::easeInOutCubic> InterpolatorAngle;
+
 void associate()
 {
 #if BX_PLATFORM_WINDOWS
@@ -782,6 +819,7 @@ int _main_(int _argc, char** _argv)
 	Interpolator mip(0.0f);
 	Interpolator layer(0.0f);
 	Interpolator zoom(1.0f);
+	InterpolatorAngle angle(0.0f);
 	Interpolator scale(1.0f);
 	Interpolator posx(0.0f);
 	Interpolator posy(0.0f);
@@ -1029,7 +1067,7 @@ int _main_(int _argc, char** _argv)
 
 			float px = posx.getValue();
 			float py = posy.getValue();
-			bx::mtxOrtho(ortho, px, px+width, py+height, py, 0.0f, 1000.0f);
+			bx::mtxOrtho(ortho, px-width/2, px+width/2, py+height/2, py-height/2, 0.0f, 1000.0f);
 			bgfx::setViewTransform(IMAGE_VIEW_ID, NULL, ortho);
 			bgfx::setViewRect(IMAGE_VIEW_ID, 0, 0, uint16_t(width), uint16_t(height) );
 
@@ -1042,19 +1080,24 @@ int _main_(int _argc, char** _argv)
 				, 0.1f
 				);
 			zoom.set(view.m_zoom, transitionTime);
+			angle.set(view.m_angle, transitionTime);
 
 			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(view.m_info.width  * ss)/2
+				, -int(view.m_info.height * ss)/2
+				,  int(view.m_info.width  * ss)
+				,  int(view.m_info.height * ss)
 				, view.m_abgr
 				);
 
+			float rotz[16];
+			bx::mtxRotateZ(rotz, angle.getValue() );
+			bgfx::setTransform(rotz);
+
 			float mtx[16];
 			bx::mtxRotateXY(mtx, 0.0f, time);
 			bgfx::setUniform(u_mtx, mtx);

+ 1 - 1
tools/texturev/vs_texture.sc

@@ -10,7 +10,7 @@ $output v_texcoord0, v_color0
 
 void main()
 {
-	gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0) );
+	gl_Position = mul(u_modelViewProj, vec4(a_position.xy, 0.0, 1.0) );
 	v_texcoord0 = a_texcoord0;
 	v_color0    = a_color0;
 }