internal HolofunkSceneGraph( GraphicsDevice graphicsDevice, Vector2 canvasSize, Texture2D depthTexture, HolofunkTextureContent holofunkContent, HolofunkBass audio, Clock clock) : base() { m_content = holofunkContent; m_clock = clock; RootNode = new GroupNode(null, Transform.Identity, "Root"); m_canvasSize = canvasSize; m_background = new SpriteNode( RootNode, "Background", TextureFactory.ShadedCornerColor( graphicsDevice, canvasSize, Color.Black, new Color(0x10, 0x10, 0x10, 0x10), new Color(0x20, 0x20, 0x20, 0x20), new Color(0x20, 0x20, 0x20, 0x20))); m_background.LocalTransform = Transform.Identity; m_slide = new SpriteNode( RootNode, "Slide", Content.Slides[0]); m_slide.LocalTransform = new Transform(new Vector2(canvasSize.X - (int)(Content.Slides[0].Width * 1.1f), (canvasSize.Y - (int)Content.Slides[0].Height) / 2)); m_slide.SetSecondaryViewOption(SecondaryViewOption.PositionMirrored | SecondaryViewOption.TextureMirrored); // constructing the nodes adds them as children of the parent, in first-at-bottom Z order. SpriteNode depthNode = new SpriteNode( RootNode, "DepthImage", depthTexture); depthNode.LocalTransform = new Transform( Vector2.Zero, new Vector2((float)canvasSize.X / depthTexture.Width, (float)canvasSize.Y / depthTexture.Height)); // we want the depth node texture (only) to be mirrored about the center of the viewport depthNode.SetSecondaryViewOption(SecondaryViewOption.TextureMirrored); // B4CR: should this also be | PositionMirrored? m_audio = audio; // Center the textures. Vector2 origin = new Vector2(0.5f); m_statusText = new TextNode(RootNode, "StatusText"); m_statusText.SetSecondaryViewOption(SecondaryViewOption.Hidden); m_statusText.LocalTransform = new Transform(new Vector2(30f, 20f), new Vector2(MagicNumbers.StatusTextScale)); // make sure that first update pushes status text m_frameCount = MagicNumbers.StatusTextUpdateInterval - 1; m_beatNode = new BeatNode( RootNode, new Transform(new Vector2(m_canvasSize.X / 2, m_canvasSize.Y / 8 * 7)), "Root Beater", false, MagicNumbers.MeasureCircleScale, () => (long)((float)clock.ContinuousBeatDuration * 4), () => 0, () => Color.White); m_trackGroupNode = new GroupNode(RootNode, Transform.Identity, "Track group"); }
internal TrackNode( AParentSceneNode parent, Transform transform, string label, TextureContent content, int id, SparseSampleByteStream videoStream, bool fillInEveryBeat, Func<float> levelRatioFunc, Func<Color> circleColorFunc, Func<Color> videoColorFunc, Func<Duration<Sample>> trackDurationFunc, Func<int> initialBeatFunc, Func<Color> beatColorFunc, Func<float> videoRateFunc) : base(parent, transform, label) { m_id = id; m_levelRatioFunc = levelRatioFunc; m_circleColorFunc = circleColorFunc; m_videoColorFunc = videoColorFunc; m_beatColorFunc = beatColorFunc; m_videoRateFunc = videoRateFunc; // create this first so it is Z-ordered behind m_soundNode m_selectNode = new SpriteNode(this, "TrackHighlight", content.FilledCircle); m_selectNode.Color = new Color((byte)0x80, (byte)0x80, (byte)0x80, (byte)0x80); m_selectNode.Origin = new Vector2(0.5f); m_soundNode = new SpriteNode(this, "TrackSound", content.FilledCircle); m_soundNode.Color = Color.Blue; m_soundNode.Origin = new Vector2(0.5f); m_videoNode = new SpriteNode(this, "Headshot", content.NewDynamicTexture(MagicNumbers.HeadCaptureSize, MagicNumbers.HeadCaptureSize)); m_videoNode.Origin = new Vector2(0.5f); m_videoNode.LocalTransform = new Transform(new Vector2(0), new Vector2(MagicNumbers.HeadRatio)); m_videoNode.SetSecondaryViewOption(SecondaryViewOption.TextureMirrored); m_videoStream = videoStream; m_beatNode = new BeatNode( this, // move it down a bit from the sprite node new Transform(new Vector2(0, 75)), "TrackBeats", fillInEveryBeat, MagicNumbers.MeasureCircleScale, trackDurationFunc, initialBeatFunc, beatColorFunc); m_beatNode.SetSecondaryViewOption(SecondaryViewOption.PositionMirrored); // we always mirror track node position SetSecondaryViewOption(SecondaryViewOption.PositionMirrored); m_lastVideoFrame = default(Slice<Frame, byte>); }