public unsafe void RenderScaleControl(TKContext context) { GLDisplayList axis = GetScaleControl(); //Enter local space Matrix m = Matrix.TransformMatrix(new Vector3(OrbRadius), new Vector3(), BoneLoc); GL.PushMatrix(); GL.MultMatrix((float *)&m); axis.Call(); GL.PopMatrix(); ModelPanel.ScreenText["X"] = ModelPanel.Project(new Vector3(_axisLDist + 0.1f, 0, 0) * m) - new Vector3(8.0f, 8.0f, 0); ModelPanel.ScreenText["Y"] = ModelPanel.Project(new Vector3(0, _axisLDist + 0.1f, 0) * m) - new Vector3(8.0f, 8.0f, 0); ModelPanel.ScreenText["Z"] = ModelPanel.Project(new Vector3(0, 0, _axisLDist + 0.1f) * m) - new Vector3(8.0f, 8.0f, 0); }
public unsafe void RenderTranslationControl(TKContext context, Vector3 position, float radius) { GLDisplayList axis = GetAxes(); //Enter local space Matrix m = Matrix.TransformMatrix(new Vector3(radius), new Vector3(), position); GL.PushMatrix(); GL.MultMatrix((float *)&m); axis.Call(); GL.PopMatrix(); ModelPanel.ScreenText["X"] = ModelPanel.Project(new Vector3(_axisLDist + 0.1f, 0, 0) * m) - new Vector3(8.0f, 8.0f, 0); ModelPanel.ScreenText["Y"] = ModelPanel.Project(new Vector3(0, _axisLDist + 0.1f, 0) * m) - new Vector3(8.0f, 8.0f, 0); ModelPanel.ScreenText["Z"] = ModelPanel.Project(new Vector3(0, 0, _axisLDist + 0.1f) * m) - new Vector3(8.0f, 8.0f, 0); }
private void SelectVerts(MDL0ObjectNode o) { foreach (Vertex3 v in o._manager._vertices) { //Project each vertex into screen coordinates. //Then check to see if the 2D coordinates lie within the selection box. //In Soviet Russia, vertices come to YOUUUUU Vector3 vec3 = v.WeightedPosition; Vector2 vec2 = (Vector2)ModelPanel.Project(vec3); Point start = ModelPanel._selStart, end = ModelPanel._selEnd; Vector2 min = new Vector2((float)Math.Min(start.X, end.X), (float)Math.Min(start.Y, end.Y)); Vector2 max = new Vector2((float)Math.Max(start.X, end.X), (float)Math.Max(start.Y, end.Y)); if ((vec2 <= max) && (vec2 >= min)) { if (Alt) { v._selected = false; if (_selectedVertices.Contains(v)) { _selectedVertices.Remove(v); } v._highlightColor = Color.Transparent; } else if (!v._selected) { v._selected = true; if (!Ctrl || !_selectedVertices.Contains(v)) { _selectedVertices.Add(v); } v._highlightColor = Color.Orange; } } } }
public void RenderObject(MDL0ObjectNode p, TKContext ctx, ModelPanel mainWindow, float maxDrawPriority) { if (p._render) { if (_dontRenderOffscreen) { Vector3 min = new Vector3(float.MaxValue); Vector3 max = new Vector3(float.MinValue); if (p._manager != null) foreach (Vertex3 vertex in p._manager._vertices) { Vector3 v = mainWindow.Project(vertex.WeightedPosition); min.Min(v); max.Max(v); } if (max._x < 0 || min._x > mainWindow.Size.Width || max._y < 0 || min._y > mainWindow.Size.Height) return; } if (_renderPolygons) { float polyOffset = 0.0f; //polyOffset -= p.DrawPriority; //polyOffset += maxDrawPriority; if (_renderWireframe) polyOffset += 1.0f; if (polyOffset != 0) { GL.Enable(EnableCap.PolygonOffsetFill); GL.PolygonOffset(1.0f, polyOffset); } else GL.Disable(EnableCap.PolygonOffsetFill); GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Fill); p.Render(ctx, false, mainWindow); } if (_renderWireframe) { GL.Disable(EnableCap.PolygonOffsetFill); GL.PolygonMode(MaterialFace.FrontAndBack, PolygonMode.Line); GL.LineWidth(0.5f); p.Render(ctx, true, mainWindow); } } }
public unsafe void RenderRotationControl(TKContext context, Vector3 position, float radius, Vector3 rotate) { Matrix m = Matrix.TransformMatrix(new Vector3(radius), position.LookatAngles(CamLoc) * Maths._rad2degf, position); GL.PushMatrix(); GL.MultMatrix((float *)&m); GLDisplayList sphere = context.GetCircleList(); GLDisplayList circle = context.GetRingList(); //Orb GL.Color4(0.7f, 0.7f, 0.7f, 0.15f); sphere.Call(); GL.Disable(EnableCap.DepthTest); //Container GL.Color4(0.4f, 0.4f, 0.4f, 1.0f); circle.Call(); //Circ if (_snapCirc || _hiCirc) { GL.Color4(Color.Yellow); } else { GL.Color4(1.0f, 0.8f, 0.5f, 1.0f); } GL.Scale(_circOrbScale, _circOrbScale, _circOrbScale); circle.Call(); //Pop GL.PopMatrix(); GL.Enable(EnableCap.DepthTest); //Enter local space m = Matrix.TransformMatrix(new Vector3(radius), rotate, position); ModelPanel.ScreenText["X"] = ModelPanel.Project(new Vector3(1.1f, 0, 0) * m) - new Vector3(8.0f, 8.0f, 0); ModelPanel.ScreenText["Y"] = ModelPanel.Project(new Vector3(0, 1.1f, 0) * m) - new Vector3(8.0f, 8.0f, 0); ModelPanel.ScreenText["Z"] = ModelPanel.Project(new Vector3(0, 0, 1.1f) * m) - new Vector3(8.0f, 8.0f, 0); GL.PushMatrix(); GL.MultMatrix((float *)&m); //Z if (_snapZ || _hiZ) { GL.Color4(Color.Yellow); } else { GL.Color4(0.0f, 0.0f, 1.0f, 1.0f); } circle.Call(); GL.Rotate(90.0f, 0.0f, 1.0f, 0.0f); //X if (_snapX || _hiX) { GL.Color4(Color.Yellow); } else { GL.Color4(Color.Red); } circle.Call(); GL.Rotate(90.0f, 1.0f, 0.0f, 0.0f); //Y if (_snapY || _hiY) { GL.Color4(Color.Yellow); } else { GL.Color4(Color.Green); } circle.Call(); //Pop GL.PopMatrix(); }
public unsafe void RenderSCN0Controls(TKContext context) { if (_scn0 == null) { return; } GL.Color4(Color.Blue); GL.Disable(EnableCap.Lighting); if (scn0Editor._light != null) { SCN0LightNode l = scn0Editor._light; Vector3 start = new Vector3( l.GetFrameValue(LightKeyframeMode.StartX, CurrentFrame - 1), l.GetFrameValue(LightKeyframeMode.StartY, CurrentFrame - 1), l.GetFrameValue(LightKeyframeMode.StartZ, CurrentFrame - 1)); Vector3 end = new Vector3( l.GetFrameValue(LightKeyframeMode.EndX, CurrentFrame - 1), l.GetFrameValue(LightKeyframeMode.EndY, CurrentFrame - 1), l.GetFrameValue(LightKeyframeMode.EndZ, CurrentFrame - 1)); //GL.Color4(Color.Coral); GL.Begin(BeginMode.Lines); GL.Vertex3(start._x, start._y, start._z); GL.Vertex3(end._x, end._y, end._z); GL.End(); //GL.Color4(Color.MediumPurple); //GL.Begin(BeginMode.LineStrip); //for (int i = 0; i < MaxFrame; i++) // GL.Vertex3(l.GetFrameValue(LightKeyframeMode.StartX, i), l.GetFrameValue(LightKeyframeMode.StartY, i), l.GetFrameValue(LightKeyframeMode.StartZ, i)); //GL.End(); //GL.Color4(Color.ForestGreen); //GL.Begin(BeginMode.LineStrip); //for (int i = 0; i < MaxFrame; i++) // GL.Vertex3(l.GetFrameValue(LightKeyframeMode.EndX, i), l.GetFrameValue(LightKeyframeMode.EndY, i), l.GetFrameValue(LightKeyframeMode.EndZ, i)); //GL.End(); ModelPanel.ScreenText["Light Start"] = ModelPanel.Project(start); ModelPanel.ScreenText["Light End"] = ModelPanel.Project(end); //Render these if selected //if (_lightStartSelected || _lightEndSelected) //{ // Matrix m; // float s1 = start.TrueDistance(CamLoc) / _orbRadius * 0.1f; // float e1 = end.TrueDistance(CamLoc) / _orbRadius * 0.1f; // GLDisplayList axis = GetAxes(); // if (_lightStartSelected) // { // m = Matrix.TransformMatrix(new Vector3(s1), new Vector3(), start); // GL.PushMatrix(); // GL.MultMatrix((float*)&m); // axis.Call(); // GL.PopMatrix(); // } // if (_lightEndSelected) // { // m = Matrix.TransformMatrix(new Vector3(e1), new Vector3(), end); // GL.PushMatrix(); // GL.MultMatrix((float*)&m); // axis.Call(); // GL.PopMatrix(); // } //} } if (scn0Editor._camera != null) { SCN0CameraNode c = scn0Editor._camera; Vector3 start = new Vector3( c.GetFrameValue(CameraKeyframeMode.PosX, CurrentFrame - 1), c.GetFrameValue(CameraKeyframeMode.PosY, CurrentFrame - 1), c.GetFrameValue(CameraKeyframeMode.PosZ, CurrentFrame - 1)); Vector3 end = new Vector3( c.GetFrameValue(CameraKeyframeMode.AimX, CurrentFrame - 1), c.GetFrameValue(CameraKeyframeMode.AimY, CurrentFrame - 1), c.GetFrameValue(CameraKeyframeMode.AimZ, CurrentFrame - 1)); //GL.Color4(Color.Blue); GL.Begin(BeginMode.Lines); GL.Vertex3(start._x, start._y, start._z); GL.Vertex3(end._x, end._y, end._z); GL.End(); //GL.Color4(Color.OrangeRed); //GL.Begin(BeginMode.LineStrip); //for (int i = 0; i < MaxFrame; i++) // GL.Vertex3(c.GetFrameValue(CameraKeyframeMode.PosX, i), c.GetFrameValue(CameraKeyframeMode.PosY, i), c.GetFrameValue(CameraKeyframeMode.PosZ, i)); //GL.End(); //GL.Color4(Color.SkyBlue); //GL.Begin(BeginMode.LineStrip); //for (int i = 0; i < MaxFrame; i++) // GL.Vertex3(c.GetFrameValue(CameraKeyframeMode.AimX, i), c.GetFrameValue(CameraKeyframeMode.AimY, i), c.GetFrameValue(CameraKeyframeMode.AimZ, i)); //GL.End(); ModelPanel.ScreenText["Camera Position"] = ModelPanel.Project(start); ModelPanel.ScreenText["Camera Aim"] = ModelPanel.Project(end); GL.Color4(Color.Black); //Render these if selected //if (_lightStartSelected || _lightEndSelected) //{ // Matrix m; // float s = start.TrueDistance(CamLoc) / _orbRadius * 0.1f; // float e = end.TrueDistance(CamLoc) / _orbRadius * 0.1f; // GLDisplayList axis = GetAxes(); // if (_lightStartSelected) // { // m = Matrix.TransformMatrix(new Vector3(s), new Vector3(), start); // GL.PushMatrix(); // GL.MultMatrix((float*)&m); // axis.Call(); // GL.PopMatrix(); // } // if (_lightEndSelected) // { // m = Matrix.TransformMatrix(new Vector3(e), new Vector3(), end); // GL.PushMatrix(); // GL.MultMatrix((float*)&m); // axis.Call(); // GL.PopMatrix(); // } //} } }
internal unsafe void Render(TKContext ctx, ModelPanel mainWindow) { if (!_render) return; if (_boneColor != Color.Transparent) GL.Color4(_boneColor.R / 255.0f, _boneColor.G / 255.0f, _boneColor.B / 255.0f, 1.0f); else GL.Color4(DefaultBoneColor.R / 255.0f, DefaultBoneColor.G / 255.0f, DefaultBoneColor.B / 255.0f, 1.0f); //GL.LineWidth(1.0f); //Draw name if selected if (mainWindow != null && _nodeColor != Color.Transparent) { Vector3 pt = _frameMatrix.GetPoint(); Vector3 v2 = mainWindow.Project(pt); mainWindow.ScreenText[Name] = new Vector3(v2._x, v2._y - 9.0f, v2._z); } Vector3 v1 = (_parent == null || !(_parent is MDL0BoneNode)) ? new Vector3(0.0f) : ((MDL0BoneNode)_parent)._frameMatrix.GetPoint(); Vector3 v = _frameMatrix.GetPoint(); GL.Begin(BeginMode.Lines); GL.Vertex3((float*)&v1); GL.Vertex3((float*)&v); GL.End(); GL.PushMatrix(); fixed (Matrix* m = &_frameMatrix) GL.MultMatrix((float*)m); //Render node GLDisplayList ndl = ctx.FindOrCreate<GLDisplayList>("BoneNodeOrb", CreateNodeOrb); if (_nodeColor != Color.Transparent) GL.Color4(_nodeColor.R / 255.0f, _nodeColor.G / 255.0f, _nodeColor.B / 255.0f, 1.0f); else GL.Color4(DefaultNodeColor.R / 255.0f, DefaultNodeColor.G / 255.0f, DefaultNodeColor.B / 255.0f, 1.0f); ndl.Call(); DrawNodeOrients(); if (BillboardSetting != 0 && mainWindow != null) { Vector3 center = _frameMatrix.GetPoint(); Vector3 cam = mainWindow._camera.GetPoint(); Matrix m2 = new Matrix(); Vector3 scale = new Vector3(1); Vector3 rot = new Vector3(); Vector3 trans = new Vector3(); if (BillboardSetting == BillboardFlags.PerspectiveSTD) rot = center.LookatAngles(cam) * Maths._rad2degf; m2 = Matrix.TransformMatrix(scale, rot, trans); GL.PushMatrix(); GL.MultMatrix((float*)&m2); } if (BillboardSetting != 0 && mainWindow != null) GL.PopMatrix(); GL.PopMatrix(); //Render children foreach (MDL0BoneNode n in Children) n.Render(ctx, mainWindow); }