private void RenderSystemAxis() { float nz = Camera.Frustum.NearZ; float x = 0.05f * Width; Vec3F pos = new Vec3F(x, Height - x, 0.0f); Matrix4F vp = Camera.ViewMatrix * Camera.ProjectionMatrix; pos = this.Unproject(pos, vp); if (Camera.Frustum.IsOrtho) { pos = pos + Camera.LookAt; } else { pos = pos + Camera.LookAt * (Camera.NearZ * 0.1f); } float s; Util.CalcAxisLengths(Camera, pos, out s); Matrix4F scale = new Matrix4F(); scale.Scale(s * 0.3f); Matrix4F trans = new Matrix4F(pos); Matrix4F xform = scale * trans; Util3D.RenderFlag = BasicRendererFlags.WireFrame | BasicRendererFlags.DisableDepthTest; Util3D.DrawX(xform, Color.Red); Util3D.DrawY(xform, Color.Green); Util3D.DrawZ(xform, Color.Blue); Matrix4F wvp = xform * vp; if (ViewType != ViewTypes.Left && ViewType != ViewTypes.Right) { Vec3F xaxis = new Vec3F(1, 0, 0); Point scPt = Project(wvp, xaxis); GameEngine.DrawText2D("X", Util3D.CaptionFont, scPt.X, scPt.Y, Color.Red); } if (ViewType != ViewTypes.Top && ViewType != ViewTypes.Bottom) { Vec3F yaxis = new Vec3F(0, 1.6f, 0); Point scPt = Project(wvp, yaxis); GameEngine.DrawText2D("Y", Util3D.CaptionFont, scPt.X, scPt.Y, Color.Green); } if (ViewType != ViewTypes.Front && ViewType != ViewTypes.Back) { Vec3F zaxis = new Vec3F(0, 0, 1); Point scPt = Project(wvp, zaxis); GameEngine.DrawText2D("Z", Util3D.CaptionFont, scPt.X, scPt.Y, Color.Blue); } }
public override void Render(ViewControl vc) { BasicRendererFlags solid = BasicRendererFlags.Solid | BasicRendererFlags.DisableDepthTest; BasicRendererFlags wire = BasicRendererFlags.WireFrame | BasicRendererFlags.DisableDepthTest; Matrix4F normWorld = GetManipulatorMatrix(); if (normWorld == null) { return; } Camera camera = vc.Camera; int axis = (int)m_hitRegion; // axis colors Color saveColor = m_axisColor[axis]; m_axisColor[axis] = m_highlightColor; Color xcolor = m_axisColor[(int)HitRegion.XAxis]; Color ycolor = m_axisColor[(int)HitRegion.YAxis]; Color zcolor = m_axisColor[(int)HitRegion.ZAxis]; Color nxcolor = m_axisColor[(int)HitRegion.NegXAxis]; Color nycolor = m_axisColor[(int)HitRegion.NegYAxis]; Color nzcolor = m_axisColor[(int)HitRegion.NegZAxis]; m_axisColor[axis] = saveColor; Vec3F deltaTrans = Vec3F.ZeroVector; if (m_hitRegion != HitRegion.None) { normWorld.Translation = HitMatrix.Translation; } Vec3F pos = normWorld.Translation; float s; Util.CalcAxisLengths(vc.Camera, pos, out s); Vec3F sv = new Vec3F(s, s, s); Vec3F axscale = new Vec3F(s, s, s); Vec3F negAxscale = new Vec3F(-s, -s, -s); bool negativeAxis = m_hitRegion == HitRegion.NegXAxis || m_hitRegion == HitRegion.NegYAxis || m_hitRegion == HitRegion.NegZAxis; if (negativeAxis) { negAxscale.X *= Math.Abs(m_scale.X); negAxscale.Y *= Math.Abs(m_scale.Y); negAxscale.Z *= Math.Abs(m_scale.Z); } else { axscale.X *= Math.Abs(m_scale.X); axscale.Y *= Math.Abs(m_scale.Y); axscale.Z *= Math.Abs(m_scale.Z); } Matrix4F scale = new Matrix4F(); scale.Scale(axscale); Matrix4F xform = scale * normWorld; Util3D.RenderFlag = wire; Util3D.DrawX(xform, xcolor); Util3D.DrawY(xform, ycolor); Util3D.DrawZ(xform, zcolor); scale.Scale(negAxscale); xform = scale * normWorld; Util3D.DrawX(xform, nxcolor); Util3D.DrawY(xform, nycolor); Util3D.DrawZ(xform, nzcolor); Vec3F handle = sv * HandleRatio; float handleWidth = handle.X / 2; scale.Scale(handle); Matrix4F trans = new Matrix4F(); Util3D.RenderFlag = solid; // X handle trans.Translation = new Vec3F(axscale.X - handleWidth, 0, 0); xform = scale * trans * normWorld; Util3D.DrawCube(xform, xcolor); // y handle trans.Translation = new Vec3F(0, axscale.Y - handleWidth, 0); xform = scale * trans * normWorld; Util3D.DrawCube(xform, ycolor); // z handle trans.Translation = new Vec3F(0, 0, axscale.Z - handleWidth); xform = scale * trans * normWorld; Util3D.DrawCube(xform, zcolor); // -x handle trans.Translation = new Vec3F(negAxscale.X + handleWidth, 0, 0); xform = scale * trans * normWorld; Util3D.DrawCube(xform, nxcolor); // -y handle trans.Translation = new Vec3F(0, negAxscale.Y + handleWidth, 0); xform = scale * trans * normWorld; Util3D.DrawCube(xform, nycolor); // -z handle trans.Translation = new Vec3F(0, 0, negAxscale.Z + handleWidth); xform = scale * trans * normWorld; Util3D.DrawCube(xform, nzcolor); }
public override void Render(ViewControl vc) { BasicRendererFlags solid = BasicRendererFlags.Solid | BasicRendererFlags.DisableDepthTest; BasicRendererFlags wire = BasicRendererFlags.WireFrame | BasicRendererFlags.DisableDepthTest; Matrix4F normWorld = GetManipulatorMatrix(); if (normWorld == null) { return; } Camera camera = vc.Camera; Vec3F pos = normWorld.Translation; float s; Util.CalcAxisLengths(vc.Camera, pos, out s); Vec3F sv = new Vec3F(s, s, s); Vec3F axscale = new Vec3F(Math.Abs(s * m_scale.X), Math.Abs(s * m_scale.Y), Math.Abs(s * m_scale.Z)); Color xcolor = (m_hitRegion == HitRegion.XAxis || m_hitRegion == HitRegion.FreeRect) ? Color.Gold : Color.Red; Color ycolor = (m_hitRegion == HitRegion.YAxis || m_hitRegion == HitRegion.FreeRect) ? Color.Gold : Color.Green; Color Zcolor = (m_hitRegion == HitRegion.ZAxis || m_hitRegion == HitRegion.FreeRect) ? Color.Gold : Color.Blue; Color freeRect = (m_hitRegion == HitRegion.FreeRect) ? Color.Gold : Color.White; Matrix4F scale = new Matrix4F(); scale.Scale(axscale); Matrix4F xform = scale * normWorld; Util3D.RenderFlag = wire; Util3D.DrawX(xform, xcolor); Util3D.DrawY(xform, ycolor); Util3D.DrawZ(xform, Zcolor); Vec3F rectScale = sv * FreeRectRatio; scale.Scale(rectScale); Matrix4F b = Util.CreateBillboard(pos, camera.WorldEye, camera.Up, camera.LookAt); Matrix4F recXform = Matrix4F.Multiply(scale, b); Util3D.DrawRect(recXform, freeRect); Vec3F handle = sv * HandleRatio; float handleWidth = handle.X / 2; scale.Scale(handle); Matrix4F trans = new Matrix4F(); trans.Translation = new Vec3F(axscale.X - handleWidth, 0, 0); xform = scale * trans * normWorld; Util3D.RenderFlag = solid; Util3D.DrawCube(xform, xcolor); trans.Translation = new Vec3F(0, axscale.Y - handleWidth, 0); xform = scale * trans * normWorld; Util3D.DrawCube(xform, ycolor); trans.Translation = new Vec3F(0, 0, axscale.Z - handleWidth); xform = scale * trans * normWorld; Util3D.DrawCube(xform, Zcolor); }
public void Render(Matrix4F normWorld, float s) { BasicRendererFlags solid = BasicRendererFlags.Solid | BasicRendererFlags.DisableDepthTest; BasicRendererFlags wire = BasicRendererFlags.WireFrame | BasicRendererFlags.DisableDepthTest; Color xcolor = (m_hitRegion == HitRegion.XAxis || m_hitRegion == HitRegion.XYSquare || m_hitRegion == HitRegion.XZSquare) ? Color.Gold : Color.Red; Color ycolor = (m_hitRegion == HitRegion.YAxis || m_hitRegion == HitRegion.XYSquare || m_hitRegion == HitRegion.YZSquare) ? Color.Gold : Color.Green; Color Zcolor = (m_hitRegion == HitRegion.ZAxis || m_hitRegion == HitRegion.XZSquare || m_hitRegion == HitRegion.YZSquare) ? Color.Gold : Color.Blue; Color XYx = m_hitRegion == HitRegion.XYSquare ? Color.Gold : Color.Red; Color XYy = m_hitRegion == HitRegion.XYSquare ? Color.Gold : Color.Green; Color XZx = m_hitRegion == HitRegion.XZSquare ? Color.Gold : Color.Red; Color XZz = m_hitRegion == HitRegion.XZSquare ? Color.Gold : Color.Blue; Color YZy = m_hitRegion == HitRegion.YZSquare ? Color.Gold : Color.Green; Color YZz = m_hitRegion == HitRegion.YZSquare ? Color.Gold : Color.Blue; Vec3F axScale = new Vec3F(s, s, s); Matrix4F axisXform = ComputeAxis(normWorld, axScale); Util3D.RenderFlag = wire; Util3D.DrawX(axisXform, xcolor); Util3D.DrawY(axisXform, ycolor); Util3D.DrawZ(axisXform, Zcolor); Matrix4F arrowHead = ComputeXhead(normWorld, s); Util3D.RenderFlag = solid; Util3D.DrawCone(arrowHead, xcolor); arrowHead = ComputeYhead(normWorld, s); Util3D.DrawCone(arrowHead, ycolor); arrowHead = ComputeZhead(normWorld, s); Util3D.DrawCone(arrowHead, Zcolor); Util3D.RenderFlag = wire; // draw xy rect. Matrix4F scale = new Matrix4F(); scale.Scale(axScale * SquareLength); Matrix4F trans = new Matrix4F(); trans.Translation = new Vec3F(0, s * SquareLength, 0); Matrix4F squareXform = scale * trans * normWorld; Util3D.DrawX(squareXform, XYy); trans.Translation = new Vec3F(s * SquareLength, 0, 0); squareXform = scale * trans * normWorld; Util3D.DrawY(squareXform, XYx); // draw xz rect. trans.Translation = new Vec3F(0, 0, s * SquareLength); squareXform = scale * trans * normWorld; Util3D.DrawX(squareXform, XZz); trans.Translation = new Vec3F(s * SquareLength, 0, 0); squareXform = scale * trans * normWorld; Util3D.DrawZ(squareXform, XZx); // draw yz trans.Translation = new Vec3F(0, s * SquareLength, 0); squareXform = scale * trans * normWorld; Util3D.DrawZ(squareXform, YZy); trans.Translation = new Vec3F(0, 0, s * SquareLength); squareXform = scale * trans * normWorld; Util3D.DrawY(squareXform, YZz); }