/// <summary> /// draw up in order every scene node when before drawing and draw scene. /// </summary> protected void DrawSort(RenderTracer renderTracer, bool ascending) { int nodeCount = 0; // fill in sort array. for (int i = 0; i < ChildCount; i++) { GameSceneNode child = GetChild(i) as GameSceneNode; if (child.Visible) { Matrix modelView = child.TransformedMatrix * renderTracer.View; sortArray[nodeCount].node = child; sortArray[nodeCount].depth = modelView.Translation.Length(); nodeCount++; } } // draw every scene node using quick sort algorithm. QuickSort(ref sortArray, 0, nodeCount - 1, ascending); // draw every sorted node in array. for (int i = 0; i < nodeCount; i++) { sortArray[i].node.Draw(renderTracer); sortArray[i].Clear(); } }
/// <summary> /// It draws itself and child nodes. /// When "Visible" is set to false, it will not get executed. /// </summary> public virtual void Draw(RenderTracer renderTracer) { // If not set to visible, it will not draw. if (Visible) { switch (orderWhenDraw) { case DrawOrderType.None: { // Draw itself OnDraw(renderTracer); // Draw each child node if (childList != null) { for (int i = 0; i < childList.Count; i++) { GameSceneNode gameSceneNode = childList[i] as GameSceneNode; if ((gameSceneNode != null) && gameSceneNode.Visible) { gameSceneNode.Draw(renderTracer); } } } } break; case DrawOrderType.Ascending: { // draw up in order DrawSort(renderTracer, true); } break; case DrawOrderType.Descending: { // draw up in order DrawSort(renderTracer, false); } break; } } }
public void Clear() { this.node = null; this.depth = 0.0f; }