private static unsafe Vector3 GetLightLook( SCN0Node node, int refLight, Matrix invCamMtx, ModelPanelViewport v, float frame, out bool specEnabled) { Vector3 start, end; LightType lightType; if (node?.LightGroup != null && refLight < node.LightGroup.Children.Count && refLight >= 0) { //SCN0 light exists SCN0LightNode lightNode = (SCN0LightNode)node.LightGroup.Children[refLight]; start = lightNode.GetStart(frame); end = lightNode.GetEnd(frame); lightType = lightNode.LightType; specEnabled = lightNode.SpecularEnabled; } else //Use the model viewer light settings by default { start = (Vector3)v._posLight; end = new Vector3(); lightType = LightType.Directional; specEnabled = true; } //Don't use if not enabled? //bool enabled = lightNode.GetEnabled(frame); Vector3 lgtLook = (end - start).Normalize(); bool temp = lgtLook._x == 0.0f && lgtLook._y == 0.0f && lgtLook._z == 0.0f; if (lightType != LightType.Spotlight && !specEnabled || temp) { // Use light position if they are diffuse light or if light has no direction. if (temp) { lgtLook = start; } lgtLook = -(invCamMtx.GetRotationMatrix() * lgtLook); if (lgtLook._x == 0.0f && lgtLook._y == 0.0f && lgtLook._z == 0.0f) { // If the light position is the origin, treat as if light is coming from the top of y-axis. lgtLook._y = -1.0f; } } else { lgtLook = invCamMtx.GetRotationMatrix() * lgtLook; } return(lgtLook); }
public void RootChanged() { ResourceNode node = _targetNode; if (node is ISCN0KeyframeHolder) { if (node is SCN0LightNode) { SCN0LightNode n = node as SCN0LightNode; interpolationViewer.FrameLimit = n.FrameCount; interpolationViewer.KeyRoot = n.GetKeys(SelectedMode)._keyRoot; } else if (node is SCN0FogNode) { SCN0FogNode n = node as SCN0FogNode; interpolationViewer.FrameLimit = n.FrameCount; interpolationViewer.KeyRoot = n.GetKeys(SelectedMode)._keyRoot; } else if (node is SCN0CameraNode) { SCN0CameraNode n = node as SCN0CameraNode; interpolationViewer.FrameLimit = n.FrameCount; interpolationViewer.KeyRoot = n.GetKeys(SelectedMode)._keyRoot; } } else if (node is IKeyframeHolder) { if (node is CHR0EntryNode) { CHR0EntryNode n = node as CHR0EntryNode; interpolationViewer.FrameLimit = n._keyframes._frameCount; interpolationViewer.KeyRoot = n._keyframes._keyRoots[SelectedMode]; } else if (node is SRT0TextureNode) { SRT0TextureNode n = node as SRT0TextureNode; interpolationViewer.FrameLimit = n._keyframes._frameCount; int i = SelectedMode; if (i == 2) { i = 3; } else if (i > 2) { i += 3; } interpolationViewer.KeyRoot = n._keyframes._keyRoots[i]; } } else if (node is IKeyframeArrayHolder) { comboBox1.Enabled = false; if (node is SHP0VertexSetNode) { SHP0VertexSetNode n = node as SHP0VertexSetNode; interpolationViewer.FrameLimit = n._keyframes._frameLimit; interpolationViewer.KeyRoot = n._keyframes._keyRoot; } } }
public void UpdateKeyframe(int x) { if (!Visible) { return; } _updating = true; if (_target is CHR0EntryNode || _target is SRT0TextureNode) { IKeyframeSource entry = _target as IKeyframeSource; for (int w = 0; w < listKeyframes.Items.Count; w++) { if (_target is CHR0EntryNode) { CHRAnimationFrame a = (CHRAnimationFrame)listKeyframes.Items[w]; if (a.Index == x) { CHRAnimationFrame r = ((CHR0EntryNode)entry).GetAnimFrame(x); if (r.HasKeys) { listKeyframes.Items[w] = r; } else { listKeyframes.Items.RemoveAt(w); } _updating = false; return; } } else if (_target is SRT0TextureNode) { SRTAnimationFrame a = (SRTAnimationFrame)listKeyframes.Items[w]; if (a.Index == x) { SRTAnimationFrame r = ((SRT0TextureNode)entry).GetAnimFrame(x); if (r.HasKeys) { listKeyframes.Items[w] = r; } else { listKeyframes.Items.RemoveAt(w); } _updating = false; return; } } } UpdateKeyframes(); } else if (_target is SHP0VertexSetNode) { SHP0VertexSetNode entry = _target as SHP0VertexSetNode; int w = 0; foreach (FloatKeyframe a in listKeyframes.Items) { if (a.Index == x) { KeyframeEntry e = entry.GetKeyframe(x); if (e != null) { listKeyframes.Items[w] = new FloatKeyframe(e); } else { listKeyframes.Items.RemoveAt(w); } _updating = false; return; } w++; } UpdateKeyframes(); } else if (_target is SCN0EntryNode) { if (_target is SCN0CameraNode) { SCN0CameraNode entry = _target as SCN0CameraNode; for (int w = 0; w < listKeyframes.Items.Count; w++) { CameraAnimationFrame a = (CameraAnimationFrame)listKeyframes.Items[w]; if (a.Index == x) { CameraAnimationFrame r = entry.GetAnimFrame(x); if (r.HasKeys) { listKeyframes.Items[w] = r; } else { listKeyframes.Items.RemoveAt(w); } _updating = false; return; } } UpdateKeyframes(); } else if (_target is SCN0LightNode) { SCN0LightNode entry = _target as SCN0LightNode; for (int w = 0; w < listKeyframes.Items.Count; w++) { LightAnimationFrame a = (LightAnimationFrame)listKeyframes.Items[w]; if (a.Index == x) { LightAnimationFrame r = entry.GetAnimFrame(x); if (r.HasKeys) { listKeyframes.Items[w] = r; } else { listKeyframes.Items.RemoveAt(w); } _updating = false; return; } } UpdateKeyframes(); } else if (_target is SCN0FogNode) { SCN0FogNode entry = _target as SCN0FogNode; for (int w = 0; w < listKeyframes.Items.Count; w++) { FogAnimationFrame a = (FogAnimationFrame)listKeyframes.Items[w]; if (a.Index == x) { FogAnimationFrame r = entry.GetAnimFrame(x); if (r.HasKeys) { listKeyframes.Items[w] = r; } else { listKeyframes.Items.RemoveAt(w); } _updating = false; return; } } UpdateKeyframes(); } } _updating = false; }
public void UpdateKeyframes() { listKeyframes.Items.Clear(); bool t = _updating; _updating = true; if (_target is CHR0EntryNode || _target is SRT0TextureNode) { IKeyframeSource entry = _target as IKeyframeSource; if (entry.FrameCount > 0) { if (_target is CHR0EntryNode) { CHRAnimationFrame a; for (int x = 0; x < entry.FrameCount; x++) { if ((a = ((CHR0EntryNode)entry).GetAnimFrame(x)).HasKeys) { listKeyframes.Items.Add(a); } } } else if (_target is SRT0TextureNode) { SRTAnimationFrame a; for (int x = 0; x < entry.FrameCount; x++) { if ((a = ((SRT0TextureNode)entry).GetAnimFrame(x)).HasKeys) { listKeyframes.Items.Add(a); } } } } } else if (_target is SHP0VertexSetNode) { SHP0VertexSetNode e = _target as SHP0VertexSetNode; if (e.FrameCount > 0) { for (KeyframeEntry entry = e.Keyframes._keyRoot._next; entry != e.Keyframes._keyRoot; entry = entry._next) { listKeyframes.Items.Add(new FloatKeyframe(entry)); } } } else if (_target is SCN0EntryNode) { if (_target is SCN0CameraNode) { CameraAnimationFrame a; SCN0CameraNode entry = _target as SCN0CameraNode; if (entry.FrameCount > 0) { for (int x = 0; x < entry.FrameCount; x++) { if ((a = entry.GetAnimFrame(x)).HasKeys) { listKeyframes.Items.Add(a); } } } } else if (_target is SCN0LightNode) { LightAnimationFrame a; SCN0LightNode entry = _target as SCN0LightNode; if (entry.FrameCount > 0) { for (int x = 0; x < entry.FrameCount; x++) { if ((a = entry.GetAnimFrame(x)).HasKeys) { listKeyframes.Items.Add(a); } } } } else if (_target is SCN0FogNode) { FogAnimationFrame a; SCN0FogNode entry = _target as SCN0FogNode; if (entry.FrameCount > 0) { for (int x = 0; x < entry.FrameCount; x++) { if ((a = entry.GetAnimFrame(x)).HasKeys) { listKeyframes.Items.Add(a); } } } } } _updating = t; }
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(); // } //} } }