Browse Source

Updated ImGuizmo.

Branimir Karadžić 8 years ago
parent
commit
b88b9b89e2

+ 4 - 1
3rdparty/ocornut-imgui/widgets/gizmo.h

@@ -96,7 +96,8 @@ void EditTransform(const Camera& camera, matrix_t& matrix)
 		ImGui::InputFloat("Scale Snap", &snap.x);
 		break;
 	}
-
+	ImGuiIO& io = ImGui::GetIO();
+	ImGuizmo::SetRect(0, 0, io.DisplaySize.x, io.DisplaySize.y);
 	ImGuizmo::Manipulate(camera.mView.m16, camera.mProjection.m16, mCurrentGizmoOperation, mCurrentGizmoMode, matrix.m16, NULL, useSnap ? &snap.x : NULL);
 }
 #endif
@@ -132,6 +133,8 @@ namespace ImGuizmo
 	void DecomposeMatrixToComponents(const float *matrix, float *translation, float *rotation, float *scale);
 	void RecomposeMatrixFromComponents(const float *translation, const float *rotation, const float *scale, float *matrix);
 
+	void SetRect(float x, float y, float width, float height);
+
 	// Render a cube with face color corresponding to face normal. Usefull for debug/tests
 	void DrawCube(const float *view, const float *projection, float *matrix);
 

+ 37 - 13
3rdparty/ocornut-imgui/widgets/gizmo.inl

@@ -20,12 +20,19 @@
 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 // SOFTWARE.
 
+#define IMGUI_DEFINE_MATH_OPERATORS
+
+// includes patches for multiview from
+// https://github.com/CedricGuillemet/ImGuizmo/issues/15
+
 namespace ImGuizmo
 {
    static const float ZPI = 3.14159265358979323846f;
    static const float RAD2DEG = (180.f / ZPI);
    static const float DEG2RAD = (ZPI / 180.f);
 
+   const float screenRotateSize = 0.06f;
+
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // utility and math
 
@@ -551,9 +558,13 @@ namespace ImGuizmo
 	  bool mbUsingBounds;
 	  matrix_t mBoundsMatrix;
 
-
       //
       int mCurrentOperation;
+
+	  float mX = 0.f;
+	  float mY = 0.f;
+	  float mWidth = 0.f;
+	  float mHeight = 0.f;
    };
 
    static Context gContext;
@@ -584,16 +595,16 @@ namespace ImGuizmo
 
    static ImVec2 worldToPos(const vec_t& worldPos, const matrix_t& mat)
    {
-      ImGuiIO& io = ImGui::GetIO();
-
       vec_t trans;
       trans.TransformPoint(worldPos, mat);
       trans *= 0.5f / trans.w;
       trans += makeVect(0.5f, 0.5f);
       trans.y = 1.f - trans.y;
-      trans.x *= io.DisplaySize.x;
-      trans.y *= io.DisplaySize.y;
-      return ImVec2(trans.x, trans.y);
+	  trans.x *= gContext.mWidth;
+	  trans.y *= gContext.mHeight;
+	  trans.x += gContext.mX;
+	  trans.y += gContext.mY;
+	  return ImVec2(trans.x, trans.y);
    }
 
    static void ComputeCameraRay(vec_t &rayOrigin, vec_t &rayDir)
@@ -603,9 +614,9 @@ namespace ImGuizmo
       matrix_t mViewProjInverse;
       mViewProjInverse.Inverse(gContext.mViewMat * gContext.mProjectionMat);
 
-      float mox = (io.MousePos.x / io.DisplaySize.x) * 2.f - 1.f;
-      float moy = (1.f - (io.MousePos.y / io.DisplaySize.y)) * 2.f - 1.f;
-
+	  float mox = ((io.MousePos.x - gContext.mX) / gContext.mWidth) * 2.f - 1.f;
+	  float moy = (1.f - ((io.MousePos.y - gContext.mY) / gContext.mHeight)) * 2.f - 1.f;
+	  
       rayOrigin.Transform(makeVect(mox, moy, 0.f, 1.f), mViewProjInverse);
       rayOrigin *= 1.f / rayOrigin.w;
       vec_t rayEnd;
@@ -625,12 +636,21 @@ namespace ImGuizmo
       return -(numer / denom);
    }
 
+   void SetRect(float x, float y, float width, float height)
+   {
+	   gContext.mX = x;
+	   gContext.mY = y;
+	   gContext.mWidth = width;
+	   gContext.mHeight = height;
+   }
+
    void BeginFrame()
    {
       ImGuiIO& io = ImGui::GetIO();
 
       ImGui::Begin("gizmo", NULL, io.DisplaySize, 0, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoBringToFrontOnFocus);
-      gContext.mDrawList = ImGui::GetWindowDrawList();
+
+	  gContext.mDrawList = ImGui::GetWindowDrawList();
 
       ImGui::End();
    }
@@ -726,6 +746,8 @@ namespace ImGuizmo
             for (int i = 0; i < 3; i++)
                colors[i + 1] = (type == (int)(SCALE_X + i)) ? selectionColor : directionColor[i];
             break;
+		 default:
+			 break;
          }
       }
       else
@@ -821,7 +843,6 @@ namespace ImGuizmo
    static void DrawRotationGizmo(int type)
    {
       ImDrawList* drawList = gContext.mDrawList;
-      ImGuiIO& io = ImGui::GetIO();
 
       // colors
       ImU32 colors[7];
@@ -845,7 +866,7 @@ namespace ImGuizmo
          }
          drawList->AddPolyline(circlePos, halfCircleSegmentCount, colors[3 - axis], false, 2, true);
       }
-      drawList->AddCircle(worldToPos(gContext.mModel.v.position, gContext.mViewProjection), 0.06f * io.DisplaySize.x, colors[0], 64);
+      drawList->AddCircle(worldToPos(gContext.mModel.v.position, gContext.mViewProjection), screenRotateSize * gContext.mHeight, colors[0], 64);
 
       if (gContext.mbUsing)
       {
@@ -951,6 +972,8 @@ namespace ImGuizmo
    static void DrawTranslationGizmo(int type)
    {
       ImDrawList* drawList = gContext.mDrawList;
+	  if (!drawList)
+		  return;
 
       // colors
       ImU32 colors[7];
@@ -1226,7 +1249,7 @@ namespace ImGuizmo
 
       vec_t deltaScreen = { io.MousePos.x - gContext.mScreenSquareCenter.x, io.MousePos.y - gContext.mScreenSquareCenter.y, 0.f, 0.f };
       float dist = deltaScreen.Length();
-      if (dist >= 0.058f * io.DisplaySize.x && dist < 0.062f * io.DisplaySize.x)
+	  if (dist >= (screenRotateSize - 0.002f) * gContext.mHeight && dist < (screenRotateSize + 0.002f) * gContext.mHeight)
          type = ROTATE_SCREEN;
 
       const vec_t planNormals[] = { gContext.mModel.v.right, gContext.mModel.v.up, gContext.mModel.v.dir};
@@ -1688,3 +1711,4 @@ namespace ImGuizmo
       }
    }
 };
+

+ 12 - 4
examples/32-particles/particles.cpp

@@ -105,7 +105,7 @@ struct Emitter
 		psUpdateEmitter(m_handle, &m_uniforms);
 	}
 
-	void imgui(const float* _view, const float* _proj)
+	void imgui()
 	{
 //		if (ImGui::CollapsingHeader("General") )
 		{
@@ -197,9 +197,10 @@ struct Emitter
 			ImGui::ColorEdit4("RGBA3", &m_uniforms.m_rgba[3], true);
 			ImGui::ColorEdit4("RGBA4", &m_uniforms.m_rgba[4], true);
 		}
+	}
 
-		ImGui::End();
-
+	void gizmo(const float* _view, const float* _proj)
+	{
 		float mtx[16];
 		bx::mtxSRT(mtx
 				, 1.0f, 1.0f, 1.0f
@@ -207,6 +208,9 @@ struct Emitter
 				, m_uniforms.m_position[0], m_uniforms.m_position[1], m_uniforms.m_position[2]
 				);
 
+		ImGuiIO& io = ImGui::GetIO();
+		ImGuizmo::SetRect(0, 0, io.DisplaySize.x, io.DisplaySize.y);
+
 		ImGuizmo::Manipulate(
 				_view
 				, _proj
@@ -388,7 +392,11 @@ class Particles : public entry::AppI
 				ImGui::RadioButton(name, &currentEmitter, ii);
 			}
 
-			m_emitter[currentEmitter].imgui(view, proj);
+			m_emitter[currentEmitter].imgui();
+
+			ImGui::End();
+
+			m_emitter[currentEmitter].gizmo(view, proj);
 
 			imguiEndFrame();